2017-09-06 4 views
0

Wir versuchen, mit den SagePay-APIs mit einem AJAX-Aufruf innerhalb einiger JQuery-Code zu integrieren. Diese besondere API gibt eine JSON-Antwort als ein Beispiel unter:SagePay Händler Sitzungsschlüssel - AJAX

{ 
"expiry": "2017-09-06T11:20:25.820+01:00", 
"merchantSessionKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 
} 

den Code unten verwenden, können wir erfolgreich gegen die API authentifizieren, aber dann mit einer Meldung hinausgeworfen über Access-Control-Allow-Origin.

XMLHttpRequest kann https://pi-test.sagepay.com/api/v1/merchant-session-keys nicht laden. Die Antwort auf die Preflight-Anforderung besteht keine Zugriffskontrollprüfung: Auf der angeforderten Ressource ist kein Header Access-Control-Allow-Origin vorhanden. Origin null ist daher nicht erlaubt.

Ist jemand schon einmal auf dieses Problem gestoßen?

Antwort

0

Sie sollten jquery ajax nicht direkt verwenden, um eine POST-Anfrage an SagePay zu stellen. Stattdessen müssen Sie eine Ajax-Anfrage an Ihren Server richten, die wiederum die Daten an SagePay sendet. Sie können das PHP-Beispiel hier erhalten: SagePay drop-in Checkout

Bitte überprüfen Sie die C# -Code unten, dass ich dies getan habe.

html:

<div id="sagePayDetails"></div> 
<form id="paymentForm"><input type="submit" value="Submit"></input></form> 

jquery:

$.ajax({ 
url: "@Url.Content("~/YourServerMethod")", 
type: "GET", 
success: function (data) { 
    if (data.Status == "SUCCESS") { 
     sagepayCheckout(
     { 
      merchantSessionKey: data.SessionKey, 
      containerSelector: "#sagePayDetails" 
     }).form({ formSelector: "#paymentForm" }); 
    } else { 
     showError("Some error occurred, please try again later."); 
    } 
}, 
error: function (xhr, status, error) { 
    showError("Some error occurred, please try again later."); 
}}); 

C#:

public JsonResult YourServerMethod(){ 
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | 
     SecurityProtocolType.Tls11 | 
     SecurityProtocolType.Tls12; 

var invokeUrl = "https://pi-test.sagepay.com/api/v1/merchant-session-keys"; 
var integrationKey = "*****" 
var integrationPassword = "*****"; 
var paymentVendor = "YourVendorName"; 
var apiKey = Base64Encode(
    integrationKey + ":" + integrationPassword); //Your method to encode string to Base64 

var request = new SagePayEntity.MerchantSessionKeyRequest { 
    vendorName = paymentVendor }; 
var requestData = new StringContent(
JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json"); 

var handler = new WebRequestHandler(); 
handler.ClientCertificates.Add(new X509Certificate2(
    Server.MapPath("~/Certificate.crt"))); //Your SSL certificate for the domain 
handler.CachePolicy = new HttpRequestCachePolicy(
    HttpRequestCacheLevel.NoCacheNoStore); 

var client = new HttpClient(handler); 
client.DefaultRequestHeaders.Authorization = 
    new AuthenticationHeaderValue("Basic", apiKey); 
client.DefaultRequestHeaders 
    .Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
var response = client.PostAsync(invokeUrl, requestData).Result; 
var result = response.Content.ReadAsStringAsync().Result; 

if (response.StatusCode == HttpStatusCode.Created) 
{ 
    var sageResponse = JsonConvert 
     .DeserializeObject<SagePayEntity.MerchantSessionKeyResponse>(result, 
     new JsonSerializerSettings 
     { 
      MetadataPropertyHandling = MetadataPropertyHandling.Ignore, 
      DateParseHandling = DateParseHandling.None 
     }); 
    return Json(new { SessionKey = sageResponse.MerchantSessionKey, 
     Status = "SUCCESS" }, 
     JsonRequestBehavior.AllowGet); 
} 
else 
{ 
    return Json(new { Status = "FAILURE" }); 
}} 
+0

Nur um es der Grund dafür klar: Ihr 'token' Geheimnis sein * soll *. Nur Ihr Server weiß, was er ist und verwendet ihn für die Server-zu-Server-Authentifizierung. Lass es niemals in die Nähe deines Frontends und erneuere es, wenn du es versehentlich loslässt. Der 'merchantSessionKey' wird auf dem Server mit Ihrem' token' generiert, und das ist ein zeitlich begrenztes öffentliches Token mit einmaliger Verwendung und kann nicht zur Emulation Ihres Kontos verwendet werden. – Jason