此文档描述了当收到以MD5验签方式的退款HTTP联动通知数据后,如何对通知数据进行验签,以此判断通知数据是否可信.您也可以在启动支付服务后,访问http://<支付服务地址端口>/refundsignpage.csp来手工验签并查看验签步骤
步骤1 | 首先需要接收交易HTTP联动通知数据.有两种格式一种是标准HTTP表单,一种是JSON,这里以JSON格式为例子,他们看起来像这样: "MerchantID": "M05CBEFE15", "ProductID": "P05CC449F5", "RefundActual": "0.30", "RefundAmount": "0.30", "RefundBeginTime": "2019-04-29 16:33:31", "RefundCustomParam": "NULL", "RefundEndinTime": "2019-04-29 16:33:36", "RefundNo": "R20190429163329991", "RefundReason": "REFUND", "RefundSignMode": "MD5", "RefundSignature": "50733AFB21B1B86B057FB15A8E884221", "RefundStatus": "REFUND_SUCCESS", "RefundTimestamp": "20190429163337532", "TradeNo": "T20190429161256258" } 每个参数都有Name和Value值,比如第一个参数Name是MerchantID,它的Value是M05CBEFE15 |
步骤2 | 首先排除RefundSignMode,RefundSignature这2个参数. 对其余其他参数以Name进行字母顺序的排序,用Name=Value的格式组合并用&符号连接起来. 得到待签名内容[SignatureContent]如下: MerchantID=M05CBEFE15&ProductID=P05CC449F5&RefundActual=0.30&RefundAmount=0.30&RefundBeginTime=2019-04-29 16:33:31&RefundCustomParam=NULL&RefundEndinTime=2019-04-29 16:33:36&RefundNo=R20190429163329991&RefundReason=REFUND&RefundStatus=REFUND_SUCCESS&RefundTimestamp=20190429163337532&TradeNo=T20190429161256258 |
步骤3 | 计算[SignatureContent]的MD5特征码得到[SignatureContentMD5]: B032D6BD051AE0FAC4681253C66635F3 |
步骤4 | MerchantPublicKey是您的商户公钥,可以在商户管理页面中导出获得 计算[MerchantPublicKey]的MD5特征码得到[MerchantPublicKeyMD5]: 773D5FA18C0CEB6637600CBBCFB28E66 |
步骤5 | 组合[SignatureContentMD5]+#+[MerchantPublicKeyMD5]得到签名数据体[SignatureBody] B032D6BD051AE0FAC4681253C66635F3#773D5FA18C0CEB6637600CBBCFB28E66 |
步骤6 | 对[SignatureBody]进行MD5计算得到[Signature]: 50733AFB21B1B86B057FB15A8E884221 |
步骤7 | 将[Signature]与[TradeSignature]值进行对比,如果相同则说明验签正确.反之则说明验签失败. 最终验签结果为:=正确=可以信赖此交易通知! |
退款HTTP联动MD5验签方式的特点是简单,但是并不安全.
它是利用了[MerchantCreditCode]的保密性来实现验签的.
在实际使用当中您应该对[MerchantCreditCode]做好保密工作,
适用于可控性私密性较强的个人场景.
如需商业环境使用请使用RSA_SHA256方式验签.