2017-09-06 15 views
0

우리는 일부 JQuery 코드 내에서 AJAX 호출을 사용하여 SagePay API와 통합하려고합니다. 이 특정 API는 아래의 예와 같이 JSON 응답을 제공합니다SagePay 판매자 세션 키 - AJAX

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

, 우리는 성공적으로 API에 대해 인증 할 수있는 아래의 코드를 사용하여,하지만 다음 메시지에 대한 Access-Control-Allow-Origin 밖으로 던져.

XMLHttpRequest는 https://pi-test.sagepay.com/api/v1/merchant-session-keys을로드 할 수 없습니다. 프리 플라이트 요청에 대한 응답이 액세스 제어 검사를 통과하지 못했습니다. No Access-Control-Allow-Origin 헤더가 요청 된 자원에 있습니다. 따라서 원점 null은 액세스 할 수 없습니다.

이전에이 문제를 접한 사람이 있습니까?

답변

0

jquery ajax를 직접 사용하여 SagePay에 POST 요청을 보내지 마십시오. 대신 서버에 아약스 요청을해야만 SagePay에 데이터가 게시됩니다. PHP 예제는 여기에서 얻을 수 있습니다 : SagePay drop-in Checkout

아래에서 C# 코드를 확인하십시오.

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

그냥 그 이유는 명확하게하기 위해 : 당신의'token'이 비밀 * 있어야하는데 *. 서버 만이 서버인지 서버인지를 확인하는 데 사용됩니다. * 프론트 엔드 근처에 놓아 두거나 실수로 놓아 버리면 갱신하지 마십시오. 'merchantSessionKey'는'token'을 사용하여 서버 상에 생성됩니다. 이것은 일회용 제한된 평생 공용 토큰이며, 계정을 에뮬레이션하는데 사용될 수 없습니다. – Jason