Подтвердить что ты не робот

SetExpressCheckout и ошибка SSL/TLS

Я пытаюсь разработать простое приложение, которое позволит пользователям приобретать сервисы с веб-сайта через API Paypal. Это приложение работает на ASP.NET с С#.

У меня было очень мало удачи, пытаясь заставить API Paypal сотрудничать. Метод, который я вызываю, - SetExpressCheckout со всеми соответствующими переменными.

Я сделал свое исследование и обнаружил, что, поскольку я тестирую в Localhost, это может повлиять на способность 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

4b9b3361

Ответ 1

Вероятно, вы подключаетесь к api.paypal.com или api.sandbox.paypal.com, а не отправляете сертификат API. Сертификат API - это сертификат SSL клиента, используемый для завершения цепи SSL.

Если у вас нет или нет сертификата API, вы должны подключиться к api-3t.paypal.com или api-3t.sandbox.paypal.com для Live или Sandbox соответственно.

Ответ 2

С начала 2016 года Paypal начал требовать протокол TLS 1.2 для связи в Песочнице и будет применять его для живой среды, начиная с 17 июня. См. здесь для справки.

В большинстве приложений .NET TLS 1.2 по умолчанию отключен, поэтому вам нужно включить его.

Вам нужно добавить следующую строку, например, в начале вашего метода Application_Start:

public class Site : HttpApplication
{
    protected void Application_Start()
    {
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
        // other configuration
    }
}

Ответ 3

Я работал с интеграцией PayPal (NVP/Signature) Express Checkout и был поражен этой ошибкой 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();
...

Ответ 4

Большое спасибо, что действительно помогает мне.

Для справки здесь мой код для установления интерфейса в 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