如何使用宝付公钥验签
1. 获取宝付公钥
登录宝付商户运营后台获取公钥
2. 构造验签串
以扫码支付模拟的报文应答为例
Content-Type: application/json; charset=utf-8
Content-Length: 55
Connection: keep-alive
Keep-Alive: timeout=8
Cache-Control: no-cache, must-revalidate
Request-ID: KDSFJOWHNOIGNQWLFKJLSSDFJL
Content-Language: zh-CN
Baofu-Nonce: GKLSDJGOHGKLSDGLDSJKFJSALK
Baofu-Signature: 60F8C58F7A171873CD7321362ABDBBC6535A59463157D3177D247654636263B2F844AAFBFDB958602E4A1FCCF9BB579F195BB1DB7573511EEED8FE02DE9DE6AD6871934DD165EB8CE9950F0F9602CC763C94B8F22B66DE300F75D25849880AC3082CFF7B93DEB0A53E28E9832BDE64CF9E8AD2FC04EBEC516579BD6D264E88C3259EF16F816BA31F99E536A8131ADF14394D891C8132F74433662CFD12096211D3509C5D4641A2BCE38178C93E4D359947ACB02CA2BCCF2C5F5D0E12792C74F0832A1DAE8987EE882F50344DCF7BE623FCF401FBFB4AEA91D8155700C0272AA713EC096CA753EDA4F0EA58884C0B0F9C1BFB99DF49479F2889BA37C2C34AD7D1
Baofu-Timestamp: 1712345678
Baofu-Serial: 139129421
Baofu-Signature-Type: RSA
{"code_url":"https://api.baofu.com/qrcode/odsgiedgjk"}
(1)请从应答或通知回调中获取以下信息:
HTTP 头 Baofu-Timestamp 中的应答时间戳
HTTP 头 Baofu-Nonce 中的应答随机串
HTTP 头 Baofu-Dgtl-Envlp中的数字信封字段
应答报文主体(Response Body),请使用原始报文主体执行验签。如果您使用了某个框架,要确保它不会篡改报文主体。对报文主体的任何篡改都会导致验证失败。
(2)然后,请按照以下规则构造应答的验签名串。签名串共有四行,行尾以\n 结束,包括最后一行。\n 为换行符(ASCII 编码值为 0x0A)。若应答报文主体为空(如 HTTP 状态码为 204 No Content),最后一行仅为一个 \n 换行符。
应答时间戳\n
应答随机串\n
数字信封\n
应答报文主体\n
则验签名串为
1712345678\n
GKLSDJGOHGKLSDGLDSJKFJSALK\n
\n
{"code_url":"https://api.baofu.com/qrcode/odsgiedgjk"}\n
3. 获取应答签名
宝付的应答签名通过 HTTP 头 Baofu-Signature 传递。(请注意,示例可能存在换行,实际数据应在一行)
Baofu-Signature: 60F8C58F7A171873CD7321362ABDBBC6535A59463157D3177D247654636263B2F844AAFBFDB958602E4A1FCCF9BB579F195BB1DB7573511EEED8FE02DE9DE6AD6871934DD165EB8CE9950F0F9602CC763C94B8F22B66DE300F75D25849880AC3082CFF7B93DEB0A53E28E9832BDE64CF9E8AD2FC04EBEC516579BD6D264E88C3259EF16F816BA31F99E536A8131ADF14394D891C8132F74433662CFD12096211D3509C5D4641A2BCE38178C93E4D359947ACB02CA2BCCF2C5F5D0E12792C74F0832A1DAE8987EE882F50344DCF7BE623FCF401FBFB4AEA91D8155700C0272AA713EC096CA753EDA4F0EA58884C0B0F9C1BFB99DF49479F2889BA37C2C34AD7D1
提示
某些代理服务器或 CDN 服务提供商,在转发时可能会“过滤”宝付扩展的 HTTP 头,导致应用层无法获取宝付的签名信息。商户遇到这种情况时,我们建议尝试调整代理服务器配置,或者通过直连的方式访问宝付支付的服务器和接收通知回调。
4. 验证签名
很多编程语言的签名验证函数支持对验签名串和签名进行签名验证。强烈建议商户调用该类函数,使用宝付支付公钥对验签名串和签名进行 SHA256 with RSA 签名验证。
下面展示使用命令行演示如何进行验签。假设我们已经获取了宝付公钥并保存为 139129421.pem。内容如下:
$ cat 139129421.pem
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiA1Mb2lh1CcYiC6TNNJ+
AF6hM0gSkACy6axeGzTD6t5JMvAhyoHTbXeQM2t2frrxO4iIrT5uFFbgG+iJtuzO
xXxEPgLgv4ytZz8vLONUWVrbJbwYZY4pUhqyN5q67kYQQ+zB1+FMtVpheR2x5fJF
b8yGj8odpQssHOfJoyT0vnCIebhWUzcg03OU7FML6q22JRdIGO6uubq6rKpgNaly
oBxzEqUVxN+5+1bm22H5g4aWQTEqRmGqmrIo/CN0WSUhdj72dAj0L5YkscHkyWXZ
3zMLFeprSjW86pj2h7iM/0/bl9COJJo7t38a1SURrZpXktoWj/rP++Po4mEQBGfF
aQIDAQAB
-----END PUBLIC KEY-----
(2)使用 16进制 解码应答签名,将保存为文件 signature.txt 。(以下命令行均在一行)
$ echo "60F8C58F7A171873CD7321362ABDBBC6535A59463157D3177D247654636263B2F844AAFBFDB958602E4A1FCCF9BB579F195BB1DB7573511EEED8FE02DE9DE6AD6871934DD165EB8CE9950F0F9602CC763C94B8F22B66DE300F75D25849880AC3082CFF7B93DEB0A53E28E9832BDE64CF9E8AD2FC04EBEC516579BD6D264E88C3259EF16F816BA31F99E536A8131ADF14394D891C8132F74433662CFD12096211D3509C5D4641A2BCE38178C93E4D359947ACB02CA2BCCF2C5F5D0E12792C74F0832A1DAE8987EE882F50344DCF7BE623FCF401FBFB4AEA91D8155700C0272AA713EC096CA753EDA4F0EA58884C0B0F9C1BFB99DF49479F2889BA37C2C34AD7D1" | xxd -r -p > signature.txt
(3)最后,验证签名,得到验签结果,请确认你的结果和文档的结果一致,如果验签结果是Verification Failure,请确认是否获取到了正确的宝付公钥或者验签串是否有严格按照文档格式换行
$ openssl dgst -sha256 -verify 139129421.pem -signature signature.txt << EOF
1712345678
GKLSDJGOHGKLSDGLDSJKFJSALK
{"code_url":"https://api.baofu.com/qrcode/odsgiedgjk"}
EOF
得到的结果为如下verified ok 则表示验签通过
Verified OK
5. 注意事项
(1)文件/图片下载接口验签说明
文件下载接口需要跳过验签流程,以下载账单接口为例,下载账单分三步:
第一步,请求下载账单接口,宝付会返回一个下载账单的URL
第二步,商户通过第一步获取的url 去下载账单,下载账单返回的是账单文件,响应的信息请求头中不包含接口响应的签名值,因此需要跳过验签的流程
第三步,商户将实际账单文件的哈希值和之前从接口获取到的哈希值进行比对,以确认数据的完整