目录:
- 场景介绍
1.1 扫码付场景
1.2 刷卡付场景 - 接入指引
2.1 准备工作
2.2 接口调用规范
2.2.1 请求说明 - API列表
3.1 获取二维码串/提交订单
3.2 交易结果查询接口
3.3 交易退款接口
3.4 交易退款结果查询接口
3.5 关闭订单
3.6 对账文件下载
3.7 交易结果查询接口(含退款信息)
3.8 支付宝人脸初始化接口
3.9 支付宝人脸核身获取用户详细信息 - 系统交互
- 修订记录
1. 场景介绍
线下当面付包含扫码支付(扫码付)和条码支付(刷卡付)两种付款方式,聚合支付平台对这两种当面付进行了接口统一。
1.1 扫码付场景
扫码付,指用户打开支付宝/微信中的“扫一扫”功能,扫描商家展示在某收银场景下的二维码并进行支付的模式。该模式适用于线下实体店支付、面对面支付、自助机等场景。业务流程如下:
1.2 刷卡付场景
刷卡付(条码支付)是第三方支付给到线下传统行业的一种收款方式。商家使用扫码枪等条码识别设备扫描用户支付宝/微信钱包上的条码/二维码,完成收款。用户仅需出示付款码,所有收款操作由商家端完成。该模式一般用于医院的收银窗口场景。业务流程如下:
2. 接入指引
2.1 准备工作
第一步、获取开发者数据
调用聚合支付平台接口,需要与平台商务对接后,获取开发者ID(developId),密钥(privateKey),公钥(publicKey)和对称密钥(desKey),这些参数让商户拥有调用平台接口的权限,对请求的数据进行加密以保证数据的安全性。
- 开发者ID(developerId):
developerId在所有的请求中都需要传入,与密钥公钥信息相对应,鉴别请求是否是由平台商户发起。
- 密钥(privateKey):
密钥在接口请求中用于对数据进行RSA加密,生成签名sign。
- 公钥(publicKey):
公钥用于对签名进行解密
- 对称密钥(desKey):
在线上支付中,<body>标签的中的参数,需要通过des进行对称加密,得到密文进行请求。
第二步、获取平台商户号
每个商户对接聚合支付平台,在第三方平台想要拥有的支付能力,需要在支付宝或者微信签约对应的支付方式,平台的商务会为每个商户分配一个平台商户号(merchantNo),该商户号账户下所有的交易流水都会进入到对应的支付宝和微信的账户下,并且平台账单流水都是以商户号进行隔离,这是一个非常重要的参数。
第三步、下载加解密sdk和demo
- java版本:加解密工具java版本
2.2 接口调用规范
2.2.1 请求说明
接口通信地址:
测试环境:http://offlinetest.bsoftpay.com/gatewayOffline/pay/offline/execute
正式环境:由平台商务对接人员提供http请求格式:
Content-type:x-www-form-urlencoded
公共请求参数说明:
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例 |
---|---|---|---|---|---|
data | String | 是 | 300 | 请求参数转为xml格式 | <xml><paytype>2</paytype><merchant_no>10000</merchant_no></xml> |
developerId | String | 是 | 10 | 开发者id | 12345 |
funcId | String | 是 | 20 | 功能码 | P7001 |
sign | String | 是 | 100 | 将公共参数以“参数名”ASCII码顺序排序拼接成新字符串(参数名ASCII码从小到大排序(字典序))得到:“data=value1&developerId=value2&funcId=value3”,再将新的字符串经过RSA签名得到签名后的字符串 | Sa/hb9jaTZZZq89mN62DDooLv/YTvfE9ayrbzgOMsucfIPZfJGmhUia6YWK8vQ5/NQana3Pub7BDswEenm0sBg== |
- 公共返回参数说明:
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例 |
---|---|---|---|---|---|
retCode | String | 是 | 30 | 0000:表示接口业务调用正常,9999:表示处理失败,如参数错误,验签失败等(注:retCode并不表示交易行为成功或失败,某笔交易是否成功请根据对应接口返回报文的状态字段来判定) | 0000 |
retMsg | String | 是 | 100 | 接口调用异常返回信息 | 验签失败 |
3. API列表
3.1 获取二维码串/提交订单
- 功能码:P7001
- 接口说明:扫码付(C扫B)调用该接口得到二维码串,刷卡付(B扫C)通过该接口提交订单
- 请求参数:
<xml>
参数 | 名称 | 类型 | 长度 | 是否必填 | 说明 | 示例 |
---|---|---|---|---|---|---|
treatment_id | 诊疗卡卡号 | String | 30 | 是 | 患者的诊疗卡卡号 | 123 |
merchant_no | 收款商户号 | String | 30 | 是 | 创业聚合支付系统为医院分配的平台商户号 | 809900000001 |
username | 支付者姓名 | String | 30 | 是 | 付款者姓名 | 张三 |
order_no | 业务单号 | String | 30 | 是 | 商户业务系统的唯一订单号 | BX20190722902141 |
paytype | 支付渠道 | String | 2 | 是 | 2=支付宝; 3=微信 5=云闪付 6=数字人民币 | 2 |
trade_type | 交易类型 | String | 2 | 是 | 1=扫码付; 2=刷卡付; 7=刷脸付 | 1 |
total_amt | 支付金额 | Price | 20.2 | 是 | 以元为单位 | 0.01 |
spbill_create_ip | 用户IP | String | 10 | 是 | 客户端实际ip(微信需要) | 183.156.115.113 |
order_subject | 商品标题 | String | 150 | 是 | 如:门诊、住院预交、住院结算、自助缴费等 | 门诊 |
order_detail | 商品描述 | String | 300 | 是 | 如:门诊挂号、门诊结算、住院预交、住院结算、自助挂号、自助结算、自助住院预交等 | 门诊挂号 |
sub_merchant | 分店号 | String | 30 | 否 | 商户内部区分订单字段 | 001 |
paytimeout | 订单超时时间 | String | 3 | 否 | 单位是: m (分钟) 如果不填,默认是 6分钟,如果填,必须大于5分钟 | 6 |
mobile | 手机号码 | String | 15 | 否 | 用户手机号 | 13211112222 |
auth_code | 授权码 | String | 128 | 否 | 刷卡付,刷脸付必传 | 134692901956119825 |
scene_type | 场景类型 | String | 1 | 否 | 0=his窗口场景 缺省 1=自助机 自助机刷脸必填 |
1 |
terminal_id | 商户机具终端编号 | String | 1 | 否 | 自助机刷脸必填 |
NJ_T_001 |
store_id | 商户门店编号 | String | 1 | 否 | 支付宝参数 |
NJ_001 |
alipay_store_id | 支付宝内部门店编号 | String | 1 | 否 | 支付宝参数 |
|
remark | 备注 | String | 200 | 否 | 备注 | |
big_merchant_no | 统一商户号 | String | 30 | 否 | 流水转入统收商户中(不建议使用,对账无法区分) | |
notifyURL | 自定义支付结果通知地址 | String | 否 | 单独为此订单配置的支付结果通知地址 | http://test.com/callback | |
goodsTag | 支付优惠场景 | String | 128 | 否 | 涉及到2022-04-01日后的微信返佣 | REGISTRATION_FEE 门诊挂号 MEDICINE_AND_TEST 门诊缴费 HOSPITALIZATION 住院 ONLINE_CONSULTATION 在线问诊 NUCLEIC_ACID_TEST 核酸检测 BODY_TEST 体检 SCAN_TO_ORDER 医院餐饮 MEDICAL_COSMETOLOGY 医疗美容、整形等 VALUE_ADDED_SERVICE 增值服务(远程探视、VIP 套餐、高端医疗等) PARKING 医院停车场缴费 RETAIL 医院零售(超市、便利店、自助售货机等) COMMERCIAL_OTHERS 其他商业场景 |
- 响应参数:
参数 | 名称 | 类型 | 长度 | 是否必输 | 说明 | 示例 |
---|---|---|---|---|---|---|
return_code | 返回状态码 | String | 16 | 否 | SUCCESS/OK代表成功 FAIL=代表失败 WAIT=待支付 不能以此作为支付成功标志,支付结果以status为准 |
SUCCESS |
return_msg | 返回信息 | String | 128 | 否 | 返回信息 | OK |
code_url | 二维码串 | String | 500 | 否 | 扫码付时返回 | |
status | 支付状态 | String | 2 | 否 | 1=成功;0=支付中 需要调用查询接口轮询查询订单状态 刷卡支付时使用 |
1 |
pay_orderno | 支付渠道流水号 | String | 32 | 否 | 刷卡支付时使用 | 4200000376201908224052992001 |
order_no | 平台流水号 | String | 32 | 否 | 刷卡支付时使用 | 34411000 |
out_tradeno | 业务单号 | String | 32 | 否 | 刷卡支付时使用 | BX20190722902141 |
time_end | 支付完成时间 | String | 32 | 否 | 刷卡支付时使用(yyyyMMddHHmmss) | 20190722205306 |
amt | 实际支付金额 | Price | 16.2 | 否 | 刷卡支付时使用 | 0.01 |
receipt_amount | 商户收到的金额 | Price | 16.2 | 否 | 刷卡支付时使用(相当于订单支付金额) | 0.01 |
- Java请求示例:
String data = "<xml>" + "<treatment_id>123123123123</treatment_id>" + "<merchant_no>1001003</merchant_no>" + "<username>测试者</username>" + "<order_no>"+ "xw20190722001"+"</order_no>" + "<paytype>3</paytype>" + "<trade_type>2</trade_type>" + "<total_amt>0.01</total_amt>" + "<spbill_create_ip>192.168.11.1</spbill_create_ip>" + "<order_subject>测试</order_subject>" + "<order_detail>测试</order_detail>" + "<auth_code>130195331105619585</auth_code>" + "</xml>"; List<NameValuePair> list = new ArrayList<NameValuePair>(); NameValuePair valu1 = new BasicNameValuePair("data",data); NameValuePair valu2 = new BasicNameValuePair("developerId",[your developerId]); NameValuePair valu3 = new BasicNameValuePair("funcId","P7001"); String privateKey = [your privateKey]; String signData = "data="+data+"&developerId=[your developerId]&funcId=P7001"; String sign = SecurityUtil.signRSA(signData,privateKey,"utf-8"); NameValuePair valu4 = new BasicNameValuePair("sign",sign); list.add(valu1); list.add(valu2); list.add(valu3); list.add(valu4); String xml = null; try { CloseableHttpResponse response = HttpClients.custom().build().execute(RequestBuilder.post().setUri("http://offlinetest.bsoftpay.com/gatewayOffline/pay/offline/execute").setEntity(new UrlEncodedFormEntity(list, Consts.UTF_8)).build()); xml = EntityUtils.toString(response.getEntity()); } catch (Exception e) { e.printStackTrace(); } System.out.println(xml);
- 返回示例:
developerId=12345&funcId=P7001&retCode=0000&retMsg= &data=<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <xml> <return_code>SUCCESS</return_code> <return_msg>OK</return_msg> <status>1</status> <pay_orderno>4200000376201907220000000000</pay_orderno> <order_no>34411000</order_no> <out_tradeno>WX15637998177239200001</out_tradeno> <time_end>20190722205306</time_end> <amt>0.01</amt> <receipt_amount>0.01</receipt_amount> </xml> &sign=Apu4i49RBQkh94n5BVEA/Ao35tjfT8BsTPA9fOqKUmbKJ37Pszfi0sS9R15OLEpXJYo6p2v+uw1fr/BE+PSxHg==
- 异常返回示例:
developerId=12345&funcId=P7001&retCode=9999&retMsg=请扫描微信支付授权码(以10/11/12/13/14/15为前缀的18位数字)&sign=XD1unE4I2pM/jWMXy1o7NwVB2H3yfkmxluH2qz3xRt+mB8VQNSLhKnz79+5PuRfz9Q4y44CKCyL7S21iQzOHbg==
- 注意:签名sign生成之后,在请求发送之前,需要对签名字符串进行urlEncode编码,否则字符串在传递过程中可能会不完整,从而导致“验证签名失败”
3.2 交易结果查询接口
- 功能码:P2005
- 接口说明:通过该接口获取某个订单的支付结果
- 请求参数:
<Data>
参数 | 名称 | 类型 | 长度 | 是否必填 | 说明 | 示例 |
---|---|---|---|---|---|---|
order_no | 业务单号 | String | 32 | 是 | 商户内部业务单号 | WX2019072200001 |
trade_no | 平台单号 | String | 32 | 与order_no不全为空 | 平台单号 | 422604191 |
merchant_no | 收款商户号 | String | 32 | 是 | 商户号 | 809900000001 |
prefer_properties | 希望在应答中增加的订单信息字段 | String | 512 | 否 | json格式 | [“payAccount”,”str3”] |
- 响应参数:
参数 | 名称 | 类型 | 长度 | 是否必输 | 说明 | 示例 |
---|---|---|---|---|---|---|
TradeNo | 平台流水号 | String | 32 | 是 | 聚合支付平台流水号 | 34411000 |
PayTradeNo | 渠道流水号 | String | 32 | 是 | 各个支付渠道返回的流水号 | 4200000376201907220000000000 |
OrderNo | 业务单号 | String | 32 | 是 | 商户内部业务单号 | WX2019072200001 |
Amt | 实际支付金额 | Price | 16.2 | 是 | 用户实际付款金额 | 0.01 |
PayTime | 实际支付时间 | String | 16 | 是 | yyyy-MM-dd hh:mm:ss | 2019-07-22 21:37:31 |
PayStatus | 支付状态 | String | 6 | 是 | 0=未支付;1=支付成功;2=支付失败;-1=关闭或撤销 | 1 |
receipt_amount | 商户收到的金额 | Price | 16.2 | 是 | 相当于订单支付金额 | 0.01 |
Attach | 希望在应答中增加的订单信息字段 | String | 512 | 否 | xml格式 |
- JAVA请求示例:
String data = "<Data>" + "<order_no>WX2019072200001</order_no>\n" + "<merchant_no>809900000001</merchant_no>\n"+ "</Data>"; List<NameValuePair> list = new ArrayList<NameValuePair>(); NameValuePair valu1 = new BasicNameValuePair("data",data); NameValuePair valu2 = new BasicNameValuePair("developerId",[your developerId]"); NameValuePair valu3 = new BasicNameValuePair("funcId","P2005"); String privateKey = [your privateKey]; String signData = "data="+data+"&developerId=[your developerId]&funcId=P2005"; String sign = SecurityUtil.signRSA(signData,privateKey,"utf-8"); NameValuePair valu4 = new BasicNameValuePair("sign",sign); list.add(valu1); list.add(valu2); list.add(valu3); list.add(valu4); String xml = null; try { CloseableHttpResponse response = HttpClients.custom().build().execute(RequestBuilder.post().setUri("http://offlinetest.bsoftpay.com/gatewayOffline/pay/offline/execute").setEntity(new UrlEncodedFormEntity(list, Consts.UTF_8)).build()); xml = EntityUtils.toString(response.getEntity()); } catch (Exception e) { e.printStackTrace(); } System.out.println(xml);
- 返回示例:
developerId=66337&funcId=P2005&retCode=0000&retMsg= &data=<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Data> <TradeNo>34411000</TradeNo> <PayTradeNo>4200000376201907220000000000</PayTradeNo> <OrderNo>WX2019072200001</OrderNo> <Amt>0.01</Amt> <receipt_amount>0.01</receipt_amount> <PayTime>2019-07-22 21:37:31</PayTime> <PayStatus>1</PayStatus> <Attach> <payAccount>oTNu_0f5H1ZcSsl2OaIY0nVHfUuo</payAccount> <str3>130635149075250231</str3> </Attach> </Data> &sign=JxUbXFPS4Kp3bS9ipmznDoAwBd3TzLX4Df8xd5VFR97Z1Kyb5XiJNxZ4LXA1RIlOafm+BmmnPXZXDfykss3geg==
- 注意: P2005功能中请求参数是用
<Data></Data>
包围,不是<xml></xml>
3.3 交易退款接口
- 功能码:P2008
- 接口说明:当交易发生之后一段时间内,由于买家或者卖家的原因需要退款时,卖家可以通过退款接口将支付款退还给买家(原路返回)。注意的地方:微信超过1年的订单无法提交退款,支付宝超过3个月的订单无法提交退款,可以一笔订单多次退款,但是累计金额不能超过原支付金额
- 请求参数:
<Data>
参数 | 名称 | 类型 | 长度 | 是否必填 | 说明 | 示例 |
---|---|---|---|---|---|---|
RequestNo | 退款订单号 | String | 32 | 是 | 商户内部唯一退款单号 | TK20190722001 |
PayType | 退款渠道 | String | 2 | 是 | 2=支付宝;3=微信 | 2 |
Amt | 退款金额 | Price | 16.2 | 是 | 退款金额不得超过原支付金额 | 0.01 |
TradeNo | 原支付业务单号 | String | 32 | 是 | 商户原支付订单号 | WX2019072200001 |
pay_trade_no | 原支付渠道交易单号 | String | 32 | 三个原单号任一不为空 | 微信或支付宝端交易单号 | 42XXXXX |
order_no | 原聚合支付平台单号 | String | 32 | 三个原单号任一不为空 | 原聚合支付平台单号.既微信支付宝客户端显示的商户订单号 | 4XXXXX |
merchant_no | 商户号 | String | 32 | 是 | 平台商户号 | 809900000001 |
sub_merchant | 分店号 | String | 32 | 否 | 商户内部区分单号 | 001 |
- 响应参数:
参数 | 名称 | 类型 | 长度 | 是否必输 | 说明 | 示例 |
---|---|---|---|---|---|---|
RequestNo | 退款订单号 | String | 32 | 是 | 申请退款订单号 | TK20190722001 |
Amt | 退款金额 | Price | 16.2 | 是 | 申请退款金额 | 0.01 |
- JAVA请求示例:
String data = "<Data>" + "<RequestNo>TK123127893456798765491</RequestNo>" + "<PayType>3</PayType>" + "<Amt>0.01</Amt>" + "<TradeNo>YMP011494322477660</TradeNo>" + "<merchant_no>809900000001</merchant_no>" + "</Data>"; List<NameValuePair> list = new ArrayList<NameValuePair>(); NameValuePair valu1 = new BasicNameValuePair("data",data); NameValuePair valu2 = new BasicNameValuePair("developerId",[your developerId]); NameValuePair valu3 = new BasicNameValuePair("funcId","P2008"); String privateKey =[your privateKey]; String signData = "data="+data+"&developerId=[your developerId]&funcId=P2008"; String sign = SecurityUtil.signRSA(signData,privateKey,"utf-8"); NameValuePair valu4 = new BasicNameValuePair("sign",sign); list.add(valu1); list.add(valu2); list.add(valu3); list.add(valu4); String xml = null; try { CloseableHttpResponse response = HttpClients.custom().build().execute(RequestBuilder.post().setUri("http://offlinetest.bsoftpay.com/gatewayOffline/pay/offline/execute").setEntity(new UrlEncodedFormEntity(list, Consts.UTF_8)).build()); xml = EntityUtils.toString(response.getEntity()); } catch (Exception e) { e.printStackTrace(); } System.out.println(xml);
- 返回示例:
developerId=12345&funcId=P2008&retCode=0000&retMsg= &data=<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Data> <RequestNo>TK123127893456798765491</RequestNo> <Amt>0.01</Amt> </Data> &sign=XUvpouNiWkQF7bQsS2GTz+x7InmbxNz0reUhi1qqIIVg6AvLv5BKOqRzGpEm/N214pBPmiZpsygsOMKvYgLFqg==
- 注意: P2008功能中请求参数是用
<Data></Data>
包围,不是<xml></xml>
3.4 交易退款结果查询接口
- 功能码:P2009
- 接口说明:提交退款申请后,通过调用该接口查询退款状态。退款有一定延时,用微信零钱或者支付宝余额宝、花呗等支付的退款20分钟内到账,银行卡支付的退款3个工作日后重新查询退款状态(20分钟、3 个工作日都是大概时间,不一定为准,有可能提前,有可能延迟)
- 请求参数:
<Data>
参数 | 名称 | 类型 | 长度 | 是否必填 | 说明 | 示例 |
---|---|---|---|---|---|---|
RequestNo | 退款订单号 | String | 32 | 是 | 商户内部唯一退款单号 | TK20190722001 |
PayType | 退款渠道 | String | 2 | 是 | 2=支付宝;3=微信 | 2 |
- 响应参数:
参数 | 名称 | 类型 | 长度 | 是否必输 | 说明 | 示例 |
---|---|---|---|---|---|---|
RequestNo | 退款订单号 | String | 32 | 是 | 申请退款订单号 | TK20190722001 |
Amt | 退款金额 | Price | 16.2 | 是 | 当code为1时这里会显示退款金额 | 0.01 |
Code | 退款状态 | String | 2 | 是 | -1交易不存在 1 成功 2 失败 | 1 |
Msg | 错误信息描述 | String | 100 | 是 | 当code为2时这里会显示错误信息 | 0.01 |
- 返回示例:
developerId=12345&funcId=P2009&retCode=0000&retMsg= &data=<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Data> <RequestNo>TK20190722001</RequestNo> <Amt>0.01</Amt> <Code>1</Code> <Msg>OK</Msg> </Data> &sign=pkXTgvceROvF0JPq7Bmwxv654YoAImkSNblr/xTE75h6ZS1hUSSl5OAjEXptiJ0EW5vT9AvmFWGeW6uQGE6aKg==
- 注意: P2009功能中请求参数是用
<Data></Data>
包围,不是<xml></xml>
3.5 关闭订单
功能码:P7002
接口说明:需要重新发起支付时,关闭该订单(刷卡付场景,扫码付无需关闭订单)
场景描述:当接入应用系统调用支付指令接口(P7001)后,遇到网络等原因,超时未获取到结果的情况下,可以调用本接口进行关闭(撤销)此次支付订单(用于非正常支付场景)
特别注意:如果是刷卡付(B扫C)的应用场景,若付款人已支付,渠道商会进行退款,聚合支付平台不会有退款记录- 情况一实际未支付,订单关闭(撤销), 接入的应用系统一定要作废本地业务单据。
- 情况二实际已支付,若是刷卡付(B扫C)的应用场景,关闭(撤销)订单时,会原路退回支付款,接入的应用系统一定要作废本地业务单据。若是扫码付(C扫B)的应用场景,则系统会提示该笔“已支付不允许关闭”,遇到该情况,接入应用可以继续获取支付结果来同步本地业务单据状态或者重新发起业务付款流程,原业务单据走异常退款方式(接入应用研发异常退款功能直接调用P2008)
请求参数:
<xml>
参数 | 名称 | 类型 | 长度 | 是否必填 | 说明 | 示例 |
---|---|---|---|---|---|---|
order_no | 业务单号 | String | 32 | 是 | 商户内部唯一订单号 | ZF20190722001 |
merchant_no | 收款商户号 | String | 32 | 是 | 平台商户号 | 809900000001 |
- 响应参数:
参数 | 名称 | 类型 | 长度 | 是否必输 | 说明 | 示例 |
---|---|---|---|---|---|---|
ReturnCode | 返回状态码 | String | 16 | 是 | SUCCESS=关闭成功;FAIL=关闭失败 | SUCCESS |
ReturnMsg | 返回消息 | String | 128 | 是 |
- 请求示例:
String data = "<xml>" + "<order_no>ZF20190722001</order_no>" + "<merchant_no>809900000001</merchant_no>" + "</xml>"; List<NameValuePair> list = new ArrayList<NameValuePair>(); NameValuePair valu1 = new BasicNameValuePair("data",data); NameValuePair valu2 = new BasicNameValuePair("developerId",[your developerId]); NameValuePair valu3 = new BasicNameValuePair("funcId","P7002"); String privateKey = [your privateKey]; String signData = "data="+data+"&developerId=[your developerId]&funcId=P7002"; String sign = SecurityUtil.signRSA(signData,privateKey,"utf-8"); NameValuePair valu4 = new BasicNameValuePair("sign",sign); list.add(valu1); list.add(valu2); list.add(valu3); list.add(valu4); String xml = null; try { CloseableHttpResponse response = HttpClients.custom().build().execute(RequestBuilder.post().setUri("http://offlinetest.bsoftpay.com/gatewayOffline/pay/offline/execute").setEntity(new UrlEncodedFormEntity(list, Consts.UTF_8)).build()); xml = EntityUtils.toString(response.getEntity()); } catch (Exception e) { e.printStackTrace(); } System.out.println(xml);
- 返回示例:
developerId=12345&funcId=P7002&retCode=0000&retMsg= &data=<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <xml> <ReturnCode>SUCCESS</ReturnCode> <ReturnMsg>OK</ReturnMsg> </xml> &sign=WkYUWPi+bnecNPTrhKnmvVWrnnCGvgxEkqwwrdMmu6LWMwUm6iFOhMlsRdvibFGr9SBqWY4pIew5e732xmXZOw==
3.6 对账文件下载
- 功能码:P7003
- 接口说明:下载对账文件(每日对账文件会第二天12:10左右生成)
- 请求参数:
<xml>
参数 | 名称 | 类型 | 长度 | 是否必填 | 说明 | 示例 |
---|---|---|---|---|---|---|
MerchantNo | 收款商户号 | String | 32 | 是 | 商户内部唯一订单号 | 809900000001 |
BalanceDate | 对账日期 | String | 10 | 是 | 日期格式:yyyymmdd | 20190722 |
SubMerchant | 门店号 | String | 32 | 否 | 平台商户号 | 001 |
- 响应参数:
名称 | 类型 | 长度 | 是否必输 | 说明 | 示例 |
---|---|---|---|---|---|
商户号 | String | 32 | 是 | 平台商户号 | 809900000001 |
门店号 | String | 32 | 否 | 商户内部区分号 | 001 |
订单号 | String | 16 | 是 平台外交易时没有 | 业务订单号 | ZF20190722001 |
支付渠道 | String | 1 | 是 | 2=支付宝;3=微信 5-云闪付 | 2 |
交易类型 | String | 1 | 是 | 1=app支付;2=退款;3=扫码付;4=刷卡付;5=公众号支付;6=H5支付;7=刷脸付;8-医保支付 -1=未知支付(造成原因:支付平台掉单,无法确定支付类型,出现这种情况请尽快联系支付平台,查明原因) | 1 |
交易时间 | String | 16 | 是 | 时间格式:yyyyMMddhhmmss | 20190722122134 |
交易金额 | Price | 16.2 | 是 | 实际交易金额 医保支付做为总金额 |
0.01 |
医保金额 | Price | 16.2 | 否 | 医保支付金额 医保支付返回 |
0.01 |
自费金额 | Price | 16.2 | 否 | 自费金额 医保支付返回 |
0.01 |
- 请求示例:
<xml> <MerchantNo>809900000001</MerchantNo> <BalanceDate>20190722</BalanceDate> </xml>
- 返回文件格式:txt (以TAB键作为分隔符)
商户号 门店号 订单号 支付渠道 交易类型 交易时间 交易金额 1243 001 334567 2 1 20170111091233 10.00 1244 001 334568 3 2 20170111091244 100.00
3.7 交易结果查询接口(含退款信息)
- 功能码:P2005_1
- 接口说明:通过该接口获取某个订单的支付结果和退款结果
- 请求参数:
<Data>
参数 | 名称 | 类型 | 长度 | 是否必填 | 说明 | 示例 |
---|---|---|---|---|---|---|
order_no | 支付业务单号 | String | 32 | 是 | 商户内部支付业务单号 | WX2019072200001 |
merchant_no | 收款商户号 | String | 32 | 是 | 商户号 | 809900000001 |
- 响应参数:
参数 | 名称 | 类型 | 长度 | 是否必输 | 说明 | 示例 |
---|---|---|---|---|---|---|
TradeNo | 平台流水号 | String | 32 | 是 | 聚合支付平台流水号 | 34411000 |
PayTradeNo | 渠道流水号 | String | 32 | 是 | 各个支付渠道返回的流水号 | 4200000376201907220000000000 |
OrderNo | 业务单号 | String | 32 | 是 | 商户内部业务单号 | WX2019072200001 |
Amt | 实际支付金额 | Price | 16.2 | 是 | 用户实际付款金额 | 0.01 |
PayTime | 实际支付时间 | String | 16 | 是 | yyyy-MM-dd hh:mm:ss | 2019-07-22 21:37:31 |
PayStatus | 支付状态 | String | 6 | 是 | 0=未支付;1=支付成功;2=支付失败;-1=关闭或撤销 | 1 |
receipt_amount | 商户收到的金额 | Price | 16.2 | 是 | 相当于订单支付金额 | 0.01 |
RefundTotalAmt | 退款总金额 | Price | 16.2 | 否 | 总退款金额 | 0.01 |
RefundList | 退款列表 | 否 | 退款列表,可能包含多个退款记录:<Refund></Refund> |
- 退款列表参数:
<Refund></Refund>
参数 | 名称 | 类型 | 长度 | 是否必输 | 说明 | 示例 |
---|---|---|---|---|---|---|
RefundNo | 商户退款单号 | String | 32 | 否 | his退款唯一流水号 | 34411000 |
RefundAmt | 退款金额 | Price | 16.2 | 否 | 退款金额 | 0.01 |
RefundStatus | 退款状态 | String | 6 | 否 | 1=申请成功 ,2=已到账,-1=退款失败 | 2 |
- 返回示例:
developerId=31331&funcId=P2005_1&retCode=0000&retMsg= &data=<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Data> <TradeNo>39568862</TradeNo> <PayTradeNo>4200000346201908304141456066</PayTradeNo> <OrderNo>paymentProd201908300859539000</OrderNo> <Amt>0.01</Amt> <receipt_amount>0.01</receipt_amount> <PayTime>2019-08-30 09:00:01</PayTime> <PayStatus>1</PayStatus> <RefundTotalAmt>0.01</RefundTotalAmt> <RefundList> <Refund> <RefundNo>refundTest201908300901351000</RefundNo> <RefundAmt>0.01</RefundAmt> <RefundStatus>2</RefundStatus> </Refund> </RefundList> </Data> &sign=Seko5j5kYUs1Vpmpon03IgX7GqiNYWvOkhcUq7alPneOGWSjNPuY3QeXMzUSTBiMC1WQGVwlK+TBPzQeDvvUnQ==
3.8 支付宝微信人脸初始化
- 功能码:P5001
- 接口说明:通过该接口初始化人脸初始化参数
- 请求参数:
<xml>
参数 | 名称 | 类型 | 长度 | 是否必填 | 说明 | 示例 |
---|---|---|---|---|---|---|
paytype | 支付渠道 | String | 是 | 2-支付宝 3-微信 | ||
deviceId | 微信设备Id | String | 微信支付必填 |
微信人脸支付设备序列号 | ||
meta_info | 透传体 | String | 是 | 获取刷脸所需的设备信息返回的metainfo 微信SDK返回的rawData |
||
amt | 订单金额 | String | 32 | 否 | 订单金额,值为double类型 | 0.01 |
merchant_no | 收款商户号 | String | 32 | 是 | 商户号 | |
transType | 交易类型 | String | 32 | 是 | 7-刷脸支付 |
- 响应参数:
参数 | 名称 | 类型 | 长度 | 是否必输 | 说明 | 示例 |
---|---|---|---|---|---|---|
return_code | 返回状态码 | String | 16 | 否 | SUCCESS/OK代表成功 FAIL=代表失败 | SUCCESS |
return_msg | 返回信息 | String | 128 | 否 | 返回信息 | OK |
zim_id | 刷脸调用的标识,将作为下一步zolozVerify接口的入參 | String | 否 | 刷脸调用的标识 | ||
zim_init_client_data | 支付宝 :刷脸的下发协议数据,将作为下一步zolozVerify接口的入參 微信: authInfo 信息 SDK调用凭证。用于调用SDK的人脸识别接口。为便于xml文件解析,authInfo进行了URLEncode,取出时可能需要进行相应的URLDecode操作 |
String | 否 | 刷脸的下发协议数据 |
- 返回示例:
developerId=31331&funcId=P5001&retCode=0000&retMsg= &data=<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <xml> <return_code>SUCCESS</return_code> <return_msg>OK</return_msg> <zim_id></zim_id> <zim_init_client_data></zim_init_client_data> </xml> &sign=Seko5j5kYUs1Vpmpon03IgX7GqiNYWvOkhcUq7alPneOGWSjNPuY3QeXMzUSTBiMC1WQGVwlK+TBPzQeDvvUnQ==
3.9 支付宝人脸核身获取用户详细信息
- 功能码:P5002
- 接口说明:通过该接口获取用户详细信息
- 请求参数:
<xml>
参数 | 名称 | 类型 | 长度 | 是否必填 | 说明 | 示例 |
---|---|---|---|---|---|---|
auth_code | 授权码 | String | 32 | 是 | 授权码 | ca34ea491e7146cc87d25fca24c4cD11 |
merchant_no | 收款商户号 | String | 32 | 是 | 商户号 |
- 响应参数:
参数 | 名称 | 类型 | 长度 | 是否必输 | 说明 | 示例 |
---|---|---|---|---|---|---|
return_code | 返回状态码 | String | 16 | 否 | SUCCESS/OK代表成功 FAIL=代表失败 | SUCCESS |
return_msg | 返回信息 | String | 128 | 否 | 返回信息 | OK |
user_id | 支付宝用户的userId | String | 否 | 2088102104794936 | ||
avatar | 用户头像地址 | String | 否 | http://tfsimg.alipay.com/images/partner/T1uIxXXbpXXXXXXXX | ||
province | 省份名称 | String | 否 | 安徽省 | ||
city | 市名称。 | String | 否 | 安庆 | ||
nick_name | 用户昵称 | String | 否 | 用户昵称 | 支付宝小二 | |
is_student_certified | 是否是学生 | String | 否 | 是否是学生 | T | |
user_type | 用户类型 | String | 否 | 用户类型(1/2) 1代表公司账户2代表个人账户 | 1 | |
user_status | 用户状态 | String | 否 | 用户状态(Q/T/B/W)。Q代表快速注册用户 T代表已认证用户 B代表被冻结账户 W代表已注册,未激活的账户 | T | |
is_certified | 是否通过实名认证。 | String | 否 | T是通过 F是没有实名认证 | F | |
gender | 性别 | String | 否 | 【注意】只有is_certified为T的时候才有意义,否则不保证准确性. 性别(F:女性;M:男性)。 | F |
- 返回示例:
developerId=31331&funcId=P5002&retCode=0000&retMsg= &data=<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <xml> <return_code>SUCCESS</return_code> <return_msg>OK</return_msg> <user_id></user_id> <avatar></avatar> <province></province> <city></city> <nick_name></nick_name> <is_student_certified></is_student_certified> <user_type></user_type> <user_status></user_status> <is_certified></is_certified> <gender></gender> </xml> &sign=Seko5j5kYUs1Vpmpon03IgX7GqiNYWvOkhcUq7alPneOGWSjNPuY3QeXMzUSTBiMC1WQGVwlK+TBPzQeDvvUnQ==
4. 系统交互
系统交互图:
说明:第三方系统在正常发起支付(P7001)或者退款(P2008)请求之后,可在一定时间范围之内,定时向聚合支付平台主动查询支付或退款结果,直到查询到成功或失败的结果。支付宝和微信处理支付回调的时间一天中不同时间段耗时会有所不同,平台状态完全以第三方支付的状态为准。支付宝自助机刷脸支付交互图:
-支付宝自助机刷脸核身交互图:
5. 修订记录
日期 | 修订内容 | 修订人 |
---|---|---|
2019-08-20 | 支付宝支付新增刷脸付的支付方式,下单时trade_type=7 | 甘世敏 |
2019-08-21 | 签约了医保支付的商户,下载账单会包含有医保相关字段 | 甘世敏 |
2019-09-06 | 增加P2005_1支付结果查询接口(含退款数据) | 甘世敏 |