setExpressCheckout和SSL/TLS错误

11

我正在尝试开发一个简单的应用程序,通过Paypal API,使用户能够从网站购买服务。该应用程序在ASP.NET和C#上运行。

我尝试调用SetExpressCheckout方法并传入适当的变量,但是一直没有成功。

我进行了研究并发现,由于我是在本地主机上测试,这可能会影响Paypal与应用程序的通信。因此,我尝试通过公开端口和可公开访问的IP地址访问我的应用程序,但在调用SetExpressCheckout时仍然出现相同的错误。

以下是错误信息:

Exception Details: System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.

Source Error: 


Line 1790:        [return: System.Xml.Serialization.XmlElementAttribute("SetExpressCheckoutResponse", Namespace="urn:ebay:api:PayPalAPI")]
Line 1791:        public SetExpressCheckoutResponseType SetExpressCheckout([System.Xml.Serialization.XmlElementAttribute(Namespace="urn:ebay:api:PayPalAPI")] SetExpressCheckoutReq SetExpressCheckoutReq) {
Line 1792:            object[] results = this.Invoke("SetExpressCheckout", new object[] {
Line 1793:                        SetExpressCheckoutReq});
Line 1794:            return ((SetExpressCheckoutResponseType)(results[0]));

Source File: c:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\anan_p2\730602d6\31a8d74e\App_WebReferences.c8vgyrf8.2.cs    Line: 1792 

我也尝试过使用OpenSSL生成证书并将其上传到Paypal账户的加密卖家选项,但仍然没有效果。

非常感谢您阅读我的问题!

更新:根据要求,这里是正在使用的代码。

        String hostingOn = ConfigurationManager.AppSettings["default_site_url"];
        reqDetails.ReturnURL = hostingOn + "marketplace_confirm.aspx";
        reqDetails.CancelURL = hostingOn + "marketplace.aspx";
        reqDetails.NoShipping = "1";
        reqDetails.ReqConfirmShipping = "0";

        reqDetails.OrderTotal = new BasicAmountType()
        {
            currencyID = CurrencyCodeType.CAD,
            Value = payment_amt.Value,
        };

        SetExpressCheckoutReq req = new SetExpressCheckoutReq()
        {
            SetExpressCheckoutRequest = new SetExpressCheckoutRequestType()
            {
                Version = UtilPayPalAPI.Version,
                SetExpressCheckoutRequestDetails = reqDetails
            }

        };

        PayPalAPIAASoapBinding paypal = new PayPalAPIAASoapBinding();

        paypal.SetExpressCheckout(req);

我也在使用 https://api-aa-3t.paypal.com/2.0/ 这个url来访问API。


你能否发布实际用于连接的代码,而不是只贴出错误信息。还有可能存在其他几个问题,我将在下面发布。 - MethodMan
4个回答

19
自2016年初起,Paypal开始要求在沙盒环境中使用TLS 1.2协议进行通信,并将在2018年6月17日开始在正式环境中强制执行。请参见此处
在大多数.NET应用程序中,默认情况下不会启用TLS 1.2,因此您需要启用它。
例如,在您的Application_Start方法开头添加以下行:
public class Site : HttpApplication
{
    protected void Application_Start()
    {
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
        // other configuration
    }
}

4
愿上帝保佑你!你救了我的一天。 :) - Jaroslav Kubacek
3
对于使用较旧版本的MVC(3)或.NET Framework(<4.5)的用户,您可以通过使用以下代码来实现上述功能:ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; - scgough

5

您可能正在连接api.paypal.com或api.sandbox.paypal.com,但没有发送API证书。 API证书是用于完成SSL链的客户端SSL证书。

如果您没有使用API证书,您应该分别连接到api-3t.paypal.com或api-3t.sandbox.paypal.com进行实时或沙盒测试。


问题似乎是我虽然使用了正确的服务器,但没有正确调用它。我去了PayPal网站并自动生成了PayPal函数,使用包含的ShortcutExpressCheckout方法,我成功地获得了一个令牌。生成器在这里:https://www.paypal-labs.com/integrationwizard/ecpaypal/main.php - infinityLoop
paypal-labs.com的主页目前显示“我们正在开发新网站”,上面的链接返回一个空白页面。试试这个链接: https://devtools-paypal.com/integrationwizard/C#向导似乎运行良好,我还没有尝试过代码。 - Simon

2

我一直在使用PayPal (NVP/Signature)快速结账集成,但遇到了SSL/TLS错误。

无论我怎么做都似乎无法解决,但后来我找到了以下代码,将其添加到我的请求之前。参考资料是我正在使用MVC3/.NET 4,因此默认情况下无法使用Tls1.2(就像在.NET 4.5+中一样)。这段代码的前三行可以解决这个问题。希望能对大家有所帮助!

ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
ServicePointManager.DefaultConnectionLimit = 9999;

var url = "https://[paypal-api-url]/nvp";
var uri = new Uri(url);
var request = WebRequest.Create(uri);
var encoding = new UTF8Encoding();
var requestData = encoding.GetBytes(data);

request.ContentType = "application/x-www-form-urlencoded";
request.Method = "POST";
request.Timeout = (300 * 1000); 
request.ContentLength = requestData.Length;

using (var stream = request.GetRequestStream())
{
    stream.Write(requestData, 0, requestData.Length);
}

var response = request.GetResponse();
...

1

非常感谢,这对我非常有帮助。

以下是我在VB.NET中建立界面的代码供参考

  'Create a service Binding in code
                            Dim ppEndpointAddress As New System.ServiceModel.EndpointAddress("https://api-3t.sandbox.paypal.com/2.0/")
                            Dim ppBinding As New System.ServiceModel.BasicHttpBinding(System.ServiceModel.BasicHttpSecurityMode.Transport)

                            Dim ppIface As New PayPalAPI.PayPalAPIAAInterfaceClient(ppBinding, ppEndpointAddress)

                            Dim ppPaymentReq As New PayPalAPI.DoDirectPaymentReq()

                            ppPaymentReq.DoDirectPaymentRequest = ppRequest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接