接口规则
基本要求
规则 | 要求 |
---|---|
传输方式 | 为保证交易安全性,采用HTTPS传输 |
提交方式 | 采用POST方法提交 |
数据格式 | 提交和返回数据都为JSON格式,基本数据 { "result_code":"OK", "result_msg":"SUCCESS", "charge": { } } |
字符编码 | 统一采用UTF-8字符编码 |
签名算法 | SHA1WithRSA等 |
签名要求 | 请求和接收数据都需要校验签名 |
授权要求 | 所有API操作都要求使用授权 |
判断逻辑 | 先判断协议字段返回,再判断业务返回,最后判断交易状态 |
Header要求
请求Content-Type: content-type
- 设置该Header值为JSON格式。
- 例: application/json; charset=UTF-8
请求Accept: accept
- 设置该Header值为JSON格式。
- 例: application/json; charset=UTF-8
请求URL地址: x-ca-resturl
- 设置该Header值为统一下达或订单查询请求的URL地址。
- 例: https://pay.xxx.io/pay/unifiedorder or https://pay.xxx.io/pay/orderquery
请求时间戳: x-ca-timestamp
- 设置该Header值为当前请求的毫秒或更高精度时间戳(毫秒/微秒/纳秒)。
- 例: 毫秒时间戳 millisecond timestamp 1586007620038
请求随机数: x-ca-noncestr
- 设置该Header值为一个32位系统随机数,防重请求。
- 例: MD5(系统随机数)
请求授权KEY: x-ca-auth
- 设置该Header值为商户申请API接口获取的key。
- 例: 772ae1d32322f49508307b2f31a0107f
请求签名: x-ca-signature
- 设置该Header值为使用SHA1WithRSA签名算法计算的签名,该签名将由服务端进行校验。
- 具体算法规则参见 签名算法
签名算法
第一步: 商户系统API接口会分配key和支付平台数据公钥platform_pubKey,使用支付宝RSA签名验签工具自己生成商户数据RSA密钥对(私钥priKey和公钥pubKey,注:非JAVA适用 2048 pkcs1s):
- key: 商户系统API接口对应的key
- priKey: 对商户系统请求数据进行签名的RSA私钥
- pubKey: 支付平台对商户系统请求数据进行验签的RSA公钥
- platform_pubKey: 商户系统对支付平台返回数据进行验签的RSA公钥
第二步: 拼接待签名的字符串string,规则如下:
string = UTF8格式的URI +
换行符\n + UTF8格式的URI查询参数 +
换行符\n + UTF8格式的x-ca-noncestr Header值 +
换行符\n + UTF8格式的x-ca-timestamp Header值 +
换行符\n + UTF8格式的POST请求JSON数据
样例:
string = /pay/unifiedorder
C8E1D385785625AFD64A484B58F91882
1.58600995149E+12
{"out_trade_no":"202007040118131586193493","subject":"demo","body":"demo","amount":"1.66","currency":"INR","channel":"inpay_bankupi","extparam":[],"mchid":"100000","return_url":"https://pay.xxx.io/demo.html","notify_url":"https://pay.xxx.io/demo/demonotify","client_ip":"127.0.0.1"}
提示
- 空行是该请求的URI查询参数为空
第三步: 使用SHA1WithRSA签名算法计算得出x-ca-signature签名,如下:
- 对待签名字符串string进行Base64运算得到sign值
- 读取商户私钥priKey并转换为openssl密钥private key
- 将sign值和private key密钥传入SHA1WithRSA签名算法计算出signature
- 对signature进行Base64运算得到x-ca-signature值
第四步: 支付平台收到商户系统请求后,将对请求数据进行验签。如果验签不通过,返回失败结果;如果验签通过,执行相应的支付业务逻辑并返回相应的结果。支付平台对返回结果进行了SHA1WithRSA签名算法,返回结果和Header示例如下:
Body:
{
"result_code": "OK",
"result_msg": "SUCCESS",
"charge": {
"channel": "inpay_payout",
"out_trade_no": "05Apr2021084746550",
"client_ip": "127.0.0.1",
"amount": "100",
"currency": "INR",
"subject": "inpay_payout",
"body": "inpay_payout",
"extparam": {
"accountname": "kumar hamad",
"bankaccount": "6228480415647314871",
"bankname": "HDFC"
},
"credential": {
"out_trade_no": "D20210405084748405109",
"merchant_wallet": {
"id": "44",
"uid": "100003",
"paytype": "0",
"currency": "INR",
"limit_credits": "0.000",
"security_deposit_credits": "0.000",
"unsettled_credits": "39128.819",
"hold_credits": "0.000",
"commission_credits": "144498.771",
"available_credits": "25386.424",
"status": "1",
"create_time": "1541787044",
"update_time": "1542617892"
}
}
}
}
Header:
x-ca-timestamp: 1617583668305
x-ca-noncestr: 963613FA553D6405C6E0D345BA32B6DB
x-ca-signature: f+boCXBdpfZItp4TykM7BB03qGTZ9Yf6eBZD8D6mPQQsn0yTYAjy+46UJnhfChQ4z1CjfcW4AbHxZNT8cc5wxErLTt7rLYPD0T6RfOiyDY1AFTgFvY2P5pUi3WtHxqgpvkOrM6XT0PGts4Pzi1yBAMwzVZ4q6fSbitlvR36sk\/MCV1RKVbHlVzeCGMQ38dg3Frny9kBEYhgqzqHPZteiTt5sOuokN8eHqLEqImsS4xlosDD9Mgb3BckegQIdIBoRezqn+JrM8glU2iEq5VxAuhZBkqNT76BHdUA8KbO5yOqRRbqpOQf7iTGRqBgNHtuwZg+HbQcff\/t\/fxx\/COdD1w==
- 第五步: 商户系统收到返回结果后,为保证支付安全,强烈建议商户对返回数据进行验签后再进行相应的业务处理。验签算法如下:
拼接待验签的字符串string,规则如下:
string = UTF8格式的x-ca-noncestr Header值 +
换行符\n + UTF8格式的x-ca-timestamp Header值 +
换行符\n + UTF8格式的返回结果的完整JSON数据
然后对待验签字符串string进行Base64运算得到verify值,传入 返回Header的x-ca-signature值、verify值、支付平台数据公钥platform_pubKey这三个参数执行SHA1WithRSA验签算法。