PayPal PDT 在沙箱中工作但不实时

标签 paypal paypal-pdt

我正在尝试在我们的网站上添加一个 Paypal 支付按钮。我已打开自动返回和付款数据传输。

当我指向沙盒时,一切正常,它会返回我的网站,并在 url 中包含交易 ID。

当我指向生产 PayPal 时,没有返回交易 ID。付款确实通过了。

表单代码如下:

    <form action="#VARIABLES.strHostAddress#" method="post" target="_top" id="testform">
        <input type="hidden" name="cmd" value="_donations">
        <input type="hidden" name="business" value="#VARIABLES.strBusinessEmail#">
        <input type="hidden" name="item_name" value="#VARIABLES.strGiftDesignation# - #VARIABLES.strGiftDesignation2#">
        <input type="hidden" name="amount" value="#VARIABLES.intPayAmt#">
        <input type="hidden" name="first_name" value="#VARIABLES.strFirstName#">
        <input type="hidden" name="last_name" value="#VARIABLES.strLastName#">
        <input type="hidden" name="address1" value="#VARIABLES.strLine1#">
        <input type="hidden" name="address2" value="#VARIABLES.strLine2#">
        <input type="hidden" name="city" value="#VARIABLES.strCity#">
        <input type="hidden" name="state" value="#VARIABLES.strState#">
        <input type="hidden" name="zip" value="#VARIABLES.strPostalCode#">
        <input type="hidden" name="email" value="#VARIABLES.strEmail#">
        <input type="hidden" name="cancel_return" value="#VARIABLES.strCancelPage#">
        <input type="hidden" name="return" value="#VARIABLES.strThankYouPage#">
        <input type="hidden" name="rm" value="2">
    </form>

#VARIABLES.strHostAddress# 是“https://www.paypal.com/cgi-bin/webscr”(对于实时)或“https://www.sandbox.paypal.com/cgi-bin/webscr”(对于沙盒)。

对于为什么会发生这种情况有什么建议或想法吗?

最佳答案

我在 PayPal 的开发者网站上提供了一步一步的解释,重要的部分是您获得“tx”值,并将其与您可以在 PayPal 上找到的 PDT“Identity Token”一起发回登录配置 PDT 时的帐户。

以下步骤说明了 PDT 交易的基本流程。

“客户提交付款。 PayPal 通过 HTTP 将付款的交易 ID 作为 GET 变量 (tx) 发送。此信息将发送到您在 PayPal 帐户配置文件中指定的返回 URL。 您的返回 URL 网页包含一个 HTML POST 表单,用于检索交易 ID 并将交易 ID 和您的唯一 PDT token 发送到 PayPal。 Paypal 回复一条指示成功或失败的消息。 SUCCESS 消息包含事务详细信息,每行一个,格式为 =。这个键值对字符串是 URL 编码的。”

好的,我刚刚找到了这个 GitHub 链接,它提供了各种代码版本,说明如何获取“tx”并使用它以及身份 key 来获取所有名称值对并解析它们。它在每种语言中都有一个示例。只需单击文件名即可。

// ASP .NET C#

using System;
using System.IO;
using System.Text;
using System.Net;
using System.Web;
using System.Collections.Generic;

public partial class csPDTSample : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // CUSTOMIZE THIS: This is the seller's Payment Data Transfer authorization token.
        // Replace this with the PDT token in "Website Payment Preferences" under your account.
        string authToken = "Dc7P6f0ZadXW-U1X8oxf8_vUK09EHBMD7_53IiTT-CfTpfzkN0nipFKUPYy";
        string txToken = Request.QueryString["tx"];
        string query = "cmd=_notify-synch&tx=" + txToken + "&at=" + authToken;

        //Post back to either sandbox or live
        string strSandbox = "https://www.sandbox.paypal.com/cgi-bin/webscr";
        string strLive = "https://www.paypal.com/cgi-bin/webscr";
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(strSandbox);

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


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

        Dictionary<string,string> results = new Dictionary<string,string>();
        if(strResponse != "")
        {
            StringReader reader = new StringReader(strResponse);
            string line=reader.ReadLine();

            if(line == "SUCCESS")
            {

                while ((line = reader.ReadLine()) != null)
                {
                    results.Add(line.Split('=')[0], line.Split('=')[1]);

                        }                    
                Response.Write("<p><h3>Your order has been received.</h3></p>");
                Response.Write("<b>Details</b><br>");
                Response.Write("<li>Name: " + results["first_name"] + " " + results["last_name"] + "</li>");
                Response.Write("<li>Item: " + results["item_name"] + "</li>");
                Response.Write("<li>Amount: " + results["payment_gross"] + "</li>");
                Response.Write("<hr>");
            }
            else if(line == "FAIL")
            {
                // Log for manual investigation
                Response.Write("Unable to retrive transaction detail");
            }
        }
        else
        {
            //unknown error
            Response.Write("ERROR");
        }            
    }
}

PDT-Code-Samples on GitHub

关于PayPal PDT 在沙箱中工作但不实时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51639726/

相关文章:

javascript - Paypal 中的 RESOURCE_NOT_FOUND

php - 如何保证 PayPal 变量的安全

php - cakephp 出错

PayPal 事件通知,类型 : "Withdraw Funds to Bank Account" (Does it exist? )

paypal - nopCommerce Paypal PDTHandler

php - Paypal IPN 数据

paypal - PayPal Donate 是否支持支付数据传输?

php - Paypal PDT 脚本无法使用 cURL

javascript - Node js paypal rest sdk 401错误