PayPal即时更新CallbackURL未在实时设置中调用

时间:2013-08-30 09:35:05

标签: php paypal express-checkout callbackurl

我正在努力将PayPal Express Checkout集成到现有的Web应用程序中,我已经设置了Google Checkout和Amazon Payments(SimplePay和CBA)。所以我不是新手。

所有内容(包括即时更新回调)在使用沙盒设置的设置中都能正常运行。回调在沙盒中的HTTP和HTTPS上都可以正常工作。但是一旦我切换到Live凭据,PayPal用户界面就会停止点击CallbackURL并回退到使用SetExpressCheckout中发送的(后退)运费。显然,税收根本没有计算。

我正在使用最新版本的PayPal PHP SDK(版本106.0)。将设置从Sandbox切换为Live的唯一设置是:

  • 用户名
  • 密码
  • 签名
  • 模式(从sandboxlive

我在PayPal的社区帮助论坛上发布了a similar issue,但没有提到解决方案。出于某种原因,我似乎无法在该帖子中发帖...也许是因为它已存档。

2013年9月16日更新: 似乎是与HTTPS相关的问题。 Sandbox在HTTPS上也不起作用,但是从浏览器点击回调URL时没有SSL错误。证书有效且我们在网站上使用的其他付款供应商完全可以接受:Google电子钱包和亚马逊付款。

3 个答案:

答案 0 :(得分:1)

此问题已修复: 1.将CallbackTimeout设置为6 2.使用PayPal接受的SSL证书。在我们的案例中,证书是由“Go Daddy Root Secure Certificate - G2”颁发的,PayPal的系统不接受该证书。

答案 1 :(得分:0)

我有Godaddy UCC证书的这个问题,但没有非UCC证书的问题。所以我必须编写一个代理来将请求重定向到正确的位置。

然而最近我的Godaddy证书也失败了,所以他们似乎不那么宽容而不是更宽容。它甚至没有EV证书。

它没有任何刺激感。所有回调网址都提供运费!需要流程的安全性如何。太荒谬了!除了更改我甚至无法保证的证书之外,现在没有解决方案。

答案 2 :(得分:0)

我设法使用来自startcom.org的免费证书(听说Security Now播客)。

他们的网站很糟糕,但PayPal似乎没有他们的证书,他们不能使用Godaddy证书 - 两个4096位。加上它是免费的:-)虽然只有一年好。

一旦我切换到此证书,它就可以正常工作。

这绝对是PayPal关于GoDadaddy / Starfield颁发的证书所不能接受的。

我还发现了一项服务ngrok非常有用,可以让我在本地进行测试。它允许您设置可从外部访问的隧道代理。即使没有触及防火墙设置,您也可以创建一个可由PayPal访问的http://83def5f1.ngrok.io地址,并将流量重定向到本地计算机,从而允许您设置断点。

代理页面

(与ngrok完全无关)

我不希望将此证书用于我的实时站点(另外我在UCC证书上有几个不同的站点我不想更改),因此我创建了一个代理页面,将请求重定向到正确的服务器。然后我将以下内容发送给PayPal

"https://example.com/paypalproxy.aspx?callbackUrl=" + HttpUtility.UrlEncode(callbackUrl)

(其中callbackUrl是您要发送给PayPal的常规回调网址)

代理是一个ASPX页面 - 它不需要编译只是放入.NET IIS网站。

您可以查看上次使用?debug=Y

调用它的请求/响应
<%@ Page language="c#" AutoEventWireup="true" %>
<%@ Import Namespace="System.IO"%>
<Script runat="server" language="C#">

private static string _lastURL;
private static string _lastRequest = "";
private static string _lastResponse = "";
private static DateTime? _lastTime;
private static int _lastDurationMs;

    private void Page_Load(object sender, System.EventArgs e)
    {
        // no cache
        Response.Cache.SetCacheability(HttpCacheability.NoCache);

            var sw = new System.Diagnostics.Stopwatch();
            var wc = new System.Net.WebClient();
            sw.Start();

            var callbackUrl = Request.Params["callbackUrl"];
            var debugMode = Request.Params["debug"] == "Y";

            if (debugMode) 
            {
               Response.ContentType = "text/text";
               Response.Write(_lastTime + "\n");
               Response.Write("LastURL = ["+_lastURL+"]\n\n");
               Response.Write("LastDuration = [" + _lastDurationMs +"]\n\n");
               Response.Write("REQUEST: \n[\n  "+_lastRequest.Replace("&", "&\n  ")+"\n]\n\n");
               Response.Write("RESPONSE: \n[\n  "+_lastResponse.Replace("&", "&\n  ")+"\n]");
               Response.End();
           return;
            }

            _lastDurationMs = -1;
        _lastURL = Request.Params["callbackUrl"];
            _lastTime = DateTime.Now;

            if (callbackUrl.Contains("dev."))
            {
                throw new ApplicationException("Callback shouldn't be to a dev machine!");
            }

            if (callbackUrl.Contains("https") == false)
            {
                throw new ApplicationException("Callback must be https");
            }

            var newUri = callbackUrl + "?" + Request.Form.ToString();

            var str = wc.DownloadString(newUri);

            _lastRequest = Request.Form.ToString();
            _lastResponse = str;
            _lastDurationMs = (int)sw.ElapsedMilliseconds;

            Response.Write(str);
            Response.End();

    }

</Script>