我正在运行ASP.Net 4.5,但使用的是非常旧版本的PayPal SOAP api。引用的是paypal_base.dll,报告版本为4.3.1.0。调用API的代码有"使用"引用的陈述:
com.paypal.sdk.services
com.paypal.soap.api。
我已经对PayPal api的调用进行了验证,即该值
System.Net.ServicePointManager.SecurityProtocol
包括ssl3和tls1.2。
我指着"沙盒"模式。
但是当调用setExpressCheckout时,我得到一个运行时异常,说: 请求已中止:无法创建SSL / TLS安全通道。
我已经下载了PayPal API Samples项目并使用相同的沙箱凭据,它可以正常运行。看着Fiddler,除了示例API调用到api-3t.sandbox.paypal.com之外,调用几乎相同,而我的代码转到api-aa.sandbox.paypal.com,但根据TLS 1.2准备就绪的文档,两个apis应该工作。除了在" live"之间切换之外,我在任一API中都看不到设置端点的位置。和"沙盒"。
在小提琴手的回应中,两人都表示: "找到了与SSLv3兼容的ServerHello握手。 Fiddler提取了以下参数。 版本:3.3(TLS / 1.2)" 并且响应是相同的,除了"随机"参数。所以旧的API调用正在使用TLS 1.2
我的代码和Samples API代码略有不同,示例使用:
SetExpressCheckoutRequestType request = new SetExpressCheckoutRequestType();
populateRequestObject(request); //populate request data
SetExpressCheckoutReq wrapper = new SetExpressCheckoutReq();
wrapper.SetExpressCheckoutRequest = request;
Dictionary<string, string> configurationMap = Configuration.GetAcctAndConfig(); //set merchant config
PayPalAPIInterfaceServiceService service = new PayPalAPIInterfaceServiceService(configurationMap);
SetExpressCheckoutResponseType setECResponse = service.SetExpressCheckout(wrapper); //make the call
我的(再次,非常古老的代码看起来像这样):
CallerServices caller = new CallerServices();
caller.APIProfile = SetProfile.ApplicationProfile; //set merchant config
SetExpressCheckoutRequestType pp_request = new SetExpressCheckoutRequestType();
// Create the request details object
pp_request.SetExpressCheckoutRequestDetails = new SetExpressCheckoutRequestDetailsType();
pp_request.SetExpressCheckoutRequestDetails.PaymentAction = paymentAction;
pp_request.SetExpressCheckoutRequestDetails.PaymentActionSpecified = true;
pp_request.SetExpressCheckoutRequestDetails.OrderTotal = new BasicAmountType();
pp_request.SetExpressCheckoutRequestDetails.OrderTotal.currencyID = currencyCodeType;
pp_request.SetExpressCheckoutRequestDetails.OrderTotal.Value = paymentAmount;
pp_request.SetExpressCheckoutRequestDetails.CancelURL = cancelURL;
pp_request.SetExpressCheckoutRequestDetails.ReturnURL = returnURL;
return (SetExpressCheckoutResponseType) caller.Call("SetExpressCheckout", pp_request); //do the call
示例代码有效,我的代码会抛出SSL / TLS错误。我尝试升级到最新的SDK,但是已经发生了很多变化,迁移所有代码将付出相当大的努力。
来自fiddler,它似乎使用TLS 1.2,即使使用旧的API,但我得到关于SSL / TLS连接的运行时异常。是因为端点不同吗?旧的API太旧了吗?
提前感谢您的帮助 - 我希望避免迁移所有古代代码!
编辑:我应该提到我使用的是UserName / Password / Signature凭证,而不是基于证书的凭证。
答案 0 :(得分:1)
由于.Net4.5支持TLS1.2,但它不是默认协议。你需要选择使用它。以下代码将使TLS 1.2成为默认代码,请确保在连接到安全资源之前执行它:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
答案 1 :(得分:0)
我遇到了类似的问题,在C#Web应用程序4.5中使用PP沙盒认证“ HttpWebRequest”,收到以下错误:“在调用[Begin] GetResponse之前,必须将ContentLength字节写入请求流。 我阅读了此问答,并从上面的答案中应用了ServicePointManager参考-作为HttpWebRequest调用方法中的第一行,它可以正常工作。谢谢大家。 仅供参考,我正在构建的示例代码来自//docs.microsoft.com,“ASP.NET 4.5 Web窗体和Visual Studio 2017入门”。