【问题标题】:SagePay Server Integration Verify SignatureSagePay 服务器集成验证签名
【发布时间】:2014-05-05 19:30:11
【问题描述】:

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

感谢您的帮助!!!

【问题讨论】:

  • 您是否确定 (1) 供应商名称是小写的并且 (2) 您正在对从 SagePay 返回的数据进行 url 解码,例如字符串中应包含“ALL+MATCH” as 'ALL MATCH' (3) 在对字符串进行哈希处理之前删除所有花括号#

标签: php opayo


【解决方案1】:

您构建的字符串似乎与文档不匹配,其中指出:

以下值串联的 MD5 签名:VPSTxId + VendorTxCode + Status + TxAuthNo + VendorName+ AVSCV2 + SecurityKey + AddressResult + PostCodeResult + CV2Result + GiftAid + 3DSecureStatus + CAVV + AddressStatus + PayerStatus + CardType + Last4Digits + DeclineCode + ExpiryDate + FraudResponse + BankAuthCode。

注意:MD5 值以大写形式返回。

请确保供应商名称是小写之前 散列。 使用 urldecode 来反转您收到的 urlencoding 圣人支付 如果返回的字段没有值,则不应该是 检查字符串

将 CAVV 之后的字段与您的字段进行比较。您的似乎缺少 AddressStatus 和 PayerStatus。

另外,我认为@dav83 在他的评论中的数字 (3) 不正确。在我正常工作的代码中,我的 VPSTxId 确实 包含花括号(就像在您的示例中一样)。

【讨论】:

  • AddressStatus 和 PayerStatus 仅在使用 PayPal 时返回,并且文档指出如果字段没有任何值,则不应将其包含在验证签名中。我知道我对此有点晚了,但遇到了类似的问题
【解决方案2】:

这其实归根结底是 URL 编码造成的。

VPSTxId 需要“html_entity_decode”。 POST 需要是 urlencode,响应需要是 urldecode。

【讨论】:

  • 请查看您用来使其工作的代码非常有用。
猜你喜欢
  • 1970-01-01
  • 2018-02-21
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 2019-05-13
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
相关资源
最近更新 更多