最近PayPal沙箱仅限于TLS 1.2连接。这使我们的网站停止使用PayPal沙箱,尽管它仍然适用于生产PayPal。在未来,生产PayPal将具有相同的限制。我们使用经典ASP和Microsoft WinHTTP.WinHTTPRequest.5.1组件与PayPal进行通信。这是下面的代码。 objHttp.StatusText返回“错误请求”。我们在Windows Server 2008 R2上。我尝试使用MSXML2.ServerXMLHTTP.6.0,但它只适用于我的Windows 8.1开发机器,而不适用于我们的Windows Server 2008 R2。虽然MSXML2.ServerXMLHTTP.6.0是WinHTTP.WinHTTPRequest.5.1的超集,但它不如WinHTTP.WinHTTPRequest.5.1可靠。我们的代码过去每天使用MSXML2.ServerXMLHTTP.6.0几次失败,所以我更喜欢使用WinHTTP.WinHTTPRequest.5.1。我对这行代码也没有信心:objHttp.Option(9)=& H0AA0。我们正在使用的解决方法是调用WebAPI向PayPal发送消息;但是,这会导致额外的轻微延迟。
dim objHttp
Set objHttp = Server.CreateObject("WinHTTP.WinHTTPRequest.5.1")
dim WinHttpRequestOption_EnableHttp1_1 : WinHttpRequestOption_EnableHttp1_1 = 17
objHttp.Option(WinHttpRequestOption_EnableHttp1_1) = False
dim WinHttpRequestOption_SslErrorIgnoreFlags : WinHttpRequestOption_SslErrorIgnoreFlags=4
objHttp.Option(WinHttpRequestOption_SslErrorIgnoreFlags) = &H3300
objHttp.setTimeouts 0, 120000, 120000, 120000
objHttp.Option(9) = &H0AA0 '2720
objHttp.open "post", "" & "https://api-3t.sandbox.paypal.com/2.0/" & "", False
strRequest = SetExpressCheckoutSOAP(returnURL, cancelURL)
objHttp.setRequestHeader "Content-Type", "text/xml; charset=utf-8"
objHttp.setRequestHeader "Content-Length", Len(strRequest)
objHttp.setRequestHeader "Host", "api-3t.sandbox.paypal.com"
Call objHttp.send(strRequest)
if objHttp.Status = 200 then
resp = objHttp.responseText
else
response.write objHttp.StatusText
end if
WebAPI调用代码:
dim webapiresp, webapidata
webapidata = "{""url"":""" & gv_APIEndpoint & """, ""message"":""" & nvpStrComplete & """,""soap"":0}"
webapiresp=InvokeWebAPI(strApiDomain, "POST", "comm/send", "", webapidata)
set reply=JSON.parse(webapiresp)
resp = reply.xml
Function InvokeWebAPI(strApiDomain, method, funcname, param, data)
dim HttpReq, apiURI, resp
set HttpReq=Server.CreateObject("MSXML2.ServerXMLHTTP")
'apiURI=strApiDomain & funcname & param
apiURI=strApiDomain & "api/" & funcname & param
HttpReq.open method, apiURI, false
HttpReq.setRequestHeader "Content-Type", "application/json; charset=UTF-8"
HttpReq.setRequestHeader "SOAPAction", apiURI
HttpReq.setRequestHeader "Authorization", "Basic " & Base64Encode("xxx:xxx")
if data <> "" then
HttpReq.send data
else
HttpReq.send
end if
resp = HttpReq.responseText
set HttpReq=Nothing
InvokeWebAPI = resp
End Function
答案 0 :(得分:2)
我的应用程序是用ASP经典编写的,我使用WinHttp.WinHttpRequest.5.1
代替MSXML2.ServerXMLHTTP.6.0
。发布到paypal沙盒网址。
对我有用的是告诉WinHttp.WinHttpRequest.5.1 objec
使用TLS 1.2:
设置
httpRequest = Server.CreateObject("WinHttp.WinHttpRequest.5.1")
httpRequest.option (9) = 2720
Windows Server 2012上的所有内容
答案 1 :(得分:1)
此选项:
httpRequest.option (9) = 2720
仅适用于Windows 2012及更新版
系统库&#34; winhttp.dll&#34; Windows 2008 R2只有TLS 1.0的记录等于:
httpRequest.option (9) = 128
其他值将丢弃异常。
但我找到了一个只需要更改注册表的解决方案,而无需对代码进行任何其他更改。 详情请见: Classic ASP Outbound TLS 1.2
答案 2 :(得分:0)
我遇到了完全相同的问题,但是我没有在option(9)
中设置WinHttpRequestOption_SecureProtocols
,而是在WinHttp本身中添加了对TLS 1.2的支持。
请参阅下面的文章,您可以在其中运行“轻松修复”或手动添加注册表项
答案 3 :(得分:0)
首先,您需要在服务器上启用对TLS 1.2的支持(我更喜欢使用IISCrypto中的免费Nartac Software工具)
然后您可以通过以下注册表项的设置来更改默认行为:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp]
"DefaultSecureProtocols"=dword:00000800
如果您使用的是32位应用程序,则还需要以下密钥:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp]
"DefaultSecureProtocols"=dword:00000800