目录:
- 场景介绍
- 接入指引
2.1 准备工作
2.2 接口调用规范
2.2.1 请求说明 - API列表
3.1 微信公众号/支付宝生活号预下单
3.2 交易结果查询接口
3.3 交易退款接口
3.4 交易退款结果查询接口
3.5 交易结果通知 - 最佳实践
- 修订记录
1. 场景介绍
公众号/生活号支付是用户在微信/支付宝中打开商户的H5页面,商户在H5页面通过调用微信/支付宝支付提供的接口调起微信/支付宝支付模块完成支付。应用场景有:
◆ 用户在微信公众账号内进入商家公众号,或支付宝账号内进入商家生活号,打开某个主页面,完成支付
◆ 用户的好友在朋友圈、聊天窗口等分享商家页面连接,用户点击链接打开商家页面,完成支付
◆ 将商户页面转换成二维码,用户扫描二维码后在微信/支付宝浏览器中打开页面后完成支付
注:支付宝生活号和微信公众号内只能唤起各自内部的支付,第三方支付公司不允许唤起其他支付方式,请在做产品设计前了解
2. 接入指引
2.1 准备工作
第一步、获取开发者数据
调用聚合支付平台接口,需要与平台商务对接后,获取开发者ID(developId),密钥(privateKey),公钥(publicKey)和对称密钥(desKey),这些参数让商户拥有调用平台接口的权限,对请求的数据进行加密以保证数据的安全性。
- 开发者ID(developerId):
developerId在所有的请求中都需要传入,与密钥公钥信息相对应,鉴别请求是否是由平台商户发起。
- 密钥(privateKey):
密钥在接口请求中用于对数据进行RSA加密,生成签名sign。
- 公钥(publicKey):
公钥用于对签名进行解密
- 对称密钥(desKey):
在线上支付中,<body>标签的中的参数,需要通过des进行对称加密,得到密文进行请求。
第二步、获取平台商户号
每个商户对接聚合支付平台,在第三方平台想要拥有的支付能力,需要在支付宝或者微信签约对应的支付方式,平台的商务会为每个商户分配一个平台商户号(merchantNo),该商户号账户下所有的交易流水都会进入到对应的支付宝和微信的账户下,并且平台账单流水都是以商户号进行隔离,这是一个非常重要的参数。
第三步、下载demo
- java版本:下载demo
2.2 接口调用规范
2.2.1 请求说明
接口通信地址:
测试环境:http://onlinetest.bsoftpay.com/gatewayOnline/gateway/portal/pgPayRe
正式环境:由平台商务对接人员提供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 | 功能码 | P7005 |
sign | String | 是 | 100 | 将公共参数以“参数名”ASCII码顺序排序拼接成新字符串(参数名ASCII码从小到大排序(字典序))得到:“data=value1&developerId=value2&funcId=value3”,再将新的字符串经过RSA签名得到签名后的字符串 | Sa/hb9jaTZZZq89mN62DDooLv/YTvfE9ayrbzgOMsucfIPZfJGmhUia6YWK8vQ5/NQana3Pub7BDswEenm0sBg== |
注意:签名sign生成之后,在请求发送之前,需要对签名字符串进行**urlEncode**编码,否则字符串在传递过程中可能会不完整,从而导致“验证签名失败”
- 公共返回参数说明:
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例 |
---|---|---|---|---|---|
MerchantNo | String | 是 | 10 | 注意:这是开发者id(developerId) |
12345 |
FuncId | String | 是 | 20 | 功能码 | P7005 |
RetCode | String | 是 | 30 | 0000:表示接口业务调用正常,9999:表示处理失败,如参数错误,验签失败等(注:RetCode并不表示交易行为成功或失败,某笔交易是否成功请根据对应接口返回报文的状态字段来判定) | 0000 |
RetMsg | String | 是 | 100 | 接口调用异常返回信息 | 验签失败 |
Signature | String | 是 | 100 | 签名 | Sa/hb9jaTZZZq89mN62DDooLv/YTvfE9ayrbzgOMsucfIPZfJGmhUia6YWK8vQ5/NQana3Pub7BDswEenm0sBg== |
- 返回参数格式说明:
<?xml version="1.0" encoding="UTF-8"?> <Root> <Head> <MerchantNo>开发者ID</MerchantNo> <FuncId>P7005</FuncId> <RetCode>0000</RetCode> <RetMsg>相关信息,错误时才有值</RetMsg> <Signature>签名</Signature> </Head> <Body> 响应报文内容:<Data>或者<xml> </Body> </Root>
3. API列表
3.1 微信公众号/支付宝生活号预下单
- 功能码:P7005
- 接口说明:该接口供对接方提交订单,生成预下单参数,然后商户利用预下单参数可以在微信或支付宝应用内部唤起支付(默认是选择平台返回的支付页面,如果想使用自己的支付页面请告知平台商务对接人员进行配置变更)
- 获取预下单参数:需要前端人员组装参数去编写支付页面,用户通过支付页面唤起原生支付
- 获得支付页面:该支付页面是聚合平台制作页面(目前仅在微信下有效),拿到页面后,点击支付可以直接唤起原生支付
- 请求参数:
<xml>
参数 | 名称 | 类型 | 长度 | 必填 | 说明 | 示例 |
---|---|---|---|---|---|---|
merchant_no | 收款商户号 | String | 30 | 是 | 创业聚合支付系统为医院分配的平台商户号 | 809900000001 |
username | 支付者姓名 | String | 30 | 是 | 付款者姓名 | 张三 |
order_no | 业务单号 | String | 30 | 是 | 商户业务系统的唯一订单号 | BX20190722902141 |
paytype | 支付渠道 | String | 2 | 是 | 2=支付宝; 3=微信 | 2 |
trade_type | 交易类型 | String | 2 | 是 | 3=微信公众号/支付宝生活号支付;11=小程序支付;12=聚合码支付 | 3 |
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 | 是 | 如:门诊挂号、门诊结算、住院预交、住院结算、自助挂号、自助结算、自助住院预交等 | 门诊挂号 |
openid | 用户唯一标识 | String | 128 | 是 | 公众号支付是微信用户的(openid); 生活号支付是买家的支付宝唯一用户号(user_id) | obzBc1MlzBaU_kjt6eJvdSqs2qbA |
sub_merchant | 分店号 | String | 30 | 否 | 商户内部区分订单字段 | 001 |
paytimeout | 订单超时时间 | String | 3 | 否 | 默认5分钟,入参需要>5分钟 | 6 |
mobile | 手机号码 | String | 15 | 否 | 用户手机号 | 13211112222 |
url_success | 支付成功跳转页面 | String | 200 | 否 | 当支付渠道为微信时,选择使用平台返回的支付页面时必填 | http://xxx.merchantno.com/pay/success |
url_fail | 支付失败跳转页面 | String | 200 | 否 | 当支付渠道为微信时,选择使用平台返回的支付页面时就必填 | http://xxx.merchantno.com/pay/fail |
remark | 备注 | String | 200 | 否 | 备注 | |
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代表成功 FAIL 代表失败 | SUCCESS |
return_msg | 返回信息 | String | 128 | 否 | 返回信息 | OK |
page | 平台支付页面 | String | 否 | 返回一个完整的html页面 (微信支付渠道,选择使用平台页面时返回) | <html>...</html> |
|
appId | 公众号id | String | 16 | 否 | 商户注册具有支付权限的公众号成功后即可获得(微信支付渠道,选择使用自己页面时返回) | wx620392f81231234 |
timestamp | 时间戳 | String | 32 | 否 | 当前的时间(微信支付渠道,选择使用自己页面时返回) | 1564043634 |
nonceStr | 随机字符串 | String | 32 | 否 | 随机字符串,不长于32位(微信支付渠道,选择使用自己页面时返回) | 60e5b3e34893445cbd5b70ec658cc7f6 |
pg | 订单详情扩展字符串 | String | 128 | 否 | 微信预下单参数:prepay_id=xxx(微信支付渠道,选择使用自己页面时返回) | prepay_id=wx25163354959454421dad969a1123068900 |
signType | 签名方式 | String | 32 | 否 | 签名算法,暂支持MD5(微信支付渠道,选择使用自己页面时返回) | MD5 |
paySign | 签名 | String | 64 | 否 | 签名(微信支付渠道,选择使用自己页面时返回) | E85ABD064C0D1848B1ED75E920808631 |
order_no | 商户业务单号 | String | 30 | 否 | 聚合支付平台订单号 | zfb20190725001 |
trade_no | 支付宝交易号 | String | 32 | 否 | 当支付渠道为支付宝时返回 | 20182238193719361939131 |
- Java请求示例:
String data = "<xml>"+ "<merchant_no>809900000001</merchant_no>"+ "<sub_merchant>001</sub_merchant>"+ "<username>张三</username>"+ "<order_no>WX15640436282724809362</order_no>"+ "<paytype>3</paytype>"+ "<trade_type>3</trade_type>"+ "<total_amt>0.01</total_amt>"+ "<spbill_create_ip>10.10.10.1</spbill_create_ip>"+ "<paytimeout>6</paytimeout>"+ "<order_subject>当日挂号</order_subject>"+ "<order_detail>测试商户-当日挂号</order_detail>"+ "<openid>oLMiB0bssAezMZ64X0SxX67c4wW4</openid>"+ "<url_success>http://xxx.merchantno.com/pay/success</url_success>"+ "<url_fail>http://xxx.merchantno.com/pay/fail</url_fail>"+ "<remark>当日挂号</remark>"+ "</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","P7005"); String privateKey = [your privateKey]; String signData = "data="+data+"&developerId=[your developerId]&funcId=P7005"; 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://onlinetest.bsoftpay.com/gatewayOnline/gateway/portal/pgPayRe").setEntity(new UrlEncodedFormEntity(list, Consts.UTF_8)).build()); xml = EntityUtils.toString(response.getEntity()); } catch (Exception e) { e.printStackTrace(); } System.out.println(xml);
- 平台微信页面返回示例:
<?xml version="1.0" encoding="UTF-8"?> <Root> <Head> <MerchantNo>开发者ID</MerchantNo> <FuncId>P7005</FuncId> <RetCode>0000</RetCode> <RetMsg>相关信息,错误时才有值</RetMsg> <Signature>签名</Signature> </Head> <Body> <xml> <return_code>SUCCESS</return_code> <return_msg>OK</return_msg> <page> <html>支付页面内容</html> </page> </xml> </Body> </Root>
注意:这里返回信息中MerchantNo 是 开发者ID
平台支付页面样式案例: - 商户独立渲染页面返回示例:
<?xml version="1.0" encoding="UTF-8"?> <Root> <Head> <MerchantNo>开发者ID</MerchantNo> <FuncId>P7005</FuncId> <RetCode>0000</RetCode> <RetMsg>相关信息,错误时才有值</RetMsg> <Signature>签名</Signature> </Head> <Body> <xml> <return_code>SUCCESS</return_code> <return_msg>OK</return_msg> <appId>wx620324324aa369fba</appId> <timestamp>1564043831</timestamp> <nonceStr>210660e5f37d4cc8ad5e64d07f48a91d</nonceStr> <pg>prepay_id=wx25163711719as1321fa3126159300</pg> <signType>MD5</signType> <paySign>696463319BE48670B03211C25408616B</paySign> </xml> </Body> </Root>
注意:这里返回信息中MerchantNo 是 开发者id
3.2 交易结果查询接口
- 功能码:P2005
- 接口说明:通过该接口获取某个订单的支付结果
- 请求参数:
<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 |
InsuranceAmt | 医保金额 | Price | 16.2 | 否 | 使用了医保时返回 医保支付 |
0.01 |
ReducedAmt | 优惠金额 | Price | 16.2 | 否 | 下单使用了优惠金额时返回 医保支付 |
0.01 |
- 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://onlinetest.bsoftpay.com/gatewayOnline/gateway/portal/pgPayRe").setEntity(new UrlEncodedFormEntity(list, Consts.UTF_8)).build()); xml = EntityUtils.toString(response.getEntity()); } catch (Exception e) { e.printStackTrace(); } System.out.println(xml);
- 返回示例:
<?xml version="1.0" encoding="utf-8"?> <Root> <Head> <MerchantNo>开发者id</MerchantNo> <FuncId>P2005</FuncId> <Signature>dR20PkLHj55vZO3G6q/Z52iWyyOB2msiBeUc47TkHFHe/3QqOaCHBAdz7zio+xv61JVpBqrsZDiZGogz2y6Ujg==</Signature> <RetCode>0000</RetCode> </Head> <Body> <Data> <TradeNo>9000010155</TradeNo> <PayTradeNo>2019071622001473731042322248</PayTradeNo> <OrderNo>paymentTest201907160001</OrderNo> <Amt>0.01</Amt> <receipt_amount>0.01</receipt_amount> <PayStatus>1</PayStatus> <InsuranceAmt>0.0</InsuranceAmt> <ReducedAmt>0.0</ReducedAmt> </Data> </Body> </Root>
- 注意: P2005功能中请求参数是用
<Data></Data>
包围,不是<xml></xml>
- 注意:
返回信息中MerchantNo 是开发者id
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 |
merchant_no | 商户号 | String | 32 | 是 | 平台商户号 | 809900000001 |
cancel_bill_no | 撤销单据号 | String | 20 | 否 | 医保诊间退款必填 人社无要求则由医院自定义 |
109900000001 |
part_refund_type | 部分退款 | String | 2 | 否 | 医保退款相关 1:自费部分退款 不填写医保和现金一起退 |
1 |
request_content | 透传人社 | String | 否 | 医保退款相关 有需要透传数据到人社时填写 |
注:微信医保退款,全额退还自费部分金额或者退还自费+医保的总支付金额,无法自定义金额进行多次退款
- 响应参数:
参数 | 名称 | 类型 | 长度 | 是否必输 | 说明 | 示例 |
---|---|---|---|---|---|---|
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>" + "<cancel_bill_no>10000000000000000001</cancel_bill_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://onlinetest.bsoftpay.com/gatewayOnline/gateway/portal/pgPayRe").setEntity(new UrlEncodedFormEntity(list, Consts.UTF_8)).build()); xml = EntityUtils.toString(response.getEntity()); } catch (Exception e) { e.printStackTrace(); } System.out.println(xml);
- 返回示例:
<?xml version="1.0" encoding="utf-8"?> <Root> <Head> <MerchantNo>开发者id</MerchantNo> <FuncId>P2008</FuncId> <Signature>dR20PkLHj55vZO3G6q/Z52iWyyOB2msiBeUc47TkHFHe/3QqOaCHBAdz7zio+xv61JVpBqrsZDiZGogz2y6Ujg==</Signature> <RetCode>0000</RetCode> </Head> <Body> <Data> <RequestNo>TK123127893456798765491</RequestNo> <Amt>0.01</Amt> </Data> </Body> </Root>
- 注意: P2008功能中请求参数是用
<Data></Data>
包围,不是<xml></xml>
- 注意:
返回信息中MerchantNo 是开发者id
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 |
- 返回示例:
<?xml version="1.0" encoding="utf-8"?> <Root> <Head> <MerchantNo>开发者id</MerchantNo> <FuncId>P2009</FuncId> <Signature>dR20PkLHj55vZO3G6q/Z52iWyyOB2msiBeUc47TkHFHe/3QqOaCHBAdz7zio+xv61JVpBqrsZDiZGogz2y6Ujg==</Signature> <RetCode>0000</RetCode> </Head> <Body> <Data> <RequestNo>TK20190722001</RequestNo> <Amt>0.01</Amt> <Code>1</Code> <Msg>OK</Msg> </Data> </Body> </Root>
- 注意: P2009功能中请求参数是用
<Data></Data>
包围,不是<xml></xml>
- 注意:
返回信息中MerchantNo 是 开发者id
3.5 交易结果通知
- 功能码:P3001
- 接口说明:支付状态改变(支付或作废)后,平台异步通知用户端(平台不保证异步通知能够准时到达,建议接入方有自己的定时主动查询策略,以异步通知作为辅助查询)。交易结果通知的地址,需要提前告知平台商务对接人员进行配置。
注意:商户在接受到支付平台回调后,如果业务成功,返回 success
,失败返回 fail
,注意都是小写,不要用空格或者换行。
支付平台服务器在没有收到业务成功回调信息时,会尝试重发消息,总共3
次通知(通知的间隔频率一般是:30s,1m,2m),3 次以后将不再通知,所以不保证通知最终能成功(建议以交易结果查询接口为主,异步通知为辅,如果 3 秒左右还没有接受到异步通知,就应该主动调用交易结果查询接口)
- 响应参数:
参数 | 名称 | 类型 | 长度 | 是否必输 | 说明 | 示例 |
---|---|---|---|---|---|---|
TradeNo | 支付平台交易流水号 | String | 32 | 是 | 支付平台交易流水号 | 32013134 |
PayTradeNo | 渠道流水号 | String | 32 | 是 | 第三方支付渠道流水号 | 20192323971391918391121 |
OrderNo | 业务单号 | String | 32 | 是 | 商户内部业务单号 | wx201907150001 |
Amt | 支付金额 | Price | 16.2 | 是 | 支付金额 | 0.01 |
PayTime | 实际支付时间 | String | 16 | 是 | yyyyMMddhhmmss | 20190725123012 |
PayStatus | 支付状态 | String | 6 | 是 | 0=未支付;1=支付成功;2=支付失败;-1=关闭或撤销 | 1 |
返回示例:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Root> <Head> <MerchantNo>开发者id</MerchantNo> <FuncId>P3001</FuncId> <Timestamp>1564047104204</Timestamp> <Signature>O/qiP7mMk+aPrlyVursZRX7+lpcxpXyuwkD7wXLm2g+9k7jR2OVQUfeSUZz2ImsTwL1BwBbRNl/N8hIUrKmMJw==</Signature> </Head> <Body>q9bLT3/3k9fmPk5WBu4Z3BOLbGJBX9BoIymWbEp67FOrWlZRuBOyQ7OFyDRLRhi5RamJcI+WOsbD2vzG4KOYcZkXOgg/cU433T9URVZCxV8nUv8MlTHGSTg2Oz8Ws7slVrBTSfSuzkP6WIQ5FUSNen9UGSqVdpk155DK0iDi74TbF+5o9bSfO5fLFQVjIaqQayxjBSvOR3/3I9hKZaOVMpkIct/InCCGBliKd2dUIw1apNJJxhK75L+a1C0DD2gOyhOh8qKtFNA=</Body> </Root>
注:返回参数数据在<body>已经被DES加密,需要接入方利用对接时获取的“对称密钥”,对密文使用下载的加解密工具进行解密
注:这里回调参数中MerchantNo是开发者id
解密java示例:
String xml = SecurityUtil.decryptDes(body, [your 对称秘钥], "utf-8");
证件类型 | 证件名 |
---|---|
1 | 居民身份证 |
4 | 澳门居民往来内地通行证 |
5 | 台湾居民来往大陆通行证 |
6 | 香港居民往来内地通行证 |
7 | 外国人永久居留证 |
8 | 外 国 人 护 照 |
9 | 户 口 本 |
4. 最佳实践
- 公众号/生活号支付时序图:
说明:第三方系统在正常发起支付(P7005)或者退款(P2008)请求之后,如果在平台配置有回调地址,则正常情况下,该地址会收到支付结果通知,但是这个不能作为支付结果的唯一判断手段,平台和第三方支付平台不能保证回调通知的及时性,需要接入方做定时主动查询的策略,从而提高交易的准确性。
5. 修订记录
日期 | 修订内容 | 修订人 |
---|---|---|
2019-08-21 | 修改P2005医保查询返回参数 详见交易结果查询,P2008退款传递参数,详见交易退款 | denghui |