代付接口技术对接文档
协议规则
提交方式采用POST方法提交
内容类型application/json
字符编码UTF-8
签名算法MD5
签名算法
签名生成的通用步骤如下:
第一步:
设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
- ◆ 参数名ASCII码从小到大排序(字典序);
- ◆ 如果参数的值为空不参与签名;
- ◆ 参数名区分大小写;
- ◆ 验证调用返回或支付中心主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
- ◆ 支付中心接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步:
在stringA最后拼接上key[即 stringA + "&key=" + 私钥 ] 得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
如请求支付系统参数如下(以下只是举例,真实签名时除了sign字段都参与加签):
Map signMap = new HashMap();
signMap.put("userId", "test01");
signMap.put("type", "wechat");
signMap.put("money", Double.valueOf(2));
signMap.put("remark", "");
signMap.put("outTradeNo", "P12312321123");
待签名值:money=2.0&outTradeNo=P12312321123&type=wechat&userId=test01&key=EWEFD123RGSRETYDFNGFGFGSHDFGH
签名结果:5E0AA05DD4BB4FE5AB65608123EBA591
最终请求支付系统参数:money=2.0&outTradeNo=P12312321123&type=wechat&userId=test01&sign=5E0AA05DD4BB4FE5AB65608123EBA591
统一下单
接口链接
URL地址:{payUrl}/api/transfer/createOrder
请求参数
| 参数 | 类型 | 是否必填 | 描述 | 示例值 |
|---|---|---|---|---|
| merchant_id | String | 是 | 商户号 | 1230000109 |
| product_code | String | 是 | 产品代码 | 8001 |
| merchant_order_no | String | 是 | 商户订单号 | 20150806125346 |
| amount | String | 是 | 订单金额 | 100 |
| payee_name | String | 是 | 收款人姓名 | 张三 |
| payee_account | String | 是 | 收款人账号 | 6226171583476258 |
| client_ip | String | 否 | 客户端IP | 123.12.12.123 |
| notify_url | String | 是 | 异步通知地址 | http://127.0.0.1 |
| extend_params | String | 否 | 扩展参数 | |
| request_time | String | 是 | 请求时间 | 2024-09-15 00:00:00 |
| sign | String | 是 | 签名 | C380BEC2BFD727A4B6845133519F3AD6 |
响应结果
| 参数 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| code | Number | 是 | 200-下单成功;其他-下单失败 |
| message | String | 是 | 当code非200时,返回失败原因,例如:签名失败、参数格式校验错误 |
以下字段在code为200的时候有返回
| 参数 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| order_no | String | 是 | 订单号 |
| amount | String | 是 | 订单金额 |
| fee | String | 是 | 手续费 |
| settlement_amount | String | 是 | 实付金额 |
| status | Number | 是 | 订单状态:1 - 待处理;2 - 代付成功;3 - 代付失败;4 - 处理中 |
响应数据示例
{
"code": 200,
"message": "请求成功",
"data": {
"order_no": "T20240918192932984845",
"amount": "100",
"fee": "20.50",
"settlement_amount": "120.50",
"status": 1
}
}
查询订单
接口链接
URL地址:{payUrl}/api/transfer/queryOrder
请求参数
| 参数 | 类型 | 是否必填 | 描述 | 示例值 |
|---|---|---|---|---|
| merchant_id | String | 是 | 商户号 | 1230000109 |
| merchant_order_no | String | 是 | 商户订单号 | 20150806125346 |
| request_time | String | 是 | 请求时间 | 2024-09-15 00:00:00 |
| sign | String | 是 | 签名 | C380BEC2BFD727A4B6845133519F3AD6 |
响应结果
| 参数 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| code | Number | 是 | 200-请求成功;其他-请求失败 |
| message | String | 是 | 当code非200时,返回失败原因,例如:签名失败、参数格式校验错误 |
以下字段在code为200的时候有返回
| 参数 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| merchant_id | Number | 是 | 商户号 |
| merchant_order_no | String | 是 | 商户订单号 |
| order_no | String | 是 | 订单号 |
| amount | String | 是 | 订单金额 |
| fee | String | 是 | 手续费 |
| settlement_amount | String | 是 | 实付金额 |
| status | Number | 是 | 订单状态:1 - 待处理;2 - 代付成功;3 - 代付失败;4 - 处理中 |
| notify_status | Number | 是 | 通知状态:1-未通知,2-通知成功,3-通知失败 |
| transfer_time | String | 否 | 代付时间 |
| sign | String | 是 | 签名 |
响应数据示例
{
"code": 200,
"message": "请求成功",
"data": {
"merchant_id": 100001,
"merchant_order_no": "M20240917064725409559",
"order_no": "T20240917064728891974",
"amount": "100.00",
"fee": "20.50",
"settlement_amount": "120.50",
"status": 3,
"notify_status": 1,
"sign": "5217387FD374AD24785D03B80AB97291"
}
}
查询代付余额
接口链接
URL地址:{payUrl}/api/transfer/queryTransferBalance
请求参数
| 参数 | 类型 | 是否必填 | 描述 | 示例值 |
|---|---|---|---|---|
| merchant_id | String | 是 | 商户号 | 1230000109 |
| request_time | String | 是 | 请求时间 | 2024-09-15 00:00:00 |
| sign | String | 是 | 签名 | C380BEC2BFD727A4B6845133519F3AD6 |
响应结果
| 参数 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| code | Number | 是 | 200-请求成功;其他-请求失败 |
| message | String | 是 | 当code非200时,返回失败原因,例如:签名失败、参数格式校验错误 |
以下字段在code为200的时候有返回
| 参数 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| merchant_id | Number | 是 | 商户号 |
| transfer_balance | String | 是 | 代付余额 |
| transfer_frozen_amount | String | 是 | 代付冻结金额 |
| sign | String | 是 | 签名 |
响应数据示例
{
"code": 200,
"message": "请求成功",
"data": {
"merchant_id": 100001,
"transfer_balance": "97505.50",
"transfer_frozen_amount": "3494.50",
"sign": "B2B8365D8DD6699208FE80017C5C4268"
}
}
代付结果通知
通知参数
| 参数 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| merchant_id | Number | 是 | 商户号 |
| merchant_order_no | String | 是 | 商户订单号 |
| order_no | String | 是 | 订单号 |
| amount | String | 是 | 订单金额 |
| fee | String | 是 | 手续费 |
| status | Number | 是 | 订单状态:1 - 待处理;2 - 代付成功;3 - 代付失败;4 - 处理中 |
| request_time | String | 是 | 请求时间 |
| sign | String | 是 | 签名 |
通知数据示例
{
"merchant_id": 100001,
"merchant_order_no": "M20240917064657690799",
"order_no": "T20240917064700445074",
"amount": "100.00",
"fee": "20.50",
"status": 2,
"request_time": "2024-09-18 19:34:50",
"sign": "53ED6DC2ABC37CCA44271AD37623E38C"
}
返回结果
在进行异步通知交互时,如果支付中心收到的应答不是 SUCCESS 支付中心会认为通知失败,会通过一定的策略定期重新发起通知。通知的间隔频率为:5m、10m、15m、30m、1h、1h、1h、1h。
注意:返回的字符串必须为大写,且不能包含首尾空格。