我尝试使用PHP和协议文档集成到SagePay中。但是我似乎遇到了MD5哈希的问题!
我们收到通知POST的一切都很好。但是,当我们去验证签名时,它与通知POST中的签名不匹配???然而,我已经按照文件跟踪了这封信,并检查了所有内容。除了改变文档范围之外的东西,可能会有拼写错误等。????任何帮助非常感谢!!!
A2:第一次POST时确认回复。
3.00,OK,2014 : The Transaction was Registered Successfully.,{4483C552-6078-6D1C-E37C-294B89DB1DCA},O9WQNAKEHJ,<https://test.sagepay.com/gateway/service/cardselection?vpstxid={4483C552-6078-6D1C-E37C-294B89DB1DCA}>
A3:通知POST回调。
VPSProtocol,TxType,VendorTxCode,VPSTxId,Status,StatusDetail,TxAuthNo,AVSCV2,AddressResult,PostCodeResult,CV2Result,GiftAid,3DSecureStatus,CAVV,CardType,Last4Digits,VPSSignature,DeclineCode,ExpiryDate,BankAuthCode
3.00,DEFERRED,m-5367c2da33a72,{4483C552-6078-6D1C-E37C-294B89DB1DCA},OK,0000 : The Authorisation was Successful.,6953629,SECURITY CODE MATCH ONLY,NOTMATCHED,NOTMATCHED,MATCHED,0,OK,AAABARR5kwAAAAAAAAAAAAAAAAA=,VISA,0006,CB2EFFBC5A872B26DA0AA50F85DD1FEA,00,0115,999777
我基于此构建字符串:
$string = $this->getSagePayTxID()
.$this->getVendorTxCode()
.$this->getSagePayStatus()
.$this->getTxAuthNo()
.SAGEPAY_VENDOR
.$this->getAVSCV2()
.$this->getSecurityKey()
.$this->getAddressResult()
.$this->getPostCodeResult()
.$this->getCV2Result()
.$this->getGiftAid()
.$this->get3DSecureStatus()
.$this->getCAVV()
.$this->getCardType()
.$this->getLast4Digits()
.$this->getDeclineCode()
.$this->getExpiryDate()
.$this->getFraudResponse()
.$this->getBankAuthCode();
if($signature == strtoupper(md5($string)))
{
return TRUE;
}
else
{
return FALSE;
}
生成的字符串是:
{4483C552-6078-6D1C-E37C-294B89DB1DCA}m-5367c2da33a72OK6953629atbristolltdSECURITY CODE MATCH ONLYO9WQNAKEHJNOTMATCHEDNOTMATCHEDMATCHED0OKAAABARR5kwAAAAAAAAAAAAAAAAA=VISA0006000115999777
感谢您的帮助!!!
答案 0 :(得分:1)
您构建的字符串似乎与文档相符,其中声明:
MD5签名的值的串联:VPSTxId + VendorTxCode + Status + TxAuthNo + VendorName + AVSCV2 + SecurityKey + AddressResult + PostCodeResult + CV2Result + GiftAid + 3DSecureStatus + CAVV + AddressStatus + PayerStatus + CardType + Last4Digits + DeclineCode + ExpiryDate + FraudResponse + BankAuthCode。
注意:在大写的情况下返回MD5值。
请确保VendorName之前是较低的情况 散列。 使用urldecode反转您收到的urlencoding Sagepay 如果返回的字段没有值,则不应该这样 检查字符串
将CAVV之后的字段与字段进行比较。你似乎错过了AddressStatus和PayerStatus。
另外,我不认为@ dav83的评论中的数字(3)是正确的。在我的代码中,它的工作正常,我的VPSTxId 确实包含花括号(就像你的例子中一样)。
答案 1 :(得分:0)
这实际上是由于最终的URL编码。
&#39; html_entity_decode&#39;是VPSTxId所必需的。 POST需要是urlencode,响应需要是urldecode。