【问题标题】:Do I need a new PayPal API to support TLS 1.2 on .Net server?我是否需要新的 PayPal API 来支持 .Net 服务器上的 TLS 1.2?
【发布时间】:2017-02-04 09:17:16
【问题描述】:

我正在运行 ASP.Net 4.5,但使用的是非常旧的 PayPal SOAP api 版本。参考报告版本为 4.3.1.0 的 paypal_base.dll。调用 API 的代码具有引用的“使用”语句:

com.paypal.sdk.services

com.paypal.soap.api.

我已经在调用 PayPal api 时验证了这个值

System.Net.ServicePointManager.SecurityProtocol

包括 ssl3 和 tls1.2。

我指的是“沙盒”模式。

但是当调用 setExpressCheckout 时,我得到一个运行时异常,上面写着: 请求中止:无法创建 SSL/TLS 安全通道。

我已经下载了 PayPal API 示例项目并使用相同的沙箱凭据,它可以工作。在 Fiddler 中查看,调用几乎相同,除了示例 API 调用转到 api-3t.sandbox.paypal.com,而我的代码转到 api-aa.sandbox.paypal.com,但根据有关 TLS 1.2 就绪性的文档,两个 api 都应该工作。除了在“实时”和“沙盒”之间切换之外,我在这两个 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,但发生了很大的变化,迁移所有代码需要付出相当大的努力。

从提琴手看来,即使使用旧 API,它似乎也在使用 TLS 1.2,但我得到一个关于 SSL/TLS 连接的运行时异常。是因为端点不同吗?旧 API 是否太旧了?

提前感谢您的帮助 - 我希望避免迁移所有古老的代码!

编辑:我应该提到我使用的是用户名/密码/签名凭据,而不是基于证书的凭据。

【问题讨论】:

  • Hey Jeff...我刚刚继承了具有同样问题的旧 WebForms 代码。想知道您是否曾经得到过这个问题的答案?
  • 对不起,我想我忘了回来这里接受答案,但PP_MTS_hzhu是正确的。我将程序集升级到 4.5,然后在静态构造函数的答案中添加了这行代码,它就可以工作了。我不需要使用新的 PayPal API。
  • 感谢您的回复......感谢它。

标签: asp.net api ssl soap paypal


【解决方案1】:

由于 .Net4.5 支持 TLS1.2,但它不是默认协议。您需要选择加入才能使用它。以下代码将使 TLS 1.2 默认,确保在连接到安全资源之前执行它:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

【讨论】:

  • 之后异常改为“无法从传输连接中读取数据:现有连接被远程主机强行关闭”。还有什么需要改变的吗?
【解决方案2】:

我遇到了类似的问题,在 C# Web 应用程序 4.5 中使用 PP 沙盒凭据“HttpWebRequest”,收到以下错误:“在调用 [Begin]GetResponse 之前,您必须将 ContentLength 字节写入请求流”。 我阅读了此 Q/A 并应用了上面答案中的 ServicePointManager 参考 - 作为我的 HttpWebRequest 调用方法的第一行,它起作用了。谢谢大家。 仅供参考,我正在构建的示例代码来自 //docs.microsoft.com,“ASP.NET 4.5 Web 窗体和 Visual Studio 2017 入门”。

【讨论】:

    猜你喜欢
    • 2016-09-12
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 2021-11-20
    • 2018-08-23
    • 1970-01-01
    相关资源
    最近更新 更多