文档名称

被扫获取openid

文档说明:

本文档用于统一付款码支付之前获取openid的操作。

文档版本:

版本号 修定人 制定日期 修订日期
2.2.0 杨铝杰 2021-03-06 2021-03-06

背景介绍:

流程说明:

使用场景:

用户在支付之前,通过条码获取当前用户的openid

请求 url:

https://pay.xrtpay.cn/xrtpay/gateway

请求参数列表

POST XML 内容体进行请求

字段名 变量名 必填 类型 说明
业务参数 ———— ———— ———— ————
接口类型 service String(32) unified.tools.authcodetoopenid
版本号 version String(8) 默认值是 2.0
字符集 charset String(8) 可选值 UTF-8,默认为 UTF-8
签名方式 sign_type String(8) 取值:MD5 默认: MD5
商户号 mch_id String(32) 商户号, 由技术部分配
公众号ID(微信) sub_appid string(32) 商户申请的公众帐号appid
授权码 auth_code String(128) 扫码支付授权码, 设备读取用户展示的条码或者二维码信息
随机字符串 nonce_str String(32) 随机字符串, 不长于 32 位
签名 sign String(32) MD5 签名结果, 详见“ 下文数字签名 MD5 签名规则”
返回结果

数据按 XML 的格式实时返回

字段名 变量名 必填 类型 说明
版本号 version String(8) version 默认值是 2.0。
字符集 charset String(8) 可选值 UTF-8,默认为 UTF-8。
签名方式 sign_type String(8) 取值: MD5 默认: MD5
返回状态码 status String(16) 0 表示成功非0 表示失败此字段是通信标识,非交易标识,交易是否成功需要查看 result_code 来判断
返回信息 message String(128) 返回信息,如非空,为错误原因签名失败参数格式校验错误
以下字段在 status 为 0 的时候有返回
业务结果 result_code String(16) 0 表示成功非 0 表示失败
商户号 mch_id String(32) 商户号, 由技术部分配
随机字符串 nonce_str String(32) 随机字符串, 不长于 32 位
错误代码 err_code String(32) 具体错误码请看文档最后错误码列表
错误代码描述 err_msg String (128) 结果信息描述
结果信息描述 sign String(32 MD5 签名结果, 详见“下文数字签名 签名规则”
以下字段在 status 和 result_code 都为 0 的时候有返回
用户标识 openid String(128) 用户在商户 appid 下的唯一标识
公众账号ID appid String 子商户 appid
用户标识 openid openid String(128) 用户在商户 appid 下的唯一标识
子商户 appid sub_appid String 子商户 appid
子商户用户 openid sub_openid String(128) 用户在商户 sub_appid 下的唯一标识

数据格式:

采用 HTTPS 标准的 POST 协议, 为了保证接收方接收数据正确,传输数据必须签名。

<xml>
<service>unified.trade.micropay</service>
<attach><![CDATA[att]]></attach>
<body><![CDATA[支付测试]]></body>
<device_info>1000</device_info>
<mch_id>10000100</mch_id>
<nonce_str>adf880d5c8986bd0deb6423c92c9d948</nonce_str>
<out_trade_no>1406046836</out_trade_no>
<spbill_create_ip>127.0.0.1</spbill_create_ip>
<total_fee>1</total_fee>
<sign><![CDATA[F53145E553092CE52E4CAA4D2B49A91C]]></sign>
</xml
XML 数据格式

采用标准 XML 协议, 所有参数只存在一级节点中, 不采用多级节点嵌套。
协议级错误返回:

<xml>
<status>500</status>
<message><![CDATA[SYSERR]]></message>
</xml>

正确返回数据:

<xml>
<status>0</status>
<message><![CDATA[OK]]></message>
<appid><![CDATA[wx2421b1c4370ec43b]]></appid>
<mch_id><![CDATA[10000100]]></mch_id>
<device_info><![CDATA[1000]]></device_info>
<nonce_str><![CDATA[FvYSnPuFFPkAr77M]]></nonce_str>
<sign><![CDATA[63238039D6E43634297CF2A6EB5F3B72]]></sign>
<result_code>0</result_code>
<openid><![CDATA[oUpF8uN95-Ptaags6E_roPHg7AG0]]></openid>
<is_subscribe><![CDATA[Y]]></is_subscribe>
<trade_type><![CDATA[MICROPAY]]></trade_type>
<bank_type><![CDATA[CCB_CREDIT]]></bank_type>
<total_fee>1</total_fee>
<coupon_fee>0</coupon_fee>
<fee_type><![CDATA[CNY]]></fee_type>
<transaction_id><![CDATA[1008450740201407220000058756]]></transaction_id>
<out_trade_no><![CDATA[1406033828]]></out_trade_no>
<attach><![CDATA[att]]></attach>
<time_end><![CDATA[20140722160655]]></time_end>
</xml>

业务级错误返回:

<xml>
<status>0</status>
<message><![CDATA[OK]]></message>
<appid><![CDATA[wx2421b1c4370ec43b]]></appid>
<mch_id><![CDATA[10000100]]></mch_id>
<device_info><![CDATA[1000]]></device_info>
<nonce_str><![CDATA[sthBJ9QyUG6vkrjJ]]></nonce_str>
<sign><![CDATA[6277A96D7875D4FF23AA7B6A4C3046AB]]></sign>
<result_code>1</result_code>
<err_code><![CDATA[AUTHCODE_EXPIRE]]></err_code>
<err_code_des><![CDATA[二维码已过期, 请刷新再试]]></err_code_des>
</xml>

一般有返回有 status 参数, 0 表示调用成功; 非 0 表示调用失败。

数字签名:

为了保证数据传输过程中的数据真实性和完整性, 我们需要对数据进行数字签名, 在接收签名数据之后进行签名校验。
数字签名有两个步骤, 先按一定规则拼接要签名的原始串, 再选择具体的算法和密钥计算出签名结果。
一般失败的结果不签名。

签名原始串

无论是请求还是应答, 签名原始串按以下方式组装成字符串:
1、 除 sign 字段外, 所有参数按照字段名的 ascii 码从小到大排序后使用 QueryString 的格式(即key1=value1&key2=value2…) 拼接而成, 空值不传递, 不参与签名组串。
2、 签名原始串中, 字段名和字段值都采用原始值, 不进行 URL Encode。
3、 …返回的应答或通知消息可能会由于升级增加参数, 请验证应答签名时注意允许这种情况。
举例:
调用某个接口, 接口有如下字段:

<xml><body><![CDATA[测试支付]]></body>
<mch_create_ip><![CDATA[127.0.0.1]]></mch_create_ip>
<mch_id><![CDATA[001075552110006]]></mch_id>
<nonce_str><![CDATA[1409196838]]></nonce_str>
<notify_url><![CDATA[http://227.0.0.1:9001/javak/sds?123&23=3]]></notify_url>
<out_trade_no><![CDATA[141903606228]]></out_trade_no>
<service><![CDATA[unified.trade.micropay]]></service>
<sign><![CDATA[83684D9546F261997EFF2ECFAC372583]]></sign>
<total_fee><![CDATA[1]]></total_fee>
</xml>
正确的签名字段排序为:
body=测试支付
&mch_create_ip=127.0.0.1&mch_id=001075552110006&nonce_str=1409196838&notify_url=http://227.0.0.1:9001/javak/sds?123&23=3&out_trade_no=141903606228&service=pay.
weixin.scancode&total_fee=1
签名算法

目前暂只支持 MD5 签名
MD5 签名
MD5 是一种摘要生成算法, 通过在签名原始串后加上商户通信密钥的内容, 进行 MD5 运算, 形成的摘要字符串即为签名结果。 为了方便比较, 签名结果统一转换为大写字符。
注意: 签名时将字符串转化成字节流时指定的编码字符集应与参数 charset 一致。
MD5 签名计算公式:
sign = Md5(原字符串&key=商户密钥). toUpperCase
如:
假设以下为 XML 传入参数:

<xml><body><![CDATA[测试支付]]></body>
<mch_create_ip><![CDATA[127.0.0.1]]></mch_create_ip>
<mch_id><![CDATA[001075552110006]]></mch_id>
<nonce_str><![CDATA[1409196838]]></nonce_str>
<notify_url><![CDATA[http://227.0.0.1:9001/javak/sds?123&23=3]]></notify_url>
<out_trade_no><![CDATA[141903606228]]></out_trade_no>
<service><![CDATA[unified.trade.micropay]]></service>
<sign><![CDATA[83684D9546F261997EFF2ECFAC372583]]></sign>
<total_fee><![CDATA[1]]></total_fee>
</xml>

假设商户密钥为: e1cf0ddcf6b47b59c351565d8ad717af
i: 经过 a 过程 URL 键值对字典序排序后的字符串 string1 为:
body=测试支付
&mch_create_ip=127.0.0.1&mch_id=001075552110006&nonce_str=1409196838&notify_url=http://227.0.0.1:9001/javak/sds?123&23=3&out_trade_no=141903606228&service=pay.weixin.scancode&total_fee=1
ii: 经过 b 过程后得到 sign 为:
sign=md5(string1&key=e1cf0ddcf6b47b59c351565d8ad717af).toUpperCase
=md5(body=测试支付
&mch_create_ip=127.0.0.1&mch_id=001075552110006&nonce_str=1409196838&notify_url=http://227.0.0.1:9001/javak/sds?123&23=3&out_trade_no=141903606228&service=unified.trade.micropay&total_fee=1&key=e1cf0ddcf6b47b59c351565d8ad717af).toUpperCase()
=”83684D9546F261997EFF2ECFAC372583”

问题排查:

备注:

  • 更多返回错误代码请看首页的错误代码描述
文档更新时间: 2021-03-11 16:49   作者:EricYang