Example #1
0
        public async Task WhenRetrievingAListOfPaymentsPaymentSubclassesShouldBeInitialized()
        {
            // Given: We create a new payment
            IdealPaymentRequest paymentRequest = new IdealPaymentRequest()
            {
                Amount      = new Amount(Currency.EUR, "100.00"),
                Description = "Description",
                RedirectUrl = DefaultRedirectUrl
            };
            await PaymentClient.CreatePaymentAsync(paymentRequest);

            // When: We retrieve it in a list
            ListResponse <PaymentResponse> result = await PaymentClient.GetPaymentListAsync(null, 5);

            // Then: We expect a list with a single ideal payment
            Assert.IsInstanceOfType(result.Items.First(), typeof(IdealPaymentResponse));
        }
        /// <inheritdoc />
        /// <summary>
        /// Reads the json.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <param name="objectType">Type of the object.</param>
        /// <param name="existingValue">The existing value.</param>
        /// <param name="serializer">The serializer.</param>
        /// <returns></returns>
        /// <exception cref="T:System.ArgumentException"></exception>
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            PaymentRequest target;
            var            token = JToken.Load(reader);

            switch (Enum.Parse(typeof(PaymentMethod), token["payment_method"].Value <string>()))
            {
            case PaymentMethod.iDEAL:
                target = new IdealPaymentRequest();
                break;

            case PaymentMethod.PayPal:
                target = new PayPalPaymentRequest();
                break;

            case PaymentMethod.AfterPay:
                target = new AfterPayPaymentRequest();
                break;

            case PaymentMethod.Creditcard:
                target = new CreditcardPaymentRequest();
                break;

            case PaymentMethod.Bancontact:
                target = new BancontactPaymentRequest();
                break;

            case PaymentMethod.WireTransfer:
                target = new WireTransferPaymentRequest();
                break;

            case PaymentMethod.SOFORT:
                target = new SofortPaymentRequest();
                break;

            case PaymentMethod.DirectDebit:
                target = new DirectDebitPaymentRequest();
                break;

            default:
                throw new ArgumentException();
            }

            serializer.Populate(token.CreateReader(), target);
            return(target);
        }
Example #3
0
        public void IdealPaymentRequest()
        {
            var obj = new IdealPaymentRequest
            {
                Amount   = 86,
                Currency = "Lorum_409",
                Details  = new IdealDetailsRequest
                {
                    CallbackUrl  = "Lorum_403",
                    CancelledUrl = "Lorum_445",
                    Description  = "Lorum_571",
                    ExpiredUrl   = "Lorum_359",
                    FailedUrl    = "Lorum_554",
                    IssuerId     = "Lorum_81",
                    PurchaseId   = "Lorum_102",
                    SuccessUrl   = "Lorum_416"
                },
                DueDate = DateTime.Now
            };
            var deserialized = ConversionTest(obj);

            Assert.IsNotNull(deserialized);
            Assert.AreEqual(obj.Amount, deserialized.Amount);
            Assert.AreEqual(obj.Currency, deserialized.Currency);
            Assert.AreEqual(obj.Details.CallbackUrl, deserialized.Details.CallbackUrl);
            Assert.AreEqual(obj.Details.CancelledUrl, deserialized.Details.CancelledUrl);
            Assert.AreEqual(obj.Details.Description, deserialized.Details.Description);
            Assert.AreEqual(obj.Details.ExpiredUrl, deserialized.Details.ExpiredUrl);
            Assert.AreEqual(obj.Details.FailedUrl, deserialized.Details.FailedUrl);
            Assert.AreEqual(obj.Details.IssuerId, deserialized.Details.IssuerId);
            Assert.AreEqual(obj.Details.PurchaseId, deserialized.Details.PurchaseId);
            Assert.AreEqual(obj.Details.SuccessUrl, deserialized.Details.SuccessUrl);
            // Check only date and time up to seconds.. Json.NET does not save milliseconds.
            Assert.AreEqual(obj.DueDate.HasValue, deserialized.DueDate.HasValue);
            if (obj.DueDate.HasValue && deserialized.DueDate.HasValue)
            {
                Assert.AreEqual(
                    new DateTime(obj.DueDate.Value.Year, obj.DueDate.Value.Month, obj.DueDate.Value.Day, obj.DueDate.Value.Hour, obj.DueDate.Value.Minute, obj.DueDate.Value.Second),
                    new DateTime(deserialized.DueDate.Value.Year, deserialized.DueDate.Value.Month, deserialized.DueDate.Value.Day, deserialized.DueDate.Value.Hour, deserialized.DueDate.Value.Minute, deserialized.DueDate.Value.Second));
            }
        }
