Exemplo n.º 1
0
        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");
            }
        }
Exemplo n.º 2
0
        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));
        }
Exemplo n.º 3
0
        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");
            }
        }
Exemplo n.º 4
0
        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");
            }
        }