PayPal PDT可在沙盒中运行,但不能实时运行

时间:2018-08-01 18:09:08

标签: paypal paypal-pdt

我正在尝试在我们的网站上添加“贝宝付款”按钮。我已打开自动退货和付款数据传输功能。

当我指向沙箱时,一切正常,它会以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”。

任何建议或想法为什么会发生这种情况?

1 个答案:

答案 0 :(得分:0)

我将逐步解释贝宝在其开发人员网站上的内容,其中重要的部分是您获取“ tx”值,并将其与可在贝宝上找到的PDT“身份令牌”一起寄回登录配置PDT时使用的帐户。

以下步骤说明了PDT事务的基本流程。

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

好吧,我刚刚找到了这个GitHub链接,该链接提供了有关如何获取和使用“ tx”的各种代码版本以及Identity 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