2016-09-26 2 views
2

Ich benutze ASP.Net 4.5, aber mit einer sehr alten Version der PayPal SOAP API. Der Verweis bezieht sich auf paypal_base.dll mit einer gemeldeten Version von 4.3.1.0. Der Code, der die API-Aufrufe hat "mit" Aussagen, die Referenz:Benötige ich eine neue PayPal-API zur Unterstützung von TLS 1.2 auf einem .Net-Server?

com.paypal.sdk.services

com.paypal.soap.api.

ich an der Stelle überprüft haben, wo der Anruf an die PayPal api gemacht wird, dass dieser Wert

System.Net.ServicePointManager.SecurityProtocol

sowohl SSL3 und TLS1 enthält. 2.

Ich zeige auf den "Sandbox" -Modus.

Aber wenn der Aufruf setExpressCheckout gemacht wird, bekomme ich eine Laufzeitausnahme, die sagt: Die Anfrage wurde abgebrochen: Konnte keinen sicheren SSL/TLS-Kanal erstellen.

Ich habe das PayPal API Samples-Projekt heruntergeladen und mit den gleichen Sandbox-Anmeldeinformationen funktioniert es. Wenn man in Fiddler schaut, sind die Aufrufe fast identisch, außer dass der API-Aufruf von samples an api3t.sandbox.paypal.com geht, während mein Code an api-aa.sandbox.paypal.com geht, aber laut der Dokumentation zu TLS 1.2 readyness Beide Apis sollten funktionieren. Ich sehe nirgends in einer der beiden APIs einen anderen Endpunkt als einen Wechsel zwischen "live" und "sandbox".

Im Fiedler Antwort, die beide zeigen: "A SSLv3-kompatible Serverhello Handshake gefunden wurde Fiddler die folgenden Parameter extrahiert Version:.. 3.3 (TLS/1.2)" Und die Antworten sind identisch mit Ausnahme des „random "Parameter. So ist die alte API-Aufruf ist TLS 1.2

Mein Code und die Proben-API-Code sind nur etwas anders, die Probe verwendet:

 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 

Wo ist mein (wieder sehr alten Code sieht wie folgt aus):

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 

Der Beispielcode funktioniert, mein Code löst den SSL/TLS-Fehler aus. Ich habe versucht, auf das neueste SDK zu aktualisieren, aber so vieles hat sich geändert, es wird ein ziemlich großer Aufwand sein, den gesamten Code zu migrieren.

Von Fiddler scheint es TLS 1.2 sogar mit der alten API zu verwenden, aber ich bekomme eine Laufzeitausnahme über die SSL/TLS-Verbindung. Liegt es am unterschiedlichen Endpunkt? Ist die alte API einfach zu alt?

Vielen Dank im Voraus für jede Hilfe - ich würde gerne vermeiden, all diesen alten Code zu migrieren !.

EDIT: Ich sollte erwähnen, ich benutze die Benutzername/Passwort/Unterschrift Anmeldeinformationen, nicht zertifikatbasierte Anmeldeinformationen.

+0

Hey Jeff ... Ich erbte nur alte WebForms-Code, der genau diese Sorge hat. Hast du dich gefragt, ob du jemals eine Antwort darauf bekommen hast? – user1011627

+1

Entschuldigung, ich glaube, ich habe vergessen, hierher zu kommen, um die Antwort zu akzeptieren, aber PP_MTS_hzhu ist korrekt. Ich aktualisierte die Assembly auf 4.5 und fügte dann die Codezeile in der Antwort zu einem statischen Konstruktor hinzu, und es funktionierte. Ich musste keine neue PayPal-API verwenden. –

+0

Danke für die Antwort .... schätzen es. – user1011627

Antwort

0

Da TLS1.2 in .Net4.5 unterstützt wird, ist es kein Standardprotokoll. Sie müssen sich anmelden, um es zu verwenden. Der folgende Code wird TLS 1 machen.2 Standard, stellen Sie sicher, es vor dem Herstellen einer Verbindung zu gesicherten Ressource auszuführen:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 
+0

Danach wird die Ausnahme geändert in "Daten von der Transportverbindung können nicht gelesen werden: Eine bestehende Verbindung wurde vom Remote-Host zwangsweise geschlossen." Gibt es noch etwas, das geändert werden muss? – Alex