【问题标题】:How to confirm that a payment was successful when using payments gateways?使用支付网关时如何确认支付成功?
【发布时间】:2017-07-14 05:54:46
【问题描述】:

据我了解,这就是支付网关的工作方式。

  1. 我们向支付网关(2checkouts、Paypal 等)发送必要的 POST 请求。

  2. 付款由 Payments Getaway 处理。

  3. 然后 Payment Getaway 向我们发送 POST 参数。假设 Payment Getaway 将参数返回到 example.com/return.php 页面。

我知道他们会发送诸如状态之类的 POST 参数。我们可以用它来验证付款。

所以我们要做的是,我们在example.com/return.php page 中写一个代码来验证付款。

但是如果任何用户/黑客将所有 POST 参数(我的意思是支付网关发送)发送到 example.com/return.php page,会发生什么情况。

我应该如何处理?

【问题讨论】:

    标签: php payment-gateway


    【解决方案1】:

    您应该验证您的 POST 参数是否来自您期望的来源。对于 Paypal,我们以他们的 Instant Payment Notification(或 IPN)为例。

    查看他们的 IPN docs,他们建议:

    检查电子邮件地址以确保这不是欺骗

    不过,更重要的是,你应该看看:

    verify_sign = AtkOfCXbDm2hu0ZELryHFjY-Vb7PAUvS6nMXgysbElEn9v-1XcmSoGtf

    在您可以信任邮件的内容之前,您必须首先验证邮件来自 PayPal。要验证消息,您必须按照接收到的确切顺序将内容发回,并在其前面加上命令 _notify-validate,如下所示:

    这意味着,当您收到发往example.com/return.php page 的 IPN(可能在任何时间且不在您的最终用户将触发的 HTTP 请求/响应的正常流程中)时,您会将这些信息发回到 PayPal 并让 他们 验证您收到的内容是否正确,并且来自他们。

    然后,PayPal 将发送一条单字消息,如果消息有效,则为 VERIFIED,如果消息无效,则为 INVALID。

    因此,在您假设有人向您的端点发送欺骗数据的示例中,PayPal 无论如何都会将其验证为无效,然后您可以采取您需要做的事情来确保它不会再次发生(日志记录、IPTables 等)。

    【讨论】:

    • 我没有使用 Paypal。我有 2checkouts 的工作。所以我有一些问题... verify_sign 是更改每个请求。我的意思是每个请求。这意味着在我们收到付款成功消息后,我们再次将verify_sign 作为 URL 发送到 Paypal(如 paypal.com/any-url?order_id=1282828&verify_sign=.......)。然后它返回成功或失败。我说的对吗?
    • 是的,你没看错。每次您从他们的服务器(或来自欺骗者)收到付款已通过的请求时,他们都会为您提供一个唯一令牌。这会随着对端点的每个请求而改变,所以是的,每次都会有所不同。您将此令牌发回给他们以确保它来自他们,因为他们持有令牌的真实来源(并且欺骗者不能伪造这个,除非他们知道如何生成该令牌,他们不知道,只有支付网关可以)。
    • 使用 2 次结帐,看起来略有不同。 2checkout.com/documentation/notifications。您可以自己计算,他们确实发送了正确的信息,因为只有您和他们知道您的密语。显然你正在使用 SSL 加密/https,所以这个秘密词不能被截获。
    • 感谢您的回答。 :-) :-)
    • 其他支付网关只需发送一个带有交易 ID 的 POST 请求,作为状态已更改的通知。然后,您应该自己获得新状态。有人可以伪造通知,但您仍然可以从 API 中获取真实状态。
    猜你喜欢
    • 2017-08-04
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 2019-05-30
    • 2017-01-01
    • 2019-06-27
    • 2018-09-09
    • 2011-05-05
    相关资源
    最近更新 更多