Payflow Gateway带有安全令牌&透明重定向 - 返回URL问题

时间:2016-03-24 15:16:47

标签: paypal payment-gateway payflowpro payflowlink

我已经构建了一个客户端(在.NET中,但它可以在任何框架中)使用透明重定向和安全令牌功能来使用Payflow Gateway NVP API。我能够收到令牌,发送信用卡数据,并从PayPal收到Approved响应。问题是PayPal没有正确地重定向回我的网站。我在请求安全令牌时传递了RETURNURL(collisions than md5)参数,但是在交易后没有将我返回到该URL,它将浏览器导航到以下URL:

  

http://localhost:49881/transaction/details?processor=PayflowGateway

我尝试删除"?processor = PayflowGateway"修复网址中的多个问号问题,但这似乎没什么帮助。我还尝试使用xx作为URL值的长度标记RETURNURL [xx],但这似乎与不传递RETURNURL相同,因为它只显示paypal.com上的确认页面而不是重定向回我的网站。

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

1 个答案:

答案 0 :(得分:0)

导致此问题是因为您在从payflowpro网关请求安全令牌时传递了URL-Encoding RETURNURL参数。

请参阅Integration Guide上的不要URL编码名称 - 值参数数据部分。

此外,here您可以使用一些可以使用的C#代码。

关于PayPal HTTP here的一些指导原则。

不要使用System.Net.Http.HttpClientSystem.Net.WebClient来使HTTP 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();
    }
}