退款HTTP联动通知(RSA_SHA256)验签

返回文档首页

说明

此文档描述了当收到以RSA_SHA256验签方式的退款HTTP联动通知数据后,如何对通知数据进行验签,以此判断通知数据是否可信.
您也可以在启动支付服务后,访问http://<支付服务地址端口>/refundsignpage.csp来手工验签并查看验签步骤
您还可以通过ForcePaySDK使用本地的API进行验证

验签步骤

步骤1 首先需要接收退款HTTP联动通知数据.有两种格式一种是标准HTTP表单,一种是JSON,这里以JSON格式为例子,他们看起来像这样:
{
"MerchantID": "M05CBEFE15",
"RefundActual": "0.01",
"RefundAmount": "0.01",
"RefundBeginTime": "2019-05-22 13:32:04",
"RefundCustomParam": "",
"RefundEndinTime": "2019-05-22 13:32:09",
"RefundNo": "R20190522133202685",
"RefundReason": "%E4%BD%A0%E5%A5%BD%E4%B8%96%E7%95%8CHELLOWORLD",
"RefundSignMode": "RSA_SHA256",
"RefundSignature": "wj78mW2omDfsEKRwDc6wWrlGO1bh4QTNOCpwwPd9ZYLts8p9MdrZPShyn5BfJ8%2BHOfoDI%2FPJUe9aFm1EIIdjf7mOITBpsebNWRop7ObZX%2FN%2BDsnLtUFyH5Gv%2BgEaKocrD90lqHjEYz3d73Y33g%2FgnPGCd5eFjDohdbMuTAd3eunDY5HjTzdclHsSwN02YoEm8TfCrKos93xEHdq69wdDOSyCpvFsIiel%2FWgRsU0lef2cjYV6rnj2VqcbBaNXIfX5GZ1JMCpbrdGEFXJcJUdmIF0mfSxoXFu04xDO2RLNPc0maEpkrIQXAb8iXNcs4%2BrGNOK7lpknqegf6Aln6deIIw%3D%3D",
"RefundStatus": "REFUND_SUCCESS",
"RefundTimestamp": "20190522133210681",
"TradeNo": "T20190522111124344",
"TradeProduct": "P05CBF2B99",
"TradeQuantity": "1"
}
每个参数都有Name和Value值,比如第一个参数Name是MerchantID,它的Value是M05CBEFE15
步骤2 首先排除RefundSignMode,RefundSignature这2个参数.
对其余其他参数以Name进行字母顺序的排序,用Name=Value的格式组合并用&符号连接起来.
得到待签名内容[SignatureContent]如下:
MerchantID=M05CBEFE15&RefundActual=0.01&RefundAmount=0.01&RefundBeginTime=2019-05-22 13:32:04&RefundCustomParam=&RefundEndinTime=2019-05-22 13:32:09&RefundNo=R20190522133202685&RefundReason=%E4%BD%A0%E5%A5%BD%E4%B8%96%E7%95%8CHELLOWORLD&RefundStatus=REFUND_SUCCESS&RefundTimestamp=20190522133210681&TradeNo=T20190522111124344&TradeProduct=P05CBF2B99&TradeQuantity=1
步骤3 计算[SignatureContent]的MD5特征码得到[SignatureContentMD5]:
C673C853A873B2ABA9742023DD295B63
步骤4 对RefundSignature参数进行URL Decode解码,得到[RefundSignatureBase64]:
wj78mW2omDfsEKRwDc6wWrlGO1bh4QTNOCpwwPd9ZYLts8p9MdrZPShyn5BfJ8+HOfoDI/PJUe9aFm1EIIdjf7mOITBpsebNWRop7ObZX/N+DsnLtUFyH5Gv+gEaKocrD90lqHjEYz3d73Y33g/gnPGCd5eFjDohdbMuTAd3eunDY5HjTzdclHsSwN02YoEm8TfCrKos93xEHdq69wdDOSyCpvFsIiel/WgRsU0lef2cjYV6rnj2VqcbBaNXIfX5GZ1JMCpbrdGEFXJcJUdmIF0mfSxoXFu04xDO2RLNPc0maEpkrIQXAb8iXNcs4+rGNOK7lpknqegf6Aln6deIIw==
步骤5 对[RefundSignatureBase64]进行Base64解码,得到[RefundSignatureBrinary]:
这是长度为:256的二进制RSA_SH256签名数据
C2 3E FC 99 6D A8 98 37 EC 10 A4 70 0D CE B0 5A B9 46 3B 56 E1 E1 04 CD 38 2A 70 C0 F7 7D 65 82 ED B3 CA 7D 31 DA D9 3D 28 72 9F 90 5F 27 CF 87 39 FA 03 23 F3 C9 51 EF 5A 16 6D 44 20 87 63 7F B9 8E 21 30 69 B1 E6 CD 59 1A 29 EC E6 D9 5F F3 7E 0E C9 CB B5 41 72 1F 91 AF FA 01 1A 2A 87 2B 0F DD 25 A8 78 C4 63 3D DD EF 76 37 DE 0F E0 9C F1 82 77 97 85 8C 3A 21 75 B3 2E 4C 07 77 7A E9 C3 63 91 E3 4F 37 5C 94 7B 12 C0 DD 36 62 81 26 F1 37 C2 AC AA 2C F7 7C 44 1D DA BA F7 07 43 39 2C 82 A6 F1 6C 22 27 A5 FD 68 11 B1 4D 25 79 FD 9C 8D 85 7A AE 78 F6 56 A7 1B 05 A3 57 21 F5 F9 19 9D 49 30 2A 5B AD D1 84 15 72 5C 25 47 66 20 5D 26 7D 2C 68 5C 5B B4 E3 10 CE D9 12 CD 3D CD 26 68 4A 64 AC 84 17 01 BF 22 5C D7 2C E3 EA C6 34 E2 BB 96 99 27 A9 E8 1F E8 09 67 E9 D7 88 23
步骤6 通过RSA_SH256验签算法进行验签
签名的内容数据为[SignatureContentMD5]:
C673C853A873B2ABA9742023DD295B63
待验证的签名数据为[RefundSignatureBrinary]: (见之前解码获得)
用于验证签名使用的商户公钥MD5为:
773D5FA18C0CEB6637600CBBCFB28E66
商户公钥是在您创建商户的时候生成的,您可以在<商户管理>页面中导出获得
最终验签结果为:=正确=可以信赖此退款通知!

备注

退款HTTP联动RSA_SHA256验签方式较为复杂,但是采用了2048位的高强度非对称加密,
它是可靠且安全.您不必担心商户公钥泄露,这不会影响验签安全性.
适用各种商业环境.