Example #4
0
        public async Task <IActionResult> Checkout(string invoiceId, [FromForm] int type)
        {
            using (var context = new OverstagContext())
            {
                var invoice     = context.Invoices.Include(a => a.Payment).Include(b => b.User).FirstOrDefault(f => f.InvoiceID == Uri.UnescapeDataString(invoiceId));
                var paymentType = (PayType)type;

                if (invoice == null)
                {
                    return(View("~/Views/Error/Custom.cshtml", new string[] { "Factuur niet gevonden", "De factuur die u probeert te betalen is niet gevonden. Probeer het opnieuw, en als het niet lukt neem dan contact met ons op" }));
                }

                ViewBag.Amount = invoice.Amount;

                Payment p = new Payment()
                {
                    InvoiceId = invoice.Id,
                    PayType   = paymentType,
                    PlacedAt  = DateTime.Now,
                    UserId    = invoice.UserID
                };

                if (invoice.Payment != null)
                {
                    if (invoice.Payment.IsPaid())
                    {
                        invoice.Paid = true;
                        context.Invoices.Update(invoice);
                        await context.SaveChangesAsync();

                        return(View("~/Views/Error/Custom.cshtml", new string[] { "Factuur is al betaald.", "De factuur die u probeert te betalen is al betaald." }));
                    }

                    if (!invoice.Payment.IsFailed())
                    {
                        p = invoice.Payment;

#if MOLLIE_ENABLED
                        if (!p.IsPaid() && p.PayType == PayType.MOLLIE)
                        {
                            //Get url
                            PaymentClient   pc = new PaymentClient(Core.General.Credentials.mollieApiToken);
                            PaymentResponse ps = await pc.GetPaymentAsync(p.PaymentId);

                            if (ps.Links.Checkout != null) //Still open for payment
                            {
                                ViewBag.PayLink = ps.Links.Checkout.Href;
                            }
                        }
#endif

                        return(View(p));
                    }
                }


                switch (paymentType)
                {
                case PayType.MOLLIE:
                {
                    string cost     = Math.Round((double)invoice.Amount / 100, 2).ToString("F").Replace(",", ".");
                    string redirect = $"{string.Format("{0}://{1}", HttpContext.Request.Scheme, HttpContext.Request.Host)}/Pay/Invoice/{Uri.EscapeDataString(invoice.InvoiceID)}?showPayment=true";
                    string webhook  = $"{string.Format("{0}://{1}", HttpContext.Request.Scheme, HttpContext.Request.Host)}/Pay/Webhook";

                    PaymentClient       pc = new PaymentClient(Core.General.Credentials.mollieApiToken);
                    IdealPaymentRequest pr = new IdealPaymentRequest()
                    {
                        Amount      = new Amount(Currency.EUR, cost),
                        Description = $"Overstag factuur #{invoice.Id}",
                        RedirectUrl = redirect,
                        Locale      = "nl_NL",
                        CustomerId  = invoice.User.MollieID,
                        Metadata    = Uri.EscapeDataString(invoice.InvoiceID),
#if !DEBUG
                        WebhookUrl = webhook
#endif
                    };

#if MOLLIE_ENABLED
                    PaymentResponse ps = await pc.CreatePaymentAsync(pr);

                    ViewBag.PayLink = ps.Links.Checkout.Href;
                    p.PaymentId     = ps.Id;
                    p.Status        = ps.Status;
#endif
                }
                break;

                case PayType.BANK:
                    //Create payment request via bank or tikkie
                    p.Status = PaymentStatus.Open;
                    break;

                default:
                    return(View("~/Views/Error/Custom.cshtml", new string[] { "Betaalmethode niet ondersteund", "De betaalmethode die u heeft gekozen wordt niet ondersteund." }));
                }

                context.Payments.Add(p);
                await context.SaveChangesAsync();

                return(View(context.Payments.Include(x => x.Invoice).First(f => f.Invoice.InvoiceID == invoice.InvoiceID)));
            }
        }
