此文档描述了当收到以MD5验签方式的代付HTTP联动通知数据后,如何对通知数据进行验签,以此判断通知数据是否可信.您也可以在启动支付服务后,访问http://<支付服务地址端口>/transfersignpage.csp来手工验签并查看验签步骤
步骤1 | 首先需要接收交易HTTP联动通知数据.有两种格式一种是标准HTTP表单,一种是JSON,这里以JSON格式为例子,他们看起来像这样: { "MerchantID": "M05CED826F", "TransferAccount": "xxxxxx@163.com", "TransferAmount": "1.00", "TransferBeginTime": "2020-05-25 18:57:11", "TransferCustomParam": "NULL", "TransferEndinTime": "2020-05-25 18:57:12", "TransferMethod": "ALP", "TransferNo": "F20200525185700775", "TransferRealName": "%E8%92%8B%E4%B9%89%E5%9B%BD", "TransferSignMode": "MD5", "TransferSignature": "39001CBD73838F80C01AF67217560F8E", "TransferStatus": "SUCCESS", "TransferStatusDesc": "%E8%BD%AC%E8%B4%A6%E6%88%90%E5%8A%9F", "TransferTimestamp": "20200525185713228", "TransferToken": "20200525110070001506120055922309", "TransferType": "LoginName" } 每个参数都有Name和Value值,比如第一个参数Name是MerchantID,它的Value是M05CBEFE15 |
步骤2 | 首先排除TransferSignMode,TransferSignature这2个参数. 对其余其他参数以Name进行字母顺序的排序,用Name=Value的格式组合并用&符号连接起来. 得到待签名内容[SignatureContent]如下: MerchantID=M05CED826F&TransferAccount=xxxxxx@163.com&TransferAmount=1.00&TransferBeginTime=2020-05-25 18:57:11&TransferCustomParam=NULL&TransferEndinTime=2020-05-25 18:57:12&TransferMethod=ALP&TransferNo=F20200525185700775&TransferRealName=%E8%92%8B%E4%B9%89%E5%9B%BD&TransferStatus=SUCCESS&TransferStatusDesc=%E8%BD%AC%E8%B4%A6%E6%88%90%E5%8A%9F&TransferTimestamp=20200525185713228&TransferToken=20200525110070001506120055922309&TransferType=LoginName |
步骤3 | 计算[SignatureContent]的MD5特征码得到[SignatureContentMD5]:
7A0336DB203628917C5A80CB1C5A966E |
步骤4 | MerchantPublicKey是您的商户公钥,可以在商户管理页面中导出获得 计算[MerchantPublicKey]的MD5特征码得到[MerchantPublicKeyMD5]: <*商户公钥MD5保密*> |
步骤5 | 组合[SignatureContentMD5]+#+[MerchantPublicKeyMD5]得到签名数据体[SignatureBody] 7A0336DB203628917C5A80CB1C5A966E#<*商户公钥MD5保密*> |
步骤6 | 对[SignatureBody]进行MD5计算得到[Signature]: 39001CBD73838F80C01AF67217560F8E |
步骤7 | 将[Signature]与[TransferSignature]值进行对比,如果相同则说明验签正确.反之则说明验签失败. 最终验签结果为:=正确=可以信赖此交易通知! |
代付HTTP联动MD5验签方式的特点是简单,但是并不安全.
它是利用了[MerchantPublicKey]的保密性来实现验签的.
在实际使用当中您应该对[MerchantPublicKey]做好保密工作,
适用于可控性私密性较强的个人场景.
如需商业环境使用请使用RSA_SHA256方式验签.