1

我已经构建了一个客户端(在 .NET 中,但它可以在任何框架中)以使用透明重定向和安全令牌功能来使用 Payflow Gateway NVP API。我能够接收令牌、发送信用卡数据并收到来自 PayPal 的已批准响应。问题是 PayPal 没有正确重定向回我的网站。我在请求安全令牌时传递了一个 RETURNURL ( http://localhost:49881/transaction/details?processor=PayflowGateway ) 参数,但不是在交易后将我返回到该 URL,而是将我的浏览器导航到以下 URL:

https://pilot-payflowlink.paypal.com/http%3A%2F%2Flocalhost%3A49881%2Ftransaction%2Fdetails%3Fprocessor%3DPayflowGateway?POSTFPSMSG=No%20Rules%20Triggered&RESPMSG=Approved&ACCT=1111&COUNTRY=US&PROCCVV2=M&VISACARDLEVEL=12&CVV2MATCH=Y&CARDTYPE= 0&PNREF=A70A8EB8B6A1&AVSDATA=XXN&SECURETOKEN=9eGKZsSldEU6mIdSEV5DB4wWd&PREFPSMSG=No%20Rules%20Triggered&SHIPTOCOUNTRY=US&AMT=14.75&SECURETOKENID=1850a8f2-f180-4474-aa31-35d736fd7921&TRANSTIME=2016-03-24%2007:58:48&HOSTCODE=A&COUNTRYTOSHIP=US&RESULT=0&BILLTOCOUNTRY=US&AUTHCODE=872PNI&EXPDATE =1218

我已尝试删除“?processor=PayflowGateway”以修复 URL 中的多个问号问题,但这似乎无济于事。我还尝试使用 xx 作为 URL 值的长度来标记 RETURNURL[xx],但这似乎与根本不传递 RETURNURL 相同,因为它只是在 paypal.com 上显示确认页面而不是重定向回来到我的网站。

在 PayPal Manager 中,我将“显示确认页面”设置为“在我的网站上”,将返回 URL 设置为空白,并将返回 URL 方法设置为 GET。我是否需要进行任何其他设置或 API 请求更改才能使其正确返回到我的测试站点?

4

1 回答 1

0

导致此问题的原因是您在从 payflowpro 网关请求安全令牌时对传递的 RETURNURL 参数进行 URL 编码。

请参阅集成指南中的不要对名称-值参数数据进行 URL 编码部分。

此外,在这里您可以获得一些可以使用的 C# 代码。

还有一些关于 PayPal HTTP指南。

不要使用System.Net.Http.HttpClient也不要使用System.Net.WebClientHTTP POST 来请求安全令牌。而是使用低级别System.Net.WebRequest能够写入未编码的 POST 数据。

例如:

private string RequestSecureToken(double amount)
{
    var secureTokenId = Guid.NewGuid().ToString();
    var requestId = Guid.NewGuid().ToString();
    var pairs = new Dictionary<string, string>()
    {
        {"PARTNER", "PayPal"},
        {"VENDOR", "VENDOR NAME"},
        {"USER", "USER NAME"},
        {"PWD", "PASSWORD"},
        {"TRXTYPE", "S"},
        {"AMT", amount.ToString()},
        {"CREATESECURETOKEN", "Y"},
        {"SECURETOKENID", secureTokenId},
        {"SILENTTRAN", "TRUE"},
        {"RETURNURL", "http://mycompany.com/success"},
        {"ERRORURL", "http://mycompany.com/error"}
    };
    string postData = string.Join("&", pairs.Select(p => string.Format("{0}[{2}]={1}", p.Key, p.Value, p.Value.Length)));
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://pilot-payflowpro.paypal.com");
    request.Method = "POST";
    request.ContentType = "text/namevalue";
    request.Headers.Add("X-VPS-CLIENT-TIMEOUT", "45");
    request.Headers.Add("X-VPS-REQUEST-ID", requestId);
    request.ContentLength = postData.Length;
    using (var writer = new StreamWriter(request.GetRequestStream()))
    {
        writer.Write(postData);
    }
    //Get the response
    var response = request.GetResponse();
    using (var reader = new StreamReader(response.GetResponseStream()))
    {
        return reader.ReadToEnd();
    }
}
于 2016-08-25T04:58:00.557 回答