目录:

  1. 场景介绍
  2. 接入指引
    2.1 准备工作
    2.2 接口调用规范
    2.2.1 请求说明
  3. API列表
    3.1 微信公众号/支付宝生活号预下单
    3.2 交易结果查询接口
    3.3 交易退款接口
    3.4 交易退款结果查询接口
    3.5 交易结果通知
  4. 最佳实践
  5. 修订记录

1. 场景介绍

公众号/生活号支付是用户在微信/支付宝中打开商户的H5页面,商户在H5页面通过调用微信/支付宝支付提供的接口调起微信/支付宝支付模块完成支付。应用场景有:

◆ 用户在微信公众账号内进入商家公众号,或支付宝账号内进入商家生活号,打开某个主页面,完成支付
◆ 用户的好友在朋友圈、聊天窗口等分享商家页面连接,用户点击链接打开商家页面,完成支付
◆ 将商户页面转换成二维码,用户扫描二维码后在微信/支付宝浏览器中打开页面后完成支付

注:支付宝生活号和微信公众号内只能唤起各自内部的支付,第三方支付公司不允许唤起其他支付方式,请在做产品设计前了解

2. 接入指引

2.1 准备工作

第一步、获取开发者数据

调用聚合支付平台接口,需要与平台商务对接后,获取开发者ID(developId),密钥(privateKey),公钥(publicKey)和对称密钥(desKey),这些参数让商户拥有调用平台接口的权限,对请求的数据进行加密以保证数据的安全性。

  • 开发者ID(developerId):
      developerId在所有的请求中都需要传入,与密钥公钥信息相对应,鉴别请求是否是由平台商户发起。
  • 密钥(privateKey):
      密钥在接口请求中用于对数据进行RSA加密,生成签名sign。
  • 公钥(publicKey):
      公钥用于对签名进行解密
  • 对称密钥(desKey):
      在线上支付中,<body>标签的中的参数,需要通过des进行对称加密,得到密文进行请求。

第二步、获取平台商户号

每个商户对接聚合支付平台,在第三方平台想要拥有的支付能力,需要在支付宝或者微信签约对应的支付方式,平台的商务会为每个商户分配一个平台商户号(merchantNo),该商户号账户下所有的交易流水都会进入到对应的支付宝和微信的账户下,并且平台账单流水都是以商户号进行隔离,这是一个非常重要的参数。

第三步、下载demo

2.2 接口调用规范

2.2.1 请求说明
参数 类型 是否必填 最大长度 描述 示例
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
文档更新时间: 2023-01-30 13:51   作者:甘世敏