protected override void BuildBody(StringBuilder page, PaymentRequest paymentRequest) { var paymentMethod = paymentRequest.PaymentMethod; string clientSecret = paymentMethod.DynamicProperty <string>().ClientSecret; string clientId = paymentMethod.DynamicProperty <string>().ClientId; string callBackUrl = paymentMethod.DynamicProperty <string>().CallbackUrl; string cancelUrl = paymentMethod.DynamicProperty <string>().CancelUrl; string paymentOptions = paymentMethod.DynamicProperty <string>().PaymentOptions; bool autoCapture = paymentMethod.DynamicProperty <bool>().AutoCapture; // Creating product order items var orderItems = BuildOrderItemsList(paymentRequest); try { // Getting server token var serverToken = GetSchibstedUtil(paymentMethod).GetServerToken(clientId, clientSecret); // Trying to create a paylink var paylink = GetPaylink(serverToken, orderItems, paymentRequest.Payment); // Saving paylink url in session paymentRequest.Payment["paylinkUrl"] = paylink.Data.ShortUrl; paymentRequest.Payment.Save(); // Redirecting to paylink url if (Debug) { // Show debug information var clientReference = Sha256Computer.ComputeHash( paymentRequest.Payment.ReferenceId + orderItems.Count(x => x.Type == 100) + paymentRequest.Payment.Amount, clientSecret, true); page.Append("<b>oauth_token:</b> " + serverToken.AccessToken + "<br />"); page.Append("<b>title:</b> " + paymentRequest.Payment.ReferenceId + "<br />"); page.Append("<b>purchaseFlow:</b> " + (autoCapture ? "DIRECT" : "AUTHORIZE") + "<br />"); page.Append("<b>paymentOptions:</b> " + paymentOptions + "<br />"); page.Append("<b>redirectUri:</b> " + _callbackUrl.GetCallbackUrl(callBackUrl, paymentRequest.Payment) + "<br />"); page.Append("<b>cancelUri:</b> " + _absoluteUrlService.GetAbsoluteUrl(cancelUrl) + "<br />"); page.Append("<b>clientReference:</b> " + clientReference + "<br />"); page.Append("<b>items (json):</b><br />"); page.Append("<code>"); page.Append(GetSchibstedUtil(paymentMethod).GetJsonStringFromOrderItems(orderItems)); page.Append("</code><br /><br />"); page.Append("<a href=\"" + paylink.Data.ShortUrl + "\">Proceed to payment</a>"); } else { HttpContext.Current.Response.Redirect(paylink.Data.ShortUrl); } } catch (WebException ex) { // Something happened, log api error message LogWebException(ex); throw new Exception("API Error, see log for details"); } }
private SppContainer <PayLinkData> GetPaylink(OAuthToken serverToken, IEnumerable <OrderItem> orderItems, Payment payment) { var paymentMethod = payment.PaymentMethod; string clientSecret = paymentMethod.DynamicProperty <string>().ClientSecret; string callBackUrl = paymentMethod.DynamicProperty <string>().CallbackUrl; string cancelUrl = paymentMethod.DynamicProperty <string>().CancelUrl; string title = paymentMethod.DynamicProperty <string>().Title; string paymentOptions = paymentMethod.DynamicProperty <string>().PaymentOptions; bool autoCapture = paymentMethod.DynamicProperty <bool>().AutoCapture; var items = orderItems.ToList(); var clientReference = Sha256Computer.ComputeHash(payment.ReferenceId + items.Count(x => x.Type == 100) + payment.Amount, clientSecret, true); var itemsJson = GetSchibstedUtil(paymentMethod).GetJsonStringFromOrderItems(items); var postValues = new Dictionary <string, string> { { "oauth_token", serverToken.AccessToken }, { "title", title }, { "purchaseFlow", autoCapture ? "DIRECT" : "AUTHORIZE" }, { "paymentOptions", paymentOptions }, { "redirectUri", _callbackUrl.GetCallbackUrl(callBackUrl, payment) }, { "cancelUri", _absoluteUrlService.GetAbsoluteUrl(cancelUrl) }, { "clientReference", clientReference }, { "items", HttpUtility.UrlEncode(itemsJson) } }; var schibstedUtil = GetSchibstedUtil(payment.PaymentMethod); return(schibstedUtil.SchibstedApiPost <PayLinkData>("/paylink", postValues)); }
public override void ProcessCallback(Payment payment) { var paymentMethod = payment.PaymentMethod; string clientSecret = paymentMethod.DynamicProperty <string>().ClientSecret; string clientId = paymentMethod.DynamicProperty <string>().ClientId; var schibstedOrderId = HttpContext.Current.Request["order_id"]; var schibstedUtil = GetSchibstedUtil(payment.PaymentMethod); var serverToken = schibstedUtil.GetServerToken(clientId, clientSecret); var isStatusCallback = !string.IsNullOrEmpty(payment["isStatusCallback"]) && payment["isStatusCallback"] == "true"; if (isStatusCallback) { schibstedOrderId = payment.TransactionId; } try { // Preparing for callback validation var orderCheck = Sha256Computer.ComputeHash( payment.ReferenceId + payment.PurchaseOrder.OrderLines.Count + payment.Amount, clientSecret, true); // Get the status object for the order, for the validation var orderStatus = schibstedUtil.SchibstedApiGet <Order>("/order/" + schibstedOrderId + "/status", serverToken.AccessToken); if (isStatusCallback) { ProcessStatusCallback(orderCheck, payment, orderStatus); } else { ProcessOrderPayment(schibstedOrderId, orderCheck, payment, orderStatus); } } catch (WebException ex) { LogWebException(ex); throw new Exception("API Error, see log for details"); } }
public override void ProcessCallback(Payment payment) { var paymentMethod = payment.PaymentMethod; string clientSecret = paymentMethod.DynamicProperty <string>().ClientSecret; string clientId = paymentMethod.DynamicProperty <string>().ClientId; string cancelUrl = paymentMethod.DynamicProperty <string>().CancelUrl; string acceptUrl = paymentMethod.DynamicProperty <string>().AcceptUrl; var schibstedOrderId = HttpContext.Current.Request["order_id"]; ServerToken = SchibstedUtil.GetServerToken(clientId, clientSecret); UserToken = SchibstedUtil.GetUserToken(clientId, clientSecret, HttpContext.Current.Request["code"]); try { // Preparing for callback validation var orderCheck = Sha256Computer.ComputeHash( payment.ReferenceId + payment.PurchaseOrder.OrderLines.Count + payment.Amount, clientSecret, true); // Get the status object for the order, for the validation var orderStatus = SchibstedUtil.SchibstedApiGet <Order>("/order/" + schibstedOrderId + "/status", ServerToken.AccessToken); // Set initial payment status payment.PaymentStatus = PaymentStatus.Get((int)PaymentStatusCode.Declined); payment.TransactionId = schibstedOrderId; // Compare the checksum, and set payment status if (orderCheck != orderStatus.Data.ClientReference) { throw new SecurityException("Checksum mismatch"); } payment.PaymentStatus = SchibstedUtil.GetPaymentStatusFromOrderStatus(orderStatus.Data.Status); Uri redirectUrl; if (payment.PaymentStatus != PaymentStatus.Get((int)PaymentStatusCode.Declined)) { ProcessPaymentRequest(new PaymentRequest(payment.PurchaseOrder, payment)); // Changing order status to completed, if necessary if (payment.PaymentStatus == PaymentStatus.Get((int)PaymentStatusCode.Acquired)) { new OrderService().ChangeOrderStatus( payment.PurchaseOrder, OrderStatus.Get((int)OrderStatusCode.CompletedOrder)); } // Setting up subscription CreateSchibstedSubscription(Convert.ToInt32(UserToken.UserId), Convert.ToInt32(payment["schibstedProductId"])); // Redirecting to the cancel page redirectUrl = new Uri(_absoluteUrlService.GetAbsoluteUrl(acceptUrl)); } else { // Redirecting to the cancel page redirectUrl = new Uri(_absoluteUrlService.GetAbsoluteUrl(cancelUrl)); } redirectUrl = redirectUrl.AddOrderGuidParameter(payment.PurchaseOrder) .AddQueryStringParameter("order_id", schibstedOrderId); HttpContext.Current.Response.Redirect(redirectUrl.AbsoluteUri); } catch (WebException ex) { LogWebException(ex); throw new Exception("API Error, see log for details"); } }