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" });
}}
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