Example #5
0
        public override string RedirectForPayment(OrderData orderData)
        {
            try
            {
                var appliedtotal = orderData.PurchaseInfo.GetXmlPropertyDouble("genxml/appliedtotal");
                var alreadypaid  = orderData.PurchaseInfo.GetXmlPropertyDouble("genxml/alreadypaid");

                var info = ProviderUtils.GetProviderSettings();

                string cartDesc  = info.GetXmlProperty("genxml/textbox/cartdescription");
                var    ApiKey    = info.GetXmlProperty("genxml/textbox/key");
                var    idealOnly = true; // default to previous behaviour
                if (info.XMLDoc.SelectSingleNode("genxml/checkbox/idealonly") != null)
                {
                    // take the value from the settings, if it exists
                    idealOnly = info.GetXmlPropertyBool("genxml/checkbox/idealonly");
                }
                var notifyUrl = Utils.ToAbsoluteUrl("/DesktopModules/NBright/OS_Mollie/notify.ashx");
                var returnUrl = Globals.NavigateURL(StoreSettings.Current.PaymentTabId, "");

                //orderid/itemid
                var ItemId = orderData.PurchaseInfo.ItemID.ToString("");

                var productOrderNumber = orderData.OrderNumber;

                ////var nbi = new NBrightInfo();
                //nbi.XMLData = orderData.payselectionXml;
                //var paymentMethod = nbi.GetXmlProperty("genxml/textbox/paymentmethod");
                //var paymentBank = nbi.GetXmlProperty("genxml/textbox/paymentbank");
                //var apiKey = liveApiKey;

                string      specifier;
                CultureInfo culture;
                specifier = "F";
                culture   = CultureInfo.CreateSpecificCulture("en-US");
                var totalString       = decimal.Parse((appliedtotal - alreadypaid).ToString("0.00"));
                var totalPrijsString2 = totalString.ToString(specifier, culture).Replace('€', ' ').Trim();

                PaymentResponse result = null;
                if (idealOnly)
                {
                    IPaymentClient      paymentClient       = new PaymentClient(ApiKey);
                    IdealPaymentRequest paymentRequestIdeal = new IdealPaymentRequest()
                    {
                        Amount      = new Amount(Currency.EUR, totalPrijsString2),
                        Description = "Bestelling ID: " + " " + productOrderNumber + " " + cartDesc,
                        RedirectUrl = returnUrl + "/orderid/" + ItemId,
                        WebhookUrl  = notifyUrl + "?orderid=" + ItemId,
                        Locale      = Locale.nl_NL,
                        Method      = PaymentMethod.Ideal
                    };

                    var task = Task.Run(async() => (IdealPaymentResponse)await paymentClient.CreatePaymentAsync(paymentRequestIdeal));
                    task.Wait();
                    result = task.Result;
                }
                else
                {
                    IPaymentClient paymentClient  = new PaymentClient(ApiKey);
                    PaymentRequest paymentRequest = new PaymentRequest()
                    {
                        Amount      = new Amount(Currency.EUR, totalPrijsString2),
                        Description = "Bestelling ID: " + " " + productOrderNumber + " " + cartDesc,
                        RedirectUrl = returnUrl + "/orderid/" + ItemId,
                        WebhookUrl  = notifyUrl + "?orderid=" + ItemId,
                        Locale      = Locale.nl_NL,
                    };

                    var task = Task.Run(async() => await paymentClient.CreatePaymentAsync(paymentRequest));
                    task.Wait();
                    result = task.Result;
                }

                orderData.PaymentPassKey = result.Id;
                orderData.OrderStatus    = "020";
                orderData.PurchaseInfo.SetXmlProperty("genxml/paymenterror", "");
                orderData.PurchaseInfo.SetXmlProperty("genxml/posturl", result.Links.Checkout.Href);
                orderData.PurchaseInfo.Lang = Utils.GetCurrentCulture();
                orderData.SavePurchaseData();

                try
                {
                    System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
                    // objEventLog.AddLog("Betaling aangemaakt: ", "ID: " + result.Id + " Bedrag:" + result.Amount.Currency + " ItemId: " + ItemId, PortalSettings, -1, EventLogController.EventLogType.ADMIN_ALERT);

                    HttpContext.Current.Response.Clear();
                    //redirect naar Mollie
                    HttpContext.Current.Response.Redirect(result.Links.Checkout.Href);
                }
                catch (Exception ex)
                {
                    // rollback transaction
                    orderData.PurchaseInfo.SetXmlProperty("genxml/paymenterror", "<div>ERROR: Invalid payment data </div><div>" + ex + "</div>");
                    orderData.PaymentFail("010");
                    //objEventLog.AddLog("Betaling aanmaken mislukt: ", "ID: " + result.Id + " Bedrag:" + result.Amount.Currency + " ItemId: " + ItemId, PortalSettings, -1, EventLogController.EventLogType.ADMIN_ALERT);

                    var param = new string[3];
                    param[0] = "orderid=" + orderData.PurchaseInfo.ItemID.ToString("");
                    param[1] = "status=0";
                    return(Globals.NavigateURL(StoreSettings.Current.PaymentTabId, "", param));
                }
                try
                {
                    HttpContext.Current.Response.End();
                }
                catch (Exception ex)
                {
                    // this try/catch to avoid sending error 'ThreadAbortException'
                }

                return("");
            }
            catch (Exception ex)
            {
                //objEventLog.AddLog("Foutje", "Dus:" + ex.Message + " " + ex.InnerException , PortalSettings, -1, EventLogController.EventLogType.ADMIN_ALERT);
                return(ex.InnerException.ToString());
            }
        }