【问题标题】:Paypal Chained Payment IPN Won't Stop CallbacksPaypal 链式支付 IPN 不会停止回调
【发布时间】:2015-04-29 13:06:36
【问题描述】:

我在尝试让 Paypal 停止 IPN 回调时遇到了严重问题。在我验证交易并使用我的 IPN 侦听器处理它之后,我直接通过 HTTP Post 将消息发送回 Paypal。我记录了返回消息,该消息始终返回为已验证。

这是我发回 Paypal 的帖子内容,每个 val 用 | 分隔为了可读性

Form Vals: transaction[0].is_primary_receiver:true | transaction[0].id_for_sender_txn:4YY80224KU744182S | log_default_shipping_address_in_transaction:false | transaction[0].receiver:za@gmail.com | action_type:PAY | ipn_notification_url:http://www.example.com/Paypal/IPNListener | transaction[1].paymentType:SERVICE | transaction[0].amount:USD 1.55 | charset:windows-1252 | transaction_type:Adaptive Payment PAY | transaction[1].id_for_sender_txn:0FS22745TN9966034 | transaction[1].is_primary_receiver:false | transaction[0].status:Completed | notify_version:UNVERSIONED | transaction[0].id:5B218293JN593094R | cancel_url:http://www.example.com/Paypal/PaymentCanceledConfirmation | transaction[1].status_for_sender_txn:Completed | transaction[1].receiver:admin@example.com | verify_sign:AiPC9BjkCyDFQXbSkoZcgqH3hpacAEFoy0ipZhsKn7zJVWqtp2H1UZjq | sender_email:example@hotmail.com | fees_payer:EACHRECEIVER | transaction[0].status_for_sender_txn:Completed | return_url:http://www.example.com/Paypal/PaymentConfirmation | transaction[0].paymentType:SERVICE | transaction[1].amount:USD 0.07 | reverse_all_parallel_payments_on_error:false | tracking_id:10 | transaction[1].pending_reason:NONE | pay_key:AP-7DV229946G566022G | transaction[1].id:490095471X083615J | transaction[0].pending_reason:NONE | status:COMPLETED | transaction[1].status:Completed | payment_request_date:Thu Feb 26 15:01:35 PST 2015 |

这是我用来将 REQUEST 发回 Paypal 的代码:

private string GetPayPalResponse(Dictionary<string, string> formVals)
    {
        string url = ConfigurationManager.AppSettings["PaypalUrl"];

        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);

        // Set values for the request back
        req.Method = "POST";
        req.ContentType = "application/x-www-form-urlencoded";

        byte[] param = Request.BinaryRead(Request.ContentLength);
        string strRequest = Encoding.ASCII.GetString(param);

        StringBuilder sb = new StringBuilder();
        sb.Append(strRequest);

        foreach (string key in formVals.Keys)
        {
            sb.AppendFormat("&{0}={1}", key, formVals[key]);
        }
        strRequest += sb.ToString();
        req.ContentLength = strRequest.Length;

        //Send the request to PayPal and get the response
        string response = "";
        using (StreamWriter streamOut = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII))
        {
            streamOut.Write(strRequest);
            streamOut.Close();
            using (StreamReader streamIn = new StreamReader(req.GetResponse().GetResponseStream()))
            {
                response = streamIn.ReadToEnd();
            }
        }

        return response;
    }

非常感谢任何帮助!

【问题讨论】:

    标签: paypal paypal-ipn payment chained


    【解决方案1】:

    您的 IPN 脚本中一定存在某种错误,无法将 200 OK 响应返回给 PayPal。您需要运行一些测试才能发现问题,或者您可能只需检查您的网络日志即可查看问题。

    这里有一篇您可能感兴趣的关于how to test PayPal IPN 的文章。按照这些步骤,您应该能够查明问题所在。

    【讨论】:

    • 那么当我将 REQUEST 回发到 Paypal 时,即使我得到了 VERIFIED 响应,实际的 HTTP 响应也一定不是 200 正确的?
    • 您总是 POST 回 PayPal 以验证 IPN 数据,但之后您的脚本应该会成功完成。您的代码中一定有某种错误导致 IPN 脚本在某些时候失败。
    • 我会检查,但我正在记录所有错误,但没有看到任何记录。我的 IPN 侦听器首先从发送的 Paypal 获得响应。如果它是“已验证”,那么我会继续获取请求值、金额、跟踪 ID 等。然后我完成订单,然后将完全相同的请求发送回 Paypal。这不是正确的顺序吗?我查看了我的 IPN 历史记录,HTTP 响应代码是 405。这个代码应该是 200 正确吗?
    • 对,除 200 以外的任何内容都会导致他们的系统继续发送 IPN。听起来你有一个额外的电话回他们的服务器,你不需要。您收到 POST,然后将其 POST 回 PayPal,然后再执行任何其他操作以验证或无效。如果经过验证,则继续保存您的 val 并执行您需要对数据执行的任何操作。届时无需额外回电 PayPal。
    • 好的,谢谢。我认为那是我做错了。我首先通过我的 IPN 从 Paypal 获得初始响应,然后我得到那些 REQUEST vals,处理它们,然后我将响应发送回 Paypal。当我似乎应该得到请求然后将其发送回来......然后我处理变量。我跟着这个 tut,他只收到了 POST 并处理了 val ...blog.liamcavanagh.com/2012/06/…
    猜你喜欢
    • 2015-04-18
    • 2013-03-20
    • 2012-01-17
    • 2013-02-15
    • 1970-01-01
    • 2021-08-04
    • 2012-04-10
    • 2015-03-29
    • 1970-01-01
    相关资源
    最近更新 更多