文档名称
统一预授权接口文档
文档说明:
本文件描述微信或者支付宝用于预授权业务解决方案。供内部相关开发和技术支持人员与商户平台服务方技术人员使用。文档分别从交互模式、签名、接口、注意事项等方面详细介绍了工作方式和开发过程,可以帮助开发人员快速入门并掌握开发技能,同时也可以作为日后接口参数以及参数类型的速查手册。
文档版本:
版本号 | 修定人 | 制定日期 | 修订日期 |
---|---|---|---|
1.0.0 | 杨铝杰 | 2020-04-22 | 2020-04-22 |
1.0.1 | 杨铝杰 | 2020-04-22 | 2020-08-14 |
文档变更说明:
2020年8月14日
查询接口添加新的参数,包括商户预授权完成单号,商户预授权完成撤销单号,商户预授权撤销单号,平台预授权完成单号,平台预授权撤销单号,平台预授权完成撤销单号。
背景介绍:
无
流程说明:
业务实现流程
小额支付业务
使用场景:
用于需要用到预授权业务的场景,比如酒店等
接口说明:
被扫预授权
业务功能
收银员使用扫码设备读取微信用户刷卡授权码以后, 二维码或条码信息传送至商户收银台, 由商户收银台或者商户后台调用该接口发起支付对用户进行预授权
交互模式
请求: 后台请求交互模式
返回结果: 后台请求交互模式
请求 url:
https://pay.xrtpay.cn/xrtpay/gateway
请求参数列表
POST XML 内容体进行请求
字段名 | 变量名 | 必填 | 类型 | 说明 |
---|---|---|---|---|
业务参数 | ———— | ———— | ———— | ———— |
接口类型 | service | 是 | String(32) | unified.pre_auth.micropay |
版本号 | version | 否 | String(8) | 默认值是 2.0 |
字符集 | charset | 否 | String(8) | 可选值 UTF-8,默认为 UTF-8 |
签名方式 | sign_type | 否 | String(8) | 取值:MD5 默认: MD5 |
商户号 | mch_id | 是 | String(32) | 商户号, 由技术部分配 |
商户订单号 | out_pre_auth_no | 是 | String(32) | 商户预授权订单号,确保在商户系统唯一 |
设备号 | device_info | 是 | String(32) | 终端设备号(开头匹配类型统计) |
商品描述 | body | 是 | String(127) | 商品描述 |
附加信息 | attach | 否 | String(128) | 商户附加信息,可做扩展参数, 255 字符内 |
总金额 | pre_auth_fee | 是 | Int | 总金额,以分为单位,不允许包含任何字、符号 |
终端 IP | mch_create_ip | 是 | String(16) | 订单生成的机器 IP |
授权码 | auth_code | 是 | String(128) | 扫码支付授权码, 设备读取用户展示的条码或者二维码信息 |
订单日期 | trade_date | 是 | String(8) | 订单生成日期,如20200422 |
订单时间 | trade_time | 是 | String(8) | 订单时间,如202020 |
随机字符串 | 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) | 商户号, 由技术部分配 |
设备号 | device_info | 否 | 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 下的唯一标识 |
---|---|---|---|---|
交易类型 | trade_type | 是 | String(16) | pay.weixin.micropaypay.qq.micropaypay.alipay.micropay |
预授权结果 | pre_auth_result | 是 | Int | 0-成功,其它-失败 |
预授权结果信息 | pre_auth_info | 是 | String | 预授权结果信息为 0-时,该字段为空 |
平台预授权订单号 | pre_auth_no | 是 | String(32) | 平台预授权订单号,可用于后续预授权交易 |
授权标识应答码 | authid_resp_code | 是 | String(32) | 成功时响应 |
商户预授权订单号 | out_pre_auth_no | 是 | String(32) | 商户预授权订单号,可用于后续预授权交易 |
总金额 | pre_auth_fee | 是 | Int | 总金额, 以分为单位, 不允许包含任何字、符号 |
用户 openid | openid | 否 | String(128) | 用户在受理商户 appid 下的唯一标识 |
买家支付宝账号 | buyer_logon_id | 否 | String(128) | 买家支付宝账号 |
买家支付宝用户 ID | buyer_user_id | 否 | String(128) | 买家在支付宝的用户 id |
卡号唯一标识(云 闪付) | cardnod | 否 | String(128) | 买家卡号对应的唯一标识 |
脱敏卡号(云闪付) | ds_cardno | 否 | String(128) | 脱敏后卡号,前 6 后 4,中间为* |
附加信息 | attach | 否 | String(128) | 商家数据包, 原样返回 |
是否原生支付 | is_raw | 否 | String(1) | 是否原生支付 1-是 其他-否 |
预授权时间 | time_end | 是 | String(14) | 完成预授权交易的时间,格式为 yyyyMMddHHmmss,如 2009 年 12 月 27 日 9 点 10 分 10 秒表示为 20091227091010。时区为 GMT+8 beijing。该时间取自平台服务器 |
当调用扣款接口返回支付中或失败状态, 需要调用查询接口查询订单实际支付状态 。 当遇到用户超过日限额需要输入密码返回“支付中” 的状态, 建议 10 秒调一次查询, 调用 3 次后还未成功作支付超时处理。
预授权查询接口
业务功能
当支付返回失败, 或收银系统超时需要取消交易, 可以调用该接口。 接口逻辑 : 支付失败的关单, 支付成功的撤销支付。 注意: 支付成功的单如需实现相同功能请调用退款接口。
交互模式
请求: 后台请求交互模式
返回结果: 后台请求交互模式
请求 url:
https://pay.xrtpay.cn/xrtpay/gateway
请求参数列表
POST XML 内容体进行请求
字段名 | 变量名 | 必填 | 类型 | 说明 |
---|---|---|---|---|
业务参数 | ———— | ———— | ———— | ———— |
接口类型 | service | 是 | String(32) | unified.pre_auth.query |
版本号 | version | 否 | String(8) | 默认值是 2.0 |
字符集 | charset | 否 | String(8) | 可选值UTF-8,默认为 UTF-8 |
签名方式 | sign_type | 否 | String(8) | 取值:MD5 默认:MD5 |
商户号 | mch_id | 是 | String(32) | 商户号,由技术部分配 |
商户预授权单号 | out_pre_auth_no | 是 | String(32) | 商户预授权单号 |
商户预授权撤销单号 | out_pre_auth_refund_no | 是 | String(32) | 商户预授权撤销单号 |
商户预授权完成单号 | out_pre_auth_done_no | 是 | String(32) | 商户预授权完成单号 |
预授权完成撤销单号 | out_pre_auth_done_refund_no | 是 | String(32) | 商户预授权完成单号 |
平台预授权单号 | pre_auth_no | 是 | String(32) | 平台预授权单号 |
平台预授权撤销单号 | pre_auth_refund_no | 是 | String(32) | 平台预授权撤销单号 |
平台预授权完成单号 | pre_auth_done_no | 是 | String(32) | 平台预授权完成单号 |
平台预授权完成撤销单号 | pre_auth_done_refund_no | 是 | String(32) | 平台预授权完成撤销单号 |
原订单日期 | old_trade_date | 是 | String(32) | 原订单日期 YYYYMMDD,对应各个单号的发起日期 |
随机字符串 | nonce_str | 是 | String(32) | 随机字符串,不长于32位 |
签名 | sign | 是 | String(32) | MD5 签名结果,详见“下文数字签名 MD5 签名规则” |
返回结果
数据按 XML 的格式实时返回
字段名 | 变量名 | 必填 | 类型 | 说明 |
---|---|---|---|---|
版本号 | version | 是 | String(8) | 默认值是 2.0。 |
字符集 | charset | 是 | String(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) | 商户号, 由技术人员分配 |
设备号 | device_info | 是 | String(32) | 商户号, 由技术人员分配 |
随机字符串 | nonce_str | 是 | String(32) | 随机字符串, 不长于 32 位 |
错误代码 | err_code | 否 | String(32) | 具体错误码请看文档最后错误码列表 |
错误代码描述 | err_msg | 否 | String(128) | 结果信息描述 |
签名 | sign | 是 | String(32) | MD5 签名结果, 详见“下文数字签名 MD5 签名规则” |
以下字段在 status 为 0 和result_code为0 的时候有返回 |
---|
订单状态 | trade_state | 是 | String(31) | 0—成功 1-失败 2-帐态未明 |
---|
以下字段在 trade_state 为 “0” 是返回
查询交易类型为预授权订单时返回如下字段
商户预授权单号 | out_pre_auth_no | 是 | String(64) | 商户预授权订单号 |
---|---|---|---|---|
平台预授权单号 | pre_auth_no | 是 | String(64) | 平台预授权订单号 |
交易类型 | trade_type | 是 | String | pay.weixin.micropay / pay.alipay.micropay |
预授权交易时间 | time_end | 是 | String(14) | 支付完成时间,格式为 yyyyMMddHHmmss,如 2009 年 12 月 27 日 9 点 10 分 10 秒表示为 20091227091010。时 区为 GMT+8 beijing。该时间取自平台服务器 |
授权标识应答码 | authid_resp_code | 是 | String(32) | 预授权成功时响应 |
用户openid | openid | 否 | String(128) | 用户在受理商户 appid 下的唯一标识 |
买家支付宝账号 | buyer_logon_id | 否 | String(64) | 买家支付宝账号 |
买家支付宝用户ID | buyer_user_id | 否 | String(28) | 买家在支付宝的用户id |
查询交易类型为预授权撤销订单时返回如下字段:
商户预授权撤销单号 | out_pre_auth_refund_no | 否 | String(64) | 商户预授权撤销单号 |
---|---|---|---|---|
平台预授权撤销单号 | pre_auth_refund_no | 否 | String(64) | 平台预授权撤销单号 |
平台预授权单号 | pre_auth_no | 是 | String(64) | 平台预授权订单号 |
商户预授权单号 | out_pre_auth_no | 是 | String(64) | 商户预授权订单号 |
预授权金额 | pre_auth_fee | 是 | Int | 以分为单位,不允许包含任何字、符号 |
预授权撤销时间 | time_end | 是 | String(14) | 支付完成时间,格式为 yyyyMMddHHmmss,如 2009 年 12 月 27 日 9 点 10 分 10 秒表示为 20091227091010。时 区为 GMT+8 beijing。该时间取自平台服务器 |
授权标识应答码 | authid_resp_code | 是 | String(32) | 成功时响应 |
查询交易类型为预授权完成订单时返回如下字段:
商户预授权完成单号 | out_pre_auth_done_no | 否 | String(64) | 商户预授权完成单号 |
---|---|---|---|---|
平台预授权完成单号 | pre_auth_done_no | 否 | String(64) | 平台预授权完成单号 |
商户预授权单号 | out_pre_auth_no | 是 | String(64) | 商户预授权订单号 |
平台预授权单号 | pre_auth_no | 是 | String(64) | 平台预授权订单号 |
预授权金额 | pre_auth_fee | 是 | Int | 以分为单位,不允许包含任何字、符号 |
预授权完成金额 | pre_auth_done_fee | 否 | Int | 格式同上 |
预授权撤销时间 | time_end | 是 | String(14) | 支付完成时间,格式为 yyyyMMddHHmmss,如 2009 年 12 月 27 日 9 点 10 分 10 秒表示为 20091227091010。时 区为 GMT+8 beijing。该时间取自平台服务器 |
授权标识应答码 | authid_resp_code | 是 | String(32) | 成功时响应 |
查询交易类型为预授权完成撤销订单时返回如下字段:
商户预授权单号 | out_pre_auth_no | 是 | String(64) | 商户预授权订单号 |
---|---|---|---|---|
平台预授权单号 | pre_auth_no | 是 | String(64) | 平台预授权订单号 |
商户预授权完成撤销单号 | out_pre_auth_done_refund_no | 否 | String(64) | 商户预授权完成撤销单号,trade_state 为 1 且发起过预授 权完成撤销时存在 |
平台预授权完成撤销单号 | pre_auth_done_refund_no | 否 | String(64) | 平台预授权完成撤销单号,trade_state 为 1 且发起过预授 权完成撤销时存在 |
预授权金额 | pre_auth_fee | 是 | Int | 以分为单位,不允许包含任何字、符号 |
预授权完成撤销交易时间 | pre_auth_done_refund_time | 否 | String(14) | 格式为 yyyyMMddHHmmss,如 2009 年 12 月 27 日 9 点 10 分 10 秒表示为 20091227091010。时 区为 GMT+8 beijing。该时间取自平台服务器 |
授权标识应答码 | authid_resp_code | 是 | String(32) | 预授权成功时响应的授权标识应答码 |
预授权撤消接口
业务功能
根据当交易发生之后一段时间内,由于买家或者卖家的原因需要退款时,卖家可以通过退款接口将支付款退还 给买家,银联将在收到退款请求并且验证成功之后,按照退款规则将支付款按原路退到买家帐号上。交易超 过约定时间(签约时设置的可退款时间)的订单无法进行退款。
交互模式
请求: 后台请求交互模式
返回结果: 后台请求交互模式
请求 url:
https://pay.xrtpay.cn/xrtpay/gateway
请求参数列表
POST XML 内容体进行请求
字段名 | 变量名 | 必填 | 类型 | 说明 |
---|---|---|---|---|
业务参数 | ———— | ———— | ———— | ———— |
接口类型 | service | 是 | String(32) | unified.micropay.pre_auth_refund |
版本号 | version | 否 | String(8) | 默认值是 2.0 |
字符集 | charset | 否 | String(8) | 可选值UTF-8,默认为 UTF-8 |
签名方式 | sign_type | 否 | String(8) | 取值:MD5 默认:MD5 |
商户号 | mch_id | 是 | String(32) | 商户号,由技术部分配 |
订单日期 | trade_date | 是 | String(8) | yyyymmdd,如 20190920 |
订单时间 | trade_time | 是 | String(6) | HHMMSS,如 190209 |
商户预授权单号 | out_pre_auth_no | 否 | String(64) | 商户系统内部的原预授权交易订单 号out_pre_auth_no和 pre_auth_no 至少一个必 填,同时存在时 pre_auth_no 优先 |
平台预授权单号 | pre_auth_no | 否 | String(64) | 原预授权交易平台订单号, out_pre_auth_no 和 pre_auth_no 至少一个必填,同时存在时 pre_auth_no 优先 |
授权标识应答码 | authid_resp_code | 是 | String(32) | 预授权成功时响应的授权标识应答码 |
商户预授权撤销单号 | out_pre_auth_refund_no | 是 | String(64) | 商户预授权撤销单号,32 个字符内、可包含字母, 确保在商户系统唯一。同个预授权撤销单号多次请 求,平台当一个单处理,只会退一次款。如果出现退款不成功,请采用预授权撤销单号重新发起,避 免出现重复撤销。撤销金额与原预授权金额一致 |
原预授权订单日期 | old_trade_date | 是 | String(8) | 原预授权订单日期 YYYYMMDD |
随机字符串 | nonce_str | 是 | String(32) | 随机字符串,不长于32位 |
签名 | sign | 是 | String(32) | MD5 签名结果,详见“下文数字签名 MD5 签名规则” |
返回结果
数据按 XML 的格式实时返回
字段名 | 变量名 | 必填 | 类型 | 说明 |
---|---|---|---|---|
版本号 | version | 是 | String(8) | 默认值是 2.0。 |
字符集 | charset | 是 | String(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) | 商户号, 由技术人员分配 |
设备号 | device_info | 否 | String(32) | 终端设备号 |
随机字符串 | nonce_str | 是 | String(32) | 随机字符串, 不长于 32 位 |
错误代码 | err_code | 否 | String(32) | 具体错误码请看文档最后错误码列表 |
错误代码描述 | err_msg | 否 | String(128) | 结果信息描述 |
签名 | sign | 是 | String(32) | MD5 签名结果, 详见“下文数字签名 MD5 签名规则” |
以下字段在 status 和 result_code 都为 0 的时候有返回 |
---|
商户预授权单号 | out_pre_auth_no | 是 | String(64) | 商户预授权订单号 |
---|---|---|---|---|
平台预授权单号 | pre_auth_no | 是 | String(64) | |
商户预授权撤销单号 | out_pre_auth_refund_no | 是 | String(64) | |
平台预授权撤销单号 | pre_auth_refund_no | 是 | String(64) | |
预授权金额 | pre_auth_fee | 是 | Int | 以分为单位,撤销的预授权金额 |
预授权撤销时间 | time_end | 是 | String(14) | 完成预授权撤销交易的时间,格式为 yyyyMMddHHmmss,如 2009 年 12 月 27 日 9 点 10 分 10 秒表示为 20091227091010。时区为 GMT+8 beijing。该时间取自平台服务器 |
预授权完成接口
业务功能
根据当交易发生之后一段时间内,由于买家或者卖家的原因需要退款时,卖家可以通过退款接口将支付款退还 给买家,银联将在收到退款请求并且验证成功之后,按照退款规则将支付款按原路退到买家帐号上。交易超 过约定时间(签约时设置的可退款时间)的订单无法进行退款。
交互模式
请求: 后台请求交互模式
返回结果: 后台请求交互模式
请求 url:
https://pay.xrtpay.cn/xrtpay/gateway
请求参数列表
POST XML 内容体进行请求
字段名 | 变量名 | 必填 | 类型 | 说明 |
---|---|---|---|---|
业务参数 | ———— | ———— | ———— | ———— |
接口类型 | service | 是 | String(32) | unified.micropay.pre_auth_done |
版本号 | version | 否 | String(8) | 默认值是 2.0 |
字符集 | charset | 否 | String(8) | 可选值UTF-8,默认为 UTF-8 |
签名方式 | sign_type | 否 | String(8) | 取值:MD5 默认:MD5 |
商户号 | mch_id | 是 | String(32) | 商户号,由技术部分配 |
订单日期 | trade_date | 是 | String(8) | yyyymmdd,如 20190920 |
订单时间 | trade_time | 是 | String(6) | HHMMSS,如 190209 |
商户预授权单号 | out_pre_auth_no | 否 | String(64) | 商户系统内部的原预授权交易订单 号, out_pre_auth_no和 pre_auth_no 至少一个必填,同时存在时 pre_auth_no 优先 |
平台预授权单号 | pre_auth_no | 否 | String(64) | 原预授权交易平台订单号, out_pre_auth_no 和 pre_auth_no 至少一个必填,同时存在时 pre_auth_no 优先 |
授权标识应答码 | authid_resp_code | 是 | String(32) | 预授权成功时响应的授权标识应答码 |
商户预授权完成单号 | out_pre_auth_done_no | 是 | String(64) | 商户预授权完成单号,32 个字符内、可包含字母, 确保在商户系统唯一。 |
原预授权订单日期 | old_trade_date | 是 | String(8) | 原预授权订单日期 YYYYMMDD |
预授权完成金额 | pre_auth_done_fee | 是 | Int | 订单总金额,单位为分,不能超过原预授权金额 |
随机字符串 | nonce_str | 是 | String(32) | 随机字符串,不长于32位 |
签名 | sign | 是 | String(32) | MD5 签名结果,详见“下文数字签名 MD5 签名规则” |
返回结果
数据按 XML 的格式实时返回
字段名 | 变量名 | 必填 | 类型 | 说明 |
---|---|---|---|---|
版本号 | version | 是 | String(8) | 默认值是 2.0。 |
字符集 | charset | 是 | String(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 签名结果, 详见“下文数字签名 MD5 签名规则” |
以下字段在 status 和 result_code 都为 0 的时候有返回 |
---|
商户预授权单号 | out_pre_auth_no | 是 | String(64) | 商户预授权订单号 |
---|---|---|---|---|
平台预授权单号 | pre_auth_no | 是 | String(64) | |
平台预授权完成单号 | pre_auth_done_no | 是 | String(64) | |
商户预授权完成单号 | out_pre_auth_done_no | 是 | String(64) | 商户系统内部的订单号,用于预授权完成撤销 |
预授权金额 | pre_auth_fee | 是 | Int | 以分为单位 |
预授权完成金额 | pre_auth_done_fee | 是 | Int | 以分为单位 |
预授权完成时间 | time_end | 是 | String(14) | 完成预授权完成交易的时间,格式为 yyyyMMddHHmmss,如 2009 年 12 月 27 日 9 点 10 分 10 秒表示为 20091227091010。时区为 GMT+8 beijing。该时间取自平台服务器 |
预授权完成撤销接口
业务功能
根据当交易发生之后一段时间内,由于买家或者卖家的原因需要退款时,卖家可以通过退款接口将支付款退还 给买家,银联将在收到退款请求并且验证成功之后,按照退款规则将支付款按原路退到买家帐号上。交易超 过约定时间(签约时设置的可退款时间)的订单无法进行退款。
交互模式
请求: 后台请求交互模式
返回结果: 后台请求交互模式
请求 url:
https://pay.xrtpay.cn/xrtpay/gateway
请求参数列表
POST XML 内容体进行请求
字段名 | 变量名 | 必填 | 类型 | 说明 |
---|---|---|---|---|
业务参数 | ———— | ———— | ———— | ———— |
接口类型 | service | 是 | String(32) | unified.micropay.pre_auth_done_refund |
版本号 | version | 否 | String(8) | 默认值是 2.0 |
字符集 | charset | 否 | String(8) | 可选值UTF-8,默认为 UTF-8 |
签名方式 | sign_type | 否 | String(8) | 取值:MD5 默认:MD5 |
商户号 | mch_id | 是 | String(32) | 商户号,由技术部分配 |
订单日期 | trade_date | 是 | String(8) | yyyymmdd,如 20190920 |
订单时间 | trade_time | 是 | String(6) | HHMMSS,如 190209 |
商户预授权完成单号 | out_pre_auth_done_no | 否 | String(64) | 商户系统内部的原预授权完成订单 号, out_pre_auth_done_no 和 pre_auth_done_no 至少一个必填,同时存在时 pre_auth_done_no 优先 |
平台预授权完成单号 | pre_auth_done_no | 否 | String(64) | 原预授权完成平台订单 号, out_pre_auth_done_no 和 pre_auth_done_no 至少一个必填,同时存在时 pre_auth_done_no 优先 |
授权标识应答码 | authid_resp_code | 是 | String(32) | 预授权成功时响应的授权标识应答码 |
商户预授权完成撤销单号 | out_pre_auth_done_refund_no | 是 | String(64) | 商户预授权完成撤销单号,32 个字符内、可包含 字母,确保在商户系统唯一。 |
原预授权完成订单日期 | old_trade_date | 是 | String(8) | 原预授权完成订单日期 YYYYMMDD |
随机字符串 | nonce_str | 是 | String(32) | 随机字符串,不长于32位 |
签名 | sign | 是 | String(32) | MD5 签名结果,详见“下文数字签名 MD5 签名规则” |
返回结果
数据按 XML 的格式实时返回
字段名 | 变量名 | 必填 | 类型 | 说明 |
---|---|---|---|---|
版本号 | version | 是 | String(8) | 默认值是 2.0。 |
字符集 | charset | 是 | String(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 签名结果, 详见“下文数字签名 MD5 签名规则” |
以下字段在 status 和 result_code 都为 0 的时候有返回 |
---|
商户预授权单号 | out_pre_auth_no | 是 | String(64) | 商户预授权订单号 |
---|---|---|---|---|
平台预授权完成单号 | pre_auth_done_no | 是 | String(64) | |
平台预授权完成撤销单号 | pre_auth_done_refund_no | 是 | String(64) | |
商户预授权完成撤销单号 | out_pre_auth_done_refund_no | 是 | String(64) | |
预授权完成金额 | pre_auth_done_fee | 是 | Int | 以分为单位,撤销的预授权完成金额 |
预授权完成撤销时间 | time_end | 是 | String(14) | 完成预授权完成交易的时间,格式为 yyyyMMddHHmmss,如 2009 年 12 月 27 日 9 点 10 分 10 秒表示为 20091227091010。时区为 GMT+8 beijing。该时间取自平台服务器 |
数据格式:
采用 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¬ify_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¬ify_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¬ify_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”
注意事项:
1、 所有涉及到金额的单位都是分,最小的单位是 1 分,不能有小数出现
2、 其它注意事项
( 1) 参数大小写问题
请留意文档中要求的字符大小写问题, 如 “ md5 运算后, 字符串的字符要转换为大写” 。
( 2) 参数格式问题
所有传入参数,均为字符串类型,请注意文档中各处的具体要求。
( 3) 时间戳问题
请使用 Linux 时间戳, 注意为字符串格式。 精确到秒, 不需要到毫秒, 即 10 位数字。
( 4) 同一商户订单号支付问题
商户的 out_trade_no 必须全局唯一, 调试和生产环境, 都需要使用唯一的订单号。 注意:
当商户的同一个商户号绑定了多种支付方式也需要加标识来区分,不能出现重复。当发起支付返回失败时一定要用原订单的 out_trade_no 而不能重新生成新的订单号发起支付,避免同一单重复支付。
错误码 | 说明 | 类型 |
---|---|---|
66227001 | 商户签名校验失败 | QQ 钱包 |
66227002 | 商户没有 QQ 钱包支付权限 | QQ 钱包 |
66227003 | 不在扫码支付的允许列表 | QQ 钱包 |
66227004 | 字符集转换失败 | QQ 钱包 |
66227005 | 需要用户输入支付密码 | QQ 钱包 |
66227006 | 用户授权码无效 | QQ 钱包 |
66227007 | 用户证书非法 | QQ 钱包 |
66227008 | 余额不足 | QQ 钱包 |
66227009 | 撤单失败, 订单已撤单 | QQ 钱包 |
66227010 | 撤单失败, 订单已支付成功 | QQ 钱包 |
66227011 | 撤单失败, 订单已退款 | QQ 钱包 |
TRADE_SETTLE_ERROR | 分账信息校验失败 | 支付宝 |
TRADE_BUYER_NOT_MATCH | 交易买家不匹配 | 支付宝 |
CONTEXT_INCONSISTENT | 交易信息被篡改 | 支付宝 |
TRADE_HAS_SUCCESS | 交易已经支付 | 支付宝 |
TRADE_HAS_CLOSE | 交易已经关闭 | 支付宝 |
REASON_ILLEGAL_STATUS | 交易的状态不合法 | 支付宝 |
EXIST_FORBIDDEN_WORD | 订单信息中包含违禁词 | 支付宝 |
ACCESS_FORBIDDEN | 没有权限使用该产品 | 支付宝 |
SELLER_NOT_EXIST | 卖家不存在 | 支付宝 |
BUYER_NOT_EXIST | 买家不存在 | 支付宝 |
BUYER_ENABLE_STATUS_FORBID | 买家状态非法, 无法继续交易 | 支付宝 |
BUYER_SELLER_EQUAL | 卖家买家账号相同, 不能进行交易 | 支付宝 |
INVALID_PARAMETER | 参数无效 | 支付宝 |
INVALID_RECEIVE_ACCOUNT | 卖家不在设置的收款账户列表之中 | 支付宝 |
SYSTEMERROR | 接口返回( 系统) 错误 | 微信 |
PARAM_ERROR | 参数错误 | 微信 |
ORDERPAID | 订单已支付 | 微信 |
NOAUTH | 商户无权限 | 微信 |
AUTHCODEEXPIRE | 二维码已过期, 请用户在微信上刷新后再试 | 微信 |
NOTENOUGH | 余额不足 | 微信 |
NOTSUPORTCARD | 不支持卡类型 | 微信 |
ORDERCLOSED | 订单已关闭 | 微信 |
ORDERREVERSED | 订单已撤销 | 微信 |
BANKERROR | 银行系统异常 | 微信 |
USERPAYING | 用户支付中, 需要输入密码 | 微信 |
AUTH_CODE_ERROR | 授权码参数错误 | 微信 |
AUTH_CODE_INVALID | 授权码检验错误 | 微信 |
XML_FORMAT_ERROR | XML 格式错误 | 微信 |
REQUIRE_POST_METHOD | 请使用 post 方法 | 微信 |
Signature error | 签名错误 | 微信 |
LACK_PARAMS | 缺少参数 | 微信 |
NOT_UTF8 | 编码格式错误 | 微信 |
BUYER_MISMATCH | 支付帐号错误 | 微信 |
APPID_NOT_EXIST | APPID 不存在 | 微信 |
MCHID_NOT_EXIST | MCHID 不存在 | 微信 |
OUT_TRADE_NO_USED | 商户订单号重复 | 微信 |
APPID_MCHID_NOT_MATCH | appid 和 mch_id 不匹配 | 微信 |
ORDERNOTEXIST | 此交易订单号不存在 | 微信 |
问题排查:
备注:
- 更多返回错误代码请看首页的错误代码描述