原力支付-交易HTTP联动通知(MD5)验签文档

返回文档首页

说明

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

验签步骤

步骤1 首先需要接收交易HTTP联动通知数据.有两种格式一种是标准HTTP表单,一种是JSON,这里以JSON格式为例子,他们看起来像这样:
{
"MerchantID": "M05CBEFE15",
"TradeAmount": "0.01",
"TradeBeginTime": "2019-05-22 13:03:53",
"TradeCustomParam": "",
"TradeEndinTime": "2019-05-22 13:04:14",
"TradeGuestMobile": "15027875452",
"TradeName": "%E4%BA%A7%E5%93%81%E5%90%8D%E7%A7%B01%28x1%29",
"TradeNo": "T20190522130352666",
"TradeProduct": "P05CBF2B99",
"TradePromotion": "%E4%BA%A7%E5%93%811%E6%8A%98%E4%BC%98%E6%83%A0",
"TradeQuantity": "1",
"TradeSignMode": "MD5",
"TradeSignature": "24C15AD0382033C8EB971EA620092E45",
"TradeStatus": "TRADE_SUCCESS",
"TradeTimestamp": "20190522130414864",
"TradeToken": "4200000323201905223412260226"
}
每个参数都有Name和Value值,比如第一个参数Name是MerchantID,它的Value是M05CBEFE15
步骤2 首先排除TradeSignMode,TradeSignature这2个参数.
对其余其他参数以Name进行字母顺序的排序,用Name=Value的格式组合并用&符号连接起来.
得到待签名内容[SignatureContent]如下:
MerchantID=M05CBEFE15&TradeAmount=0.01&TradeBeginTime=2019-05-22 13:03:53&TradeCustomParam=&TradeEndinTime=2019-05-22 13:04:14&TradeGuestMobile=15026628939&TradeName=%E4%BA%A7%E5%93%81%E5%90%8D%E7%A7%B01%28x1%29&TradeNo=T20190522130352666&TradeProduct=P05CBF2B99&TradePromotion=%E4%BA%A7%E5%93%811%E6%8A%98%E4%BC%98%E6%83%A0&TradeQuantity=1&TradeStatus=TRADE_SUCCESS&TradeTimestamp=20190522130414864&TradeToken=4200000323201905223412260226
步骤3 计算[SignatureContent]的MD5特征码得到[SignatureContentMD5]:
D66BB2AE66AB3D22862AD5A3BE097EDD
步骤4 MerchantPublicKeyMD5是商户的公钥,可以在商户管理界面中进行导出获得
计算[MerchantPublicKey]的MD5特征码得到[MerchantPublicKeyMD5]:
5536BE6945E94D0F5C6EBD2E3E78D980
步骤5 组合[SignatureContentMD5]+#+[MerchantPublicKeyMD5]得到签名数据体[SignatureBody]
D66BB2AE66AB3D22862AD5A3BE097EDD#5536BE6945E94D0F5C6EBD2E3E78D980
步骤6 对[SignatureBody]进行MD5计算得到[Signature]:
24C15AD0382033C8EB971EA620092E45
步骤7 将[Signature]与[TradeSignature]值进行对比,如果相同则说明验签正确.反之则说明验签失败.
最终验签结果为:=正确=可以信赖此交易通知!

备注

交易HTTP联动MD5验签方式的特点是简单,但是并不安全.
它是利用了[MerchantPublicKey]的保密性来实现验签的.
在实际使用当中您应该对[MerchantPublicKey]做好保密工作,
适用于可控性私密性较强的个人场景.
如需商业环境使用请使用RSA_SHA256方式验签.