当有人在 Ebay 上向我付款时,我网站上的 PayPal IPN 侦听器开始抛出 Guid 错误

Posted

技术标签:

【中文标题】当有人在 Ebay 上向我付款时,我网站上的 PayPal IPN 侦听器开始抛出 Guid 错误【英文标题】:PayPal IPN Listener on my website has started throwing a Guid error when someone pays me on Ebay 【发布时间】:2020-09-23 23:22:09 【问题描述】:

下面是我的 IPN 侦听器,它在我的网站上一直运行良好,用于客户 PayPal 付款。它以 Guid 格式(32 位数字和 4 个破折号)为我的网站设置订单。但是,我使用同一个 PayPal 帐户进行 Ebay 销售,并且我刚刚出售了一件物品,在付款时导致以下错误:

System.FormatException
Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).

在 IPN 历史记录中,付款状态为 COMPLETED,但 HTTP 响应代码为 500,交付状态为“重试”。我收到了来自 PayPal 的电子邮件警告,这让我很担心,因为我的网站需要 IPN。

我检查了 Ebay 交易,“自定义”是 EBAY_ENSDX00001030330553110,所以我猜我的 IPN 代码不喜欢这样。有没有办法让 Ebay 交易远离我在 PayPal 中的 IPN 监听器?或者有什么方法可以让我在下面编辑我的 IPN 代码来处理不是 32 位格式的自定义 ID?

IPN 监听器..

Imports System.Net
Imports System.IO
Imports System.Net.Cache

Partial Class IPNListener
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        'Post back to either sandbox or live
        'Dim strSandbox As String = "https://www.sandbox.paypal.com/cgi-bin/webscr"
        Dim strLive As String = "https://ipnpb.paypal.com/cgi-bin/webscr"

        'SSL Error Code
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

        Dim req As HttpWebRequest = CType(WebRequest.Create(strLive), HttpWebRequest)

        'Set values for the request back
        req.Method = "POST"
        req.ContentType = "application/x-www-form-urlencoded"
        Dim Param() As Byte = Request.BinaryRead(HttpContext.Current.Request.ContentLength)
        Dim strRequest As String = Encoding.ASCII.GetString(Param)

        strRequest = strRequest + "&cmd=_notify-validate"
        req.ContentLength = strRequest.Length

        'Send the request to PayPal and get the response
        Dim streamOut As StreamWriter = New StreamWriter(req.GetRequestStream(), Encoding.ASCII)
        streamOut.Write(strRequest)
        streamOut.Close()
        Dim streamIn As StreamReader = New StreamReader(req.GetResponse().GetResponseStream())
        Dim strResponse As String = streamIn.ReadToEnd()
        streamIn.Close()

        Dim qscoll As NameValueCollection = HttpUtility.ParseQueryString(strRequest)

        'Insert the paypal response
        Dim order As New orders
        order.InsertPaypalResponse(qscoll("txn_id"), qscoll("custom"), strRequest)

        If strResponse = "VERIFIED" Then
            order.UpdateOrderFromPaypal(qscoll("custom"), qscoll("txn_id"), qscoll("payment_status"))

        ElseIf strResponse = "INVALID" Then
            'log for manual investigation
            order.UpdateOrderFromPaypal(qscoll("custom"), qscoll("txn_id"), qscoll("payment_status"))
        Else
            'Response wasn't VERIFIED or INVALID, log for manual investigation
            order.UpdateOrderFromPaypal(qscoll("custom"), qscoll("txn_id"), "ERROR")
        End If
    End Sub
End Class

【问题讨论】:

【参考方案1】:

如果是 EBAY 交易,您可以跳过验证并成功退出,因为您不需要对其进行任何操作。

所有 PayPal 需要您做的就是返回 HTTP 200,这样他们就可以将 IPN 标记为已成功交付。 (问题是您当前正在返回 HTTP 500 或类似内容,导致 PayPal 将交付标记为失败。)


另一种解决方案是在您网站的交易级别指定您网站的 notify_url,作为每个交易的 API 设置(或 html 重定向,如果没有 API)中的参数,它会覆盖您 PayPal 帐户中的任何设置(或缺少设置) .然后在您的 PayPal 帐户中,您可以清空 IPN 侦听器 URL,您将不会再获得任何用于 Ebay 交易的 IPN。

【讨论】:

非常感谢,这真的很有帮助。我还在学习这一切.. 我会在 Dim order As New orders 之前放一个 IF 语句吗?最好的检查是什么?我猜:IF LEN(qscoll("custom")) =36 THEN.... 我不一定会基于自定义。你可以,也许如果 custom > 32,但在有效负载中可能有一个更好的变量来检查。 感谢您的帮助。我已将 IF LEN(qscoll("custom")) >= 32 THEN 添加到我的 IPN 以了解情况如何。如果我遇到任何问题,我会做 Notify_Url 的事情。欣赏,谢谢。

以上是关于当有人在 Ebay 上向我付款时,我网站上的 PayPal IPN 侦听器开始抛出 Guid 错误的主要内容,如果未能解决你的问题,请参考以下文章

网络上的 UPI 付款响应

PayPal API - 如何在我的网站上保留付款流程?

当来电者和发件人相同时,如何使用贝宝自适应付款方式汇款?

使用 PayPal 设置支付数据库(支付监听器)

Discord Bot 可以在频道上向所有人发送消息吗

用于定期付款的 PayPal IPN