4

最近、PayPal サンドボックスが TLS 1.2 接続に制限されました。これにより、本番の PayPal では動作しますが、サイトは PayPal サンドボックスで動作しなくなります。将来的には、実稼働の PayPal にも同じ制限が適用される予定です。PayPal との通信には、従来の ASP と Microsoft WinHTTP.WinHTTPRequest.5.1 コンポーネントを使用しています。以下にコードを示します。objHttp.StatusText は「Bad Request」を返します。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 を使用して 1 日に数回失敗したため、WinHTTP を使用することを好みます。WinHTTPRequest.5.1. このコード行にも自信がありません: objHttp.Option(9) = &H0AA0 。私たちが使用している回避策は、PayPal にメッセージを送信するために WebAPI を呼び出すことです。ただし、これにより余分なわずかな遅延が発生します。

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
4

4 に答える 4

2

このオプション:

httpRequest.option (9) = 2720

Windows 2012 以降でのみ動作します

Windows 2008 R2 のシステム ライブラリ "winhttp.dll" には、次のような TLS 1.0 のレコードしかありません。

httpRequest.option (9) = 128

他の値は例外をドロップします。

しかし、コードに追加の変更を加えることなく、レジストリの変更のみを必要とするソリューションを見つけました。詳細はこちら: クラシック ASP アウトバウンド TLS 1.2

于 2016-08-29T08:21:12.590 に答える
2

私のアプリケーションは ASP クラシックで書かれておりWinHttp.WinHttpRequest.5.1、代わりに を使用していMSXML2.ServerXMLHTTP.6.0ます。Paypal サンドボックスの URL に投稿します。

私にとってうまくいくのは、WinHttp.WinHttpRequest.5.1 objecTLS 1.2を使用するように指示することです:

設定

httpRequest = Server.CreateObject("WinHttp.WinHttpRequest.5.1")
httpRequest.option (9) = 2720

Windows Server 2012 のすべて

于 2016-05-07T03:44:56.063 に答える