签名过程整体说明
1. 构造签名串
我们希望商户的技术开发人员按照当前文档约定的规则构造签名串。宝付会使用同样的方式构造签名串。如果商户构造签名串的方式错误,将导致签名验证不通过。下面先说明签名串的具体格式。
签名串一共有六行,每一行为一个参数。结尾以\n(换行符,ASCII编码值为0x0A)结束,包括最后一行。如果参数本身以\n结束,也需要附加一个\n。如果没有数字信封,也需\n结束.
有数字信封签名原始串
HTTP请求方法\n
URL\n
请求时间戳\n
请求随机串\n
数字信封\n
请求报文主体\n
无数字信封签名原始串
HTTP请求方法\n
URL\n
请求时间戳\n
请求随机串\n
\n
请求报文主体\n
2. 计算签名值
根据商户的证书类型对原始签名串生成签名
RSA2证书:
使用商户私钥对签名串进行SHA256 with RSA签名,并对签名结果进行16进制编码转大写得到签名值。
国密证书:
使用商户私钥对签名串使用SM2椭圆曲线公钥密码算法的数字签名算法(SM2Sign with SM3),并对签名结果进行16进制编码转大写得到签名值。
3. 设置HTTP头
宝付要求请求通过HTTP Authorization头来传递签名。Authorization由认证类型和签名信息两个部分组成。
Authorization: 认证类型 签名信息
具体组成为:
- 认证类型,取值 RSA/SM2
签名信息
| 参数名 | 说明 |
|---|---|
| mch_id | 宝付分配的唯一商编 |
| app_id | 宝付终端号,选填,若传值,则使用宝付4.0证书 |
| nonce_str | 请求随机串,和上面构造签名串的随机串要保持一致 |
| timestamp | 时间戳 和上面构造签名串的时间戳要保持一致 |
| serial_no | 商户API证书序列号,用于声明所使用的证书 |
| baofu_serial_no | 宝付证书序列号, 联系技术支持提供 |
| dgtl_envlp | 数字信封(非必填),16位密钥,用宝付公钥加密后传输 |
| signature | 签名值,上面算出来的签名值 |
注意:以上七项签名信息,无顺序要求。数字信封参数可以为空
Authorization头的示例如下:(注意,示例因为排版可能存在换行,实际数据应在一行)
Authorization: RSA mch_id="128308",app_id="128308",nonce_str="P7X2R9Z1M5W6Q4V3B8C0D2E1F7G9H2J4",signature="DKLJASKLFGHQWJFPWQJLFKGDKSLGJPQJPFWQJLGKNDLSKJGLDSJLKFSJAKL",timestamp="1507488238",serial_no="123821002",baofu_serial_no="123822342",dgtl_envlp="GLKUIOWQGKDLSNGLKQWJPRQ"