我正在努力将PayPal Express Checkout集成到现有的Web应用程序中,我已经设置了Google Checkout和Amazon Payments(SimplePay和CBA)。所以我不是新手。
所有内容(包括即时更新回调)在使用沙盒设置的设置中都能正常运行。回调在沙盒中的HTTP和HTTPS上都可以正常工作。但是一旦我切换到Live凭据,PayPal用户界面就会停止点击CallbackURL并回退到使用SetExpressCheckout中发送的(后退)运费。显然,税收根本没有计算。
我正在使用最新版本的PayPal PHP SDK(版本106.0)。将设置从Sandbox切换为Live的唯一设置是:
sandbox
到live
)我在PayPal的社区帮助论坛上发布了a similar issue,但没有提到解决方案。出于某种原因,我似乎无法在该帖子中发帖...也许是因为它已存档。
2013年9月16日更新: 似乎是与HTTPS相关的问题。 Sandbox在HTTPS上也不起作用,但是从浏览器点击回调URL时没有SSL错误。证书有效且我们在网站上使用的其他付款供应商完全可以接受:Google电子钱包和亚马逊付款。
答案 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>