SagePay服务器集成验证签名

时间:2014-05-05 19:30:11

标签: php sagepay

我尝试使用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

感谢您的帮助!!!

2 个答案:

答案 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。