我设法让它使用来自(在Security Now Podcaststartcom.org
上听说过)的免费证书。
他们的网站很糟糕,但是 PayPal 似乎对他们的证书没问题,而对 Godaddy 证书却不满意——都是 4096 位。另外它是免费的:-) 虽然只有一年好。
一旦我切换到此证书,它就可以正常工作。
GoDaddy/Starfield 颁发的证书对 PayPal 来说绝对是不可接受的。
我发现还有一项服务ngrok
非常有用,可以让我在本地进行测试。它允许您设置可从外部访问的隧道代理。即使不接触防火墙设置,您也可以创建一个http://83def5f1.ngrok.io
可通过 PayPal 访问的地址,并将流量重定向到您的本地计算机,从而允许您设置断点。
代理页面
(与 ngrok 完全无关)
我宁愿不将此证书用于我的实时站点(另外,我在 UCC 证书上有几个不同的站点,我不想更改),所以我创建了一个代理页面,将请求重定向到正确的服务器。然后我只需将以下内容发送到 PayPal
"https://example.com/paypalproxy.aspx?callbackUrl=" + HttpUtility.UrlEncode(callbackUrl)
callbackUrl
(您将发送到 PayPal 的常规回调 URL 位于何处)
代理是一个 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>