SagePay服务器集成验证签名


SagePay Server Integration Verify Signature

我正在尝试使用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: Notification POST to callback.

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

谢谢你的帮助!

您构建的字符串似乎与文档不匹配,文档中声明:

对以下值进行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来反转您从Sagepay如果返回的字段没有值,则不应该这样做检查字符串

比较CAVV后面的字段与您的字段。您的地址似乎缺少AddressStatus和PayerStatus。

同样,我不认为@dav83在他的评论中的数字(3)是正确的。在我的代码中,它正常工作,我的VPSTxId 包含花括号(就像在你的例子)。

这实际上是由于URL编码在最后。

为VPSTxId需要'html_entity_decode'。POST需要是urlencode,响应需要是urldecode