本文档的目标用户为支付宝充电桩业务接入端应用开发者。
本文档旨在说明支付宝IOT云端提供的充电桩交易日志接入方法以及第三方授权使用方法。
用于上传运营商充电桩基础信息。
充电桩数据回流模板名称(template_name):chargePile。
字段标识 | 名称 | 必填 | 格式 | 可选项 | 描述 | demo |
---|---|---|---|---|---|---|
pile_id | 充电桩ID | 是 | 运营商体系内充电桩的ID | 2891839 | ||
type | 行业 | 是 | [EV,BC] EV-电瓶车充换电 BC-电动车充换电 |
电瓶车充换电、电动车充换电 | EV | |
pile_type | 充电桩类型 | 是 | [CP,SC,DC,AC] CP-充电桩 SC-换电柜 DC-直流桩 AC-交流桩 |
电瓶车充换电:充电桩、换电柜;电动车充换电:直流桩、交流桩 | DC | |
socket_num | 充电桩插座数 | 是 | 整数 | 充电桩包含插座数 | 8 | |
site_id | 所属站点ID | 是 | 在运营商系统中标明的站点ID | s8298394 | ||
site_name | 所属站点名称 | 否 | 在运营商系统中标明的站点名称 | xxx站点 | ||
site_type | 所属站点类型 | 否 | [GROUND,UNDER,OTHER] GROUND-地面 UNDER-底下 OTHER-其他 |
充电桩所在位置,地面,地下,其他 | GROUND | |
province_code | 所属站点省编码 | 否 | 站点所在省的编码,请传入国标码 | 330000 | ||
city_code | 所属站点市编码 | 否 | 站点所在市的编码,请传入国标码 | 330100 | ||
area_code | 所属站点区编码 | 否 | 站点所在区的编码,请传入国标码 | 330106 | ||
address | 所属站点详细地址 | 否 | 除了省市区以外的详细地址描述,比如:池华街22号XX小区 | xxx路xxx街xx号 | ||
channel_biz_name | 渠道商名称 | 否 | 该充电桩的渠道商的名称 | xx渠道商 | ||
property_name | 物业名称 | 否 | 该插座的物业的名称 | xx物业 | ||
site_longitude | 所属站点经度 | 否 | 小数 | 站点经度 | 120.15 | |
site_latitude | 所属站点纬度 | 否 | 小数 | 站点纬度 | 30.28 | |
pile_status | 充电桩状态 | 是 | [BIND,UNBIND] BIND-已和站点绑定 UNBIND-已经和站点解绑 |
充电桩状态,已绑定到站点或从站点解绑 | UNBIND | |
ext_info | 扩展字段 | 否 | 部分运营商如果要传入其他数据,可以通过这个扩展字段传入,特殊字段: test 是否测试数据 Y-测试数据,正常数据不需要填写 |
{‘manufactor’:‘xx公司’} |
TIPS:桩状态有变化是应重新回流充电桩数据。
用户充电行为的数据回流(不包含用户充值行为)
充电订单数据回流模板名称(template_name):chargeOrder。
字段标识 | 名称 | 必填 | 格式 | 可选项 | 描述 | demo |
---|---|---|---|---|---|---|
doc_type | 订单类型 | 是 | [Charge] Charge-充电模式 |
充电订单类型,固定值Charge | Charge | |
order_no | 运营商订单号 | 是 | 在运营商端的订单号 | OD2018110283948294948 | ||
charge_time | 充电开始时间 | 是 | yyyy-MM-DD HH:mm:ss | 充电行为发生时间,可早于当前时间,用于补齐历史数据,精确到秒 | 2018-12-01 10:10:10 | |
site_id | 所属站点ID | 否 | 在运营商系统中标明的站点ID | s8298394 | ||
pile_no | 充电桩编号 | 否 | 在运营商系统中充电桩的编号 | 2891839 | ||
socket_no | 充电插座编号 | 否 | 在运营商系统中充电插座的编号 | 8 | ||
user_select_duration | 用户选择时长 | 否 | 整数 | [0,1,2,……,N] 0-充满即停 1-充电1分钟 2-充电2分钟 N-充电N分钟 |
两种类型:充满即停 或者 N分钟 | 60 |
actual_duration | 实际充电时长 | 否 | 整数 | ’实际充电时长,开始充电到断电的时间(断电场景包括充满断电、未充满但是到时间点了断电、用户主动拔插座断电等),单位 分钟 | 51 | |
actual_electricity | 实际消耗电量 | 否 | 小数 | 本次充电实际消耗了多少电量,单位 kW·h | 16.5 | |
charge_amount | 实际消费金额 | 否 | 小数 | 本次充电实际消耗的订单金额(非用户实付金额),单位 元 | 17.40 | |
charging_mode | 充电模式 | 是 | [ThirdPay,Balance,Quantity] ThirdPay-第三方支付 Balance-余额模式 Quantity-包量模式 |
第三方支付模式(调起第三方支付的模式,含余额+第三方支付混合支付的订单)、余额模式(本订单完全由用户在运营商系统中的储值支付,包括运营商体系内的红包、券等)、包量模式(运营商体系内的月卡、次卡、年卡等) | ThirdPay | |
pay_channel | 支付渠道 | charging_mode=“ThirdPay”时必填 | [Alipay,Weixin,UnionPay,Other] Alipay-支付宝 Weixin-微信 UnionPay-银联 Other-其他 |
支付渠道,充电模式为第三方支付时,必填 | Alipay | |
client | 客户端 | 是 | [App,Alipay,Weixin,Card,Other] App-客户端程序 Alipay-支付宝 Weixin-微信 Card-刷卡 Other-其他 |
启用充电的客户端 | Alipay | |
uid | 支付宝用户id | client=“Alipay”必填 | 2088+数字 | 本次充电用户的支付宝uid,客户端为支付宝时必填 | 208884937294593 | |
trade_no | 支付宝交易号 | pay_channel=“Alipay”必填 | 本次支付关联的支付宝交易号,支付渠道为支付宝时必填 | 2018120101010103994834985924 | ||
isv_uid | 运营商用户ID | 是 | ISV系统中用户id | 2088842948274 | ||
order_status | 订单状态 | 是 | 整数 | 订单状态,10000-完结 20000-异常 |
10000 | |
ext_info | 扩展字段 | 否 | 部分运营商如果要传入其他数据,可以通过这个扩展字段传入,特殊字段: test 是否测试数据 Y-测试数据,正常数据不需要填写 out_trade_no 统一收单外部订单号 |
{‘payusername’:‘xxx’} |
TIPS:若trade_no无法获取,可将trade_no设置为ORDERNO,并在扩展字段填写统一收单外部订单号,格式为ext_info:{“out_trade_no”:“外部订单号xxxx”}
用户换电行为的数据回流,本模式用于商家自持电池的共享换电模式或用户自备电池租赁充电柜换电模式。
换电订单数据回流模板名称(template_name):exchangeOrder。
字段标识 | 名称 | 必填 | 格式 | 可选项 | 描述 | demo |
---|---|---|---|---|---|---|
doc_type | 订单类型 | 是 | [Share,Own] Share-共享换电 Own-自备电池换电 |
共享换电(电池是共享的,比如标准化电池在门店换电)、自备电池换电(电池是非共享的,比如租换电柜) | Share | |
order_no | 运营商订单号 | 是 | 在运营商端的订单号 | OD2018110283948294948 | ||
biz_time | 换电时间 | 是 | yyyy-MM-DD HH:mm:ss | 换电行为发生时间,可早于当前时间,用于补齐历史数据,精确到秒 | 2018-12-01 10:10:10 | |
site_id | 站点编号 | 否 | 在运营商系统中站点的编号 | s8298394 | ||
cabinet_no | 换电柜机编号 | 否 | 在运营商系统中换电柜机器的编号,一个换电柜机包含多个换电抽屉 | 2891839 | ||
socket_no | 换电抽屉编号 | 否 | 在运营商系统中换电插座的编号 | 8 | ||
actual_duration | 实际充电时长 | 否 | 整数 | ’实际充电时长,开始充电到断电的时间(断电场景包括充满断电、未充满但是到时间点了断电、用户主动拔插座断电等),单位 分钟 | 51 | |
charge_amount | 实际消费金额 | 否 | 小数 | 本次充电实际消耗的订单金额(非用户实付金额),单位 元 | 17.40 | |
charging_mode | 充电模式 | 是 | [ThirdPay,Balance,Quantity] ThirdPay-第三方支付 Balance-余额模式 Quantity-包量模式 |
第三方支付模式(调起第三方支付的模式,含余额+第三方支付混合支付的订单)、余额模式(本订单完全由用户在运营商系统中的储值支付,包括运营商体系内的红包、券等)、包量模式(运营商体系内的月卡、次卡、年卡等) | ThirdPay | |
pay_channel | 支付渠道 | charging_mode=“ThirdPay”时必填 | [Alipay,Weixin,UnionPay,Other] Alipay-支付宝 Weixin-微信 UnionPay-银联 Other-其他 |
支付渠道,充电模式为第三方支付时,必填 | Alipay | |
client | 客户端 | 是 | [App,Alipay,Weixin,Card,Other] App-客户端程序 Alipay-支付宝 Weixin-微信 Card-刷卡 Other-其他 |
启用充电的客户端 | Alipay | |
uid | 支付宝用户id | client=“Alipay”必填 | 2088+数字 | 本次充电用户的支付宝uid,客户端为支付宝时必填 | 208884937294593 | |
trade_no | 支付宝交易号 | pay_channel=“Alipay”必填 | 本次支付关联的支付宝交易号,支付渠道为支付宝时必填 | 2018120101010103994834985924 | ||
isv_uid | 运营商用户ID | 是 | ISV系统中用户id | 2088842948274 | ||
order_status | 订单状态 | 是 | 整数 | 订单状态,10000-完结 20000-异常 |
10000 | |
ext_info | 扩展字段 | 否 | 部分运营商如果要传入其他数据,可以通过这个扩展字段传入,特殊字段: test 是否测试数据 Y-测试数据,正常数据不需要填写 |
{‘payusername’:‘xxx’} |
针对用户账户发生支付的账户流水数据回流,主要包括以下场景:
- 单次充电时支付
- 余额充值时支付
- 包量购买时支付(月卡、次卡等)
账户流水数据回流模板名称(template_name):accountFlow。
字段标识 | 名称 | 必填 | 格式 | 可选项 | 描述 | demo |
---|---|---|---|---|---|---|
order_no | 运营商订单号 | 是 | 在运营商端的订单号 | 2018112019289424894 | ||
create_time | 用户完成支付时间 | 否 | 用户完成支付时间 | 2018-12-10 10:10:10 | ||
trade_type | 交易类型 | 是 | [Once,Balance,Quantity] Once-单次充电 Balance-余额充值 Quantity-包量购买 |
余额充值、单次充电、包量购买(购买运营商体系内的月卡、年卡、次卡等) | Once | |
amount | 金额 | 是 | 小数 | 余额充值模式:本次充值的金额;单次充电:本次充电的金额;包量购买:本次购买消耗的金额,单位 元 | 50.5 | |
pay_channel | 支付渠道 | 是 | [Alipay,Weixin,UnionPay,Cash,Other] Alipay-支付宝 Weixin-微信 UnionPay-银联 Cash-现金 Other-其他 |
支付渠道 | Alipay | |
trade_no | 支付宝交易号 | pay_channel=“Alipay”时必填 | 本次支付关联的支付宝交易号,支付渠道为支付宝时必填 | 20181201010110939847582374348 | ||
isv_uid | 运营商用户ID | 是 | ISV系统中用户id | 2088842948274 | ||
ext_info | 扩展字段 | 否 | 部分运营商如果要传入其他数据,可以通过这个扩展字段传入,特殊字段: test 是否测试数据 Y-测试数据,正常数据不需要填写 |
|||
client | 客户端 | 否 | [App,Alipay,Weixin,Other] App-App Alipay-支付宝 Weixin-微信 Other-其他 |
客户端 | Alipay |
public void addChargePipe(){ AlipayClient alipayClient = new DefaultAlipayClient(URL, APPID, AppPrivateKey, "json", "GBK", AlipayPublicKey, "RSA"); AlipayCommerceIotMdeviceprodDevicelogUploadRequest request = new AlipayCommerceIotMdeviceprodDevicelogUploadRequest(); request.setBizContent("{\n" + " \"template_name\": \"chargePile\",\n" + " \"body\": {\n" + " \"pile_id\":\"1738247\",\n" + " \"type\":\"EV\",\n" + " \"pile_type\":\"CP\",\n" + " \"socket_num\":8,\n" + " \"site_id\":\"s123134\",\n" + " \"site_name\":\"xxx站点\",\n" + " \"site_type\":\"GROUND\",\n" + " \"province_code\":\"330000\",\n" + " \"city_code\":\"330100\",\n" + " \"area_code\":\"330106\",\n" + " \"address\":\"xxx路xxx街xx号\",\n" + " \"channel_biz_name\":\"xx渠道商\",\n" + " \"property_name\":\"xx物业\",\n" + " \"site_longitude\":120.15,\n" + " \"site_latitude\":30.28\n" + " }\n" + " }"); try { AlipayCommerceIotMdeviceprodDevicelogUploadResponse response = alipayClient.execute(request); if(response.isSuccess()) { System.out.println("success"); }else{ System.out.println(response.toString()); } } catch (AlipayApiException e) { e.printStackTrace(); } }
public void addChargeOrderLog(){ AlipayClient alipayClient = new DefaultAlipayClient(URL, APPID, AppPrivateKey, "json", "GBK", AlipayPublicKey, "RSA"); AlipayCommerceIotMdeviceprodDevicelogUploadRequest request = new AlipayCommerceIotMdeviceprodDevicelogUploadRequest(); request.setBizContent("{" + " \"template_name\": \"chargeOrder\"," + " \"body\": {" + " \"doc_type\":\"Charge\"," + " \"order_no\":\"OD2018110283948294948\"," + " \"charge_time\":\"2018-12-01 10:10:10\"," + " \"pile_no\":\"2891839\"," + " \"socket_no\":\"8\"," + " \"user_select_duration\":55," + " \"actual_duration\":53," + " \"charge_amount\":17.4," + " \"charging_mode\":\"ThirdPay\"," + " \"pay_channel\":\"Alipay\"," + " \"client\":\"Alipay\"," + " \"uid\":\"20889384894823\"," + " \"isv_uid\":\"823942847293\"," + " \"trade_no\":\"20181201101010857239749753823\"" + " }" + " }"); try { AlipayCommerceIotMdeviceprodDevicelogUploadResponse response = alipayClient.execute(request); if(response.isSuccess()) { System.out.println("success"); }else{ System.out.println(response.toString()); } } catch (AlipayApiException e) { e.printStackTrace(); } }
public void addChargeOrderLog(){ AlipayClient alipayClient = new DefaultAlipayClient(URL, APPID, AppPrivateKey, "json", "GBK", AlipayPublicKey, "RSA"); AlipayCommerceIotMdeviceprodDevicelogUploadRequest request = new AlipayCommerceIotMdeviceprodDevicelogUploadRequest(); request.setBizContent("{" + " \"template_name\": \"exchangeOrder\"," + " \"body\": {" + " \"doc_type\":\"Share\"," + " \"order_no\":\"OD2018110283948294948\"," + " \"biz_time\":\"2018-12-01 10:10:10\"," + " \"site_id\":\"2891839\"," + " \"cabinet_no\":\"192848\"," + " \"socket_no\":\"8\"," + " \"actual_duration\":53," + " \"actual_electricity\":10.3," + " \"charge_amount\":17.4," + " \"charging_mode\":\"ThirdPay\"," + " \"pay_channel\":\"Alipay\"," + " \"client\":\"Alipay\"," + " \"uid\":\"20889384894823\"," + " \"isv_uid\":\"823942847293\"," + " \"trade_no\":\"20181201101010857239749753823\"" + " }" + " }"); try { AlipayCommerceIotMdeviceprodDevicelogUploadResponse response = alipayClient.execute(request); if(response.isSuccess()) { System.out.println("success"); }else{ System.out.println(response.toString()); } } catch (AlipayApiException e) { e.printStackTrace(); } }
public void addAccountFlowLog(){ AlipayClient alipayClient = new DefaultAlipayClient(URL, APPID, AppPrivateKey, "json", "GBK", AlipayPublicKey, "RSA"); AlipayCommerceIotMdeviceprodDevicelogUploadRequest request = new AlipayCommerceIotMdeviceprodDevicelogUploadRequest(); request.setBizContent("{" + " \"template_name\": \"accountFlow\"," + " \"body\": {" + " \"order_no\":\"OD2018110283948294948\"," + " \"trade_type\":\"Once\"," + " \"amount\":50.5," + " \"pay_channel\":\"Alipay\"," + " \"trade_no\":\"20181201010110939847582374348\"" + " }" + " }"); try { AlipayCommerceIotMdeviceprodDevicelogUploadResponse response = alipayClient.execute(request); if(response.isSuccess()) { System.out.println("success"); }else{ System.out.println(response.toString()); } } catch (AlipayApiException e) { e.printStackTrace(); } }
第三方商户向开发者授权后,可以使用开发者提供的充电桩数据回流能力,具体第三方授权开发请参考《第三方应用授权》。
(1) 开放平台申请小程序或使用已有小程序。
(2) 开发
(3) 测试环境调试
测试环境用于测试上传日志链路联通性,解决使用过程中程序问题。
测试环境接入网关://openapi.sit.dl.alipaydev.com/gateway.do
(4) 预发环境验证
预发环境用于验证程序在生产环境中能否正常使用,该环境与生产环境相同,仅用于小批量数据验证。预发环境需联系支付宝对接同学临时授权。
预发环境接入网关:https://openapipre.alipay.com/gateway.do
(5) 上线
生产环境接入网关:https://openapi.alipay.com/gateway.do
生产环境需要支付宝进行挂包,可联系对接同学。
(1) appid如何申请?
appid是小程序id,可以在开放平台申请https://openhome.alipay.com/platform/home.htm
(2) 接口请求提示权限问题。
本接口为定向开放接口,需要单独授权。在预发环境中可通知支付宝同学临时授权,可以有5天的访问时间进行程序功能验证。预发环境验证成功之后,通知支付宝同学挂包,长期授权使用。