public ActionResult CreateSveaPayment(Order order, List<OrderRow> orderRows, Domain domain, KeyStringList tt, string paymentType) { // Get webshop settings KeyStringList webshopSettings = WebshopSetting.GetAllFromCache(); // Get the language Language language = Language.GetOneById(domain.front_end_language); // Create the payment configuration SveaSettings sveaConfiguration = new SveaSettings(); // Create the order builder Webpay.Integration.CSharp.Order.Create.CreateOrderBuilder orderBuilder = Webpay.Integration.CSharp.WebpayConnection.CreateOrder(sveaConfiguration); // Add order rows for (int i = 0; i < orderRows.Count; i++) { // Get the unit Unit unit = Unit.GetOneById(orderRows[i].unit_id, domain.front_end_language); unit = unit != null ? unit : new Unit(); // Create an order item Webpay.Integration.CSharp.Order.Row.OrderRowBuilder orderItem = new Webpay.Integration.CSharp.Order.Row.OrderRowBuilder(); orderItem.SetArticleNumber(orderRows[i].product_code); orderItem.SetName(orderRows[i].product_name); orderItem.SetQuantity(orderRows[i].quantity); orderItem.SetUnit(unit.unit_code); orderItem.SetAmountExVat(orderRows[i].unit_price); orderItem.SetVatPercent(orderRows[i].vat_percent * 100); // Add the order item orderBuilder.AddOrderRow(orderItem); } // Add the gift cards amount if (order.gift_cards_amount > 0) { Webpay.Integration.CSharp.Order.Row.OrderRowBuilder orderItem = new Webpay.Integration.CSharp.Order.Row.OrderRowBuilder(); orderItem.SetArticleNumber("gc"); orderItem.SetName(tt.Get("gift_cards")); orderItem.SetQuantity(1); orderItem.SetUnit(""); orderItem.SetAmountExVat(order.gift_cards_amount * -1); orderItem.SetVatPercent(0); // Add the order item orderBuilder.AddOrderRow(orderItem); } // Add the customer if(order.customer_type == 0) // Company { // Set values for the customer Webpay.Integration.CSharp.Order.Identity.CompanyCustomer company = new Webpay.Integration.CSharp.Order.Identity.CompanyCustomer(); company.SetNationalIdNumber(order.customer_org_number); company.SetVatNumber(order.customer_vat_number); company.SetCompanyName(order.invoice_name); company.SetEmail(order.customer_email); company.SetPhoneNumber(order.customer_phone); company.SetIpAddress(Tools.GetUserIP()); // Get addresses //Webpay.Integration.CSharp.WebpayWS.GetCustomerAddressesResponse response = Webpay.Integration.CSharp.WebpayConnection.GetAddresses(sveaConfiguration) //.SetCountryCode(SveaSettings.GetSveaCountryCode(order.country_code)).SetCompany(order.customer_org_number).SetZipCode(order.invoice_post_code).SetOrderTypeInvoice().DoRequest(); // Add customer details orderBuilder.AddCustomerDetails(company); } else if(order.customer_type == 1) // Person { // Set values for the customer Webpay.Integration.CSharp.Order.Identity.IndividualCustomer person = new Webpay.Integration.CSharp.Order.Identity.IndividualCustomer(); person.SetNationalIdNumber(order.customer_org_number); person.SetEmail(order.customer_email); person.SetPhoneNumber(order.customer_phone); person.SetIpAddress(Request.UserHostAddress); // Get addresses //Webpay.Integration.CSharp.WebpayWS.GetCustomerAddressesResponse response = Webpay.Integration.CSharp.WebpayConnection.GetAddresses(sveaConfiguration) //.SetCountryCode(SveaSettings.GetSveaCountryCode(order.country_code)).SetIndividual(order.customer_org_number).SetZipCode(order.invoice_post_code).SetOrderTypeInvoice().DoRequest(); // Add customer details orderBuilder.AddCustomerDetails(person); } // Get the test variable string testOrderString = ""; if (webshopSettings.Get("SVEA-TEST").ToLower() == "true") { testOrderString = ":" + Tools.GeneratePassword(); } // Set order values orderBuilder.SetCountryCode(SveaSettings.GetSveaCountryCode(order.country_code)); orderBuilder.SetOrderDate(order.order_date); orderBuilder.SetClientOrderNumber(order.id.ToString() + testOrderString); orderBuilder.SetCurrency(SveaSettings.GetSveaCurrency(order.currency_code)); // Create the payment if(paymentType == "INVOICE") // Invoice { // Create the invoice payment Webpay.Integration.CSharp.WebpayWS.CreateOrderEuResponse orderResponse = orderBuilder.UseInvoicePayment().DoRequest(); // Check if the order is accepted if(orderResponse.Accepted == true) { // Update the order with the payment token Order.SetPaymentToken(order.id, orderResponse.CreateOrderResult.SveaOrderId.ToString()); // Update the payment status Order.UpdatePaymentStatus(order.id, "payment_status_invoice_approved"); // Add customer files CustomerFile.AddCustomerFiles(order); } else { // Update the payment status Order.UpdatePaymentStatus(order.id, "payment_status_invoice_not_approved"); } } else if(paymentType == "CREDITCARD") { // Add the rounding if(order.rounding_sum != 0) { Webpay.Integration.CSharp.Order.Row.OrderRowBuilder orderItem = new Webpay.Integration.CSharp.Order.Row.OrderRowBuilder(); orderItem.SetArticleNumber("rd"); orderItem.SetName(tt.Get("rounding")); orderItem.SetQuantity(1); orderItem.SetUnit(""); orderItem.SetAmountExVat(order.rounding_sum); orderItem.SetVatPercent(0); // Add the order item orderBuilder.AddOrderRow(orderItem); } // Set the payment option Webpay.Integration.CSharp.Hosted.Payment.PaymentMethodPayment payment = orderBuilder.UsePaymentMethod(Webpay.Integration.CSharp.Util.Constant.PaymentMethod.KORTCERT); payment.SetReturnUrl(domain.web_address + "/order/svea_confirmation/" + order.id.ToString()); payment.SetCancelUrl(domain.web_address + "/order/confirmation/" + order.id.ToString()); payment.SetPayPageLanguageCode(SveaSettings.GetSveaLanguageCode(language.language_code)); // Get the payment form Webpay.Integration.CSharp.Hosted.Helper.PaymentForm paymentForm = payment.GetPaymentForm(); ViewBag.PaymentForm = paymentForm.GetCompleteForm(); // Return the svea webpay view return View("svea_webpay"); } // Redirect the user to the order confirmation page return RedirectToAction("confirmation", "order", new { id = order.id }); } // End of the CreateSveaPayment method
} // End of the UpdatePaymentStatus method /// <summary> /// Respond to an updated order status /// </summary> /// <param name="order"></param> /// <param name="paymentOption"></param> /// <param name="orderStatus"></param> /// <returns></returns> private string UpdateOrderStatus(Order order, PaymentOption paymentOption, string orderStatus) { // Create the string to return string error_message = ""; // Get the current domain Domain domain = Tools.GetCurrentDomain(); // Get webshop settings KeyStringList webshopSettings = WebshopSetting.GetAllFromCache(); // Check the order status if (orderStatus == "order_status_delivered") { if(paymentOption.connection == 102) // Payson invoice { // Get credentials string paysonEmail = webshopSettings.Get("PAYSON-EMAIL"); string userId = webshopSettings.Get("PAYSON-AGENT-ID"); string md5Key = webshopSettings.Get("PAYSON-MD5-KEY"); bool paysonTest = false; bool.TryParse(webshopSettings.Get("PAYSON-TEST"), out paysonTest); // Create the api PaysonIntegration.PaysonApi paysonApi = new PaysonIntegration.PaysonApi(userId, md5Key, null, paysonTest); // Update the order PaysonIntegration.Data.PaymentUpdateData paymentUpdateData = new PaysonIntegration.Data.PaymentUpdateData(order.payment_token, PaysonIntegration.Utils.PaymentUpdateAction.ShipOrder); PaysonIntegration.Response.PaymentUpdateResponse paymentUpdateResponse = paysonApi.MakePaymentUpdateRequest(paymentUpdateData); // Check if the response is successful if (paymentUpdateResponse != null && paymentUpdateResponse.Success == false) { // Set error messages foreach (string key in paymentUpdateResponse.ErrorMessages) { error_message += "• " + "Payson: " + paymentUpdateResponse.ErrorMessages[key] + "<br/>"; } } } else if(paymentOption.connection == 301) // Svea invoice { // Get the order rows List<OrderRow> orderRows = OrderRow.GetByOrderId(order.id); // Create the payment configuration SveaSettings sveaConfiguration = new SveaSettings(); // Create the order builder Webpay.Integration.CSharp.Order.Handle.DeliverOrderBuilder inoviceBuilder = Webpay.Integration.CSharp.WebpayConnection.DeliverOrder(sveaConfiguration); // Add order rows for (int i = 0; i < orderRows.Count; i++) { // Get the unit Unit unit = Unit.GetOneById(orderRows[i].unit_id, domain.back_end_language); // Create an order item Webpay.Integration.CSharp.Order.Row.OrderRowBuilder orderItem = new Webpay.Integration.CSharp.Order.Row.OrderRowBuilder(); orderItem.SetArticleNumber(orderRows[i].product_code); orderItem.SetName(orderRows[i].product_name); orderItem.SetQuantity(orderRows[i].quantity); orderItem.SetUnit(unit.unit_code); orderItem.SetAmountExVat(orderRows[i].unit_price); orderItem.SetVatPercent(orderRows[i].vat_percent * 100); // Add the order item inoviceBuilder.AddOrderRow(orderItem); } // Get the order id Int64 sveaOrderId = 0; Int64.TryParse(order.payment_token, out sveaOrderId); // Set invoice values inoviceBuilder.SetOrderId(sveaOrderId); inoviceBuilder.SetNumberOfCreditDays(15); inoviceBuilder.SetInvoiceDistributionType(Webpay.Integration.CSharp.Util.Constant.InvoiceDistributionType.POST); inoviceBuilder.SetCountryCode(SveaSettings.GetSveaCountryCode(order.country_code)); // Make the request to send the invoice Webpay.Integration.CSharp.WebpayWS.DeliverOrderEuResponse deliverOrderResponse = inoviceBuilder.DeliverInvoiceOrder().DoRequest(); // Check if the response is successful if (deliverOrderResponse.Accepted == false) { // Set error messages error_message += "• " + "Svea code: " + deliverOrderResponse.ResultCode.ToString() + "<br/>"; error_message += "• " + "Svea message: " + deliverOrderResponse.ErrorMessage + "<br/>"; } } else if (paymentOption.connection >= 400 && paymentOption.connection <= 499) // Payex { // Check the transaction Dictionary<string, string> payexResponse = PayExManager.CheckTransaction(order, webshopSettings); // Get response variables string error_code = payexResponse.ContainsKey("error_code") == true ? payexResponse["error_code"] : ""; string description = payexResponse.ContainsKey("description") == true ? payexResponse["description"] : ""; string parameter_name = payexResponse.ContainsKey("parameter_name") == true ? payexResponse["parameter_name"] : ""; string transaction_status = payexResponse.ContainsKey("transaction_status") == true ? payexResponse["transaction_status"] : ""; string transaction_number = payexResponse.ContainsKey("transaction_number") == true ? payexResponse["transaction_number"] : ""; // Check if the response was successful if (error_code.ToUpper() == "OK") { if(transaction_status == "3") // Authorize { // Capture the transaction payexResponse = PayExManager.CaptureTransaction(order); // Get response variables error_code = payexResponse.ContainsKey("error_code") == true ? payexResponse["error_code"] : ""; description = payexResponse.ContainsKey("description") == true ? payexResponse["description"] : ""; parameter_name = payexResponse.ContainsKey("parameter_name") == true ? payexResponse["parameter_name"] : ""; transaction_status = payexResponse.ContainsKey("transaction_status") == true ? payexResponse["transaction_status"] : ""; transaction_number = payexResponse.ContainsKey("transaction_number") == true ? payexResponse["transaction_number"] : ""; string transaction_number_original = payexResponse.ContainsKey("transaction_number_original") == true ? payexResponse["transaction_number_original"] : ""; if(error_code.ToUpper() != "OK" || transaction_status != "6") { // Set error messages error_message += "• " + "Payex code: " + error_code + "<br/>"; error_message += "• " + "Payex message: " + description + "<br/>"; error_message += "• " + "Payex parameter: " + parameter_name + "<br/>"; error_message += "• " + "Payex status: " + transaction_status + "<br/>"; error_message += "• " + "Payex number (original): " + transaction_number + "<br/>"; } else { // Update the transaction number for the order Order.SetPaymentToken(order.id, transaction_number); } } } else { // Set error messages error_message += "• " + "Payex code: " + error_code + "<br/>"; error_message += "• " + "Payex message: " + description + "<br/>"; error_message += "• " + "Payex parameter: " + parameter_name + "<br/>"; error_message += "• " + "Payex status: " + transaction_status + "<br/>"; error_message += "• " + "Payex number: " + transaction_number + "<br/>"; } } } else if (orderStatus == "order_status_cancelled") { if(paymentOption.connection >= 100 && paymentOption.connection <= 199) // Payson { // Get credentials string paysonEmail = webshopSettings.Get("PAYSON-EMAIL"); string userId = webshopSettings.Get("PAYSON-AGENT-ID"); string md5Key = webshopSettings.Get("PAYSON-MD5-KEY"); bool paysonTest = false; bool.TryParse(webshopSettings.Get("PAYSON-TEST"), out paysonTest); // Create the api PaysonIntegration.PaysonApi paysonApi = new PaysonIntegration.PaysonApi(userId, md5Key, null, paysonTest); // Get details about the payment status PaysonIntegration.Response.PaymentDetailsResponse paysonResponse = paysonApi.MakePaymentDetailsRequest(new PaysonIntegration.Data.PaymentDetailsData(order.payment_token)); // Get the type and status of the payment PaysonIntegration.Utils.PaymentType? paymentType = paysonResponse.PaymentDetails.PaymentType; PaysonIntegration.Utils.PaymentStatus? paymentStatus = paysonResponse.PaymentDetails.PaymentStatus; PaysonIntegration.Utils.InvoiceStatus? invoiceStatus = paysonResponse.PaymentDetails.InvoiceStatus; // Payment update PaysonIntegration.Data.PaymentUpdateData paymentUpdateData = null; PaysonIntegration.Response.PaymentUpdateResponse paymentUpdateResponse = null; if (paymentType == PaysonIntegration.Utils.PaymentType.Direct && paymentStatus == PaysonIntegration.Utils.PaymentStatus.Completed) { // Refund the payment paymentUpdateData = new PaysonIntegration.Data.PaymentUpdateData(order.payment_token, PaysonIntegration.Utils.PaymentUpdateAction.Refund); paymentUpdateResponse = paysonApi.MakePaymentUpdateRequest(paymentUpdateData); } else if (paymentType == PaysonIntegration.Utils.PaymentType.Invoice && invoiceStatus == PaysonIntegration.Utils.InvoiceStatus.OrderCreated) { // Cancel the order paymentUpdateData = new PaysonIntegration.Data.PaymentUpdateData(order.payment_token, PaysonIntegration.Utils.PaymentUpdateAction.CancelOrder); paymentUpdateResponse = paysonApi.MakePaymentUpdateRequest(paymentUpdateData); } else if (paymentType == PaysonIntegration.Utils.PaymentType.Invoice && (invoiceStatus == PaysonIntegration.Utils.InvoiceStatus.Shipped || invoiceStatus == PaysonIntegration.Utils.InvoiceStatus.Done)) { // Credit the order paymentUpdateData = new PaysonIntegration.Data.PaymentUpdateData(order.payment_token, PaysonIntegration.Utils.PaymentUpdateAction.CreditOrder); paymentUpdateResponse = paysonApi.MakePaymentUpdateRequest(paymentUpdateData); } // Check if there was any errors if (paymentUpdateResponse != null && paymentUpdateResponse.Success == false) { // Set error messages foreach (string key in paymentUpdateResponse.ErrorMessages) { error_message += "• " + "Payson: " + paymentUpdateResponse.ErrorMessages[key] + "<br/>"; } } } else if(paymentOption.connection == 201) // PayPal { // Get credentials string paypalClientId = webshopSettings.Get("PAYPAL-CLIENT-ID"); string paypalClientSecret = webshopSettings.Get("PAYPAL-CLIENT-SECRET"); string paypalMode = webshopSettings.Get("PAYPAL-MODE"); Dictionary<string, string> config = new Dictionary<string, string> { { "mode", paypalMode } }; try { // Create the credential token PayPal.OAuthTokenCredential tokenCredential = new PayPal.OAuthTokenCredential(paypalClientId, paypalClientSecret, config); // Create the api context PayPal.APIContext paypalContext = new PayPal.APIContext(tokenCredential.GetAccessToken()); paypalContext.Config = config; // Look up the sale PayPal.Api.Payments.Sale sale = PayPal.Api.Payments.Sale.Get(paypalContext, order.payment_token); if (sale.state == "completed") { // Refund the payment paypalContext.HTTPHeaders = null; PayPal.Api.Payments.Refund refund = sale.Refund(paypalContext, new PayPal.Api.Payments.Refund()); if(refund.state != "completed") { error_message += "• " + "PayPal: " + refund.state; } } else { error_message += "• " + "PayPal: " + sale.state; } } catch (Exception ex) { error_message += "• PayPal: " + ex.Message; } } else if(paymentOption.connection == 301) // Svea invoice { // Create the payment configuration SveaSettings sveaConfiguration = new SveaSettings(); // Get the order id Int64 sveaOrderId = 0; Int64.TryParse(order.payment_token, out sveaOrderId); // Cancel the order Webpay.Integration.CSharp.Order.Handle.CloseOrderBuilder closeOrder = Webpay.Integration.CSharp.WebpayConnection.CloseOrder(sveaConfiguration); closeOrder.SetOrderId(sveaOrderId); closeOrder.SetCountryCode(SveaSettings.GetSveaCountryCode(order.country_code)); Webpay.Integration.CSharp.WebpayWS.CloseOrderEuResponse closeOrderResponse = closeOrder.CloseInvoiceOrder().DoRequest(); // Check if the response is successful if (closeOrderResponse.Accepted == false) { // Set error messages error_message += "• " + "Svea code: " + closeOrderResponse.ResultCode.ToString() + "<br/>"; error_message += "• " + "Svea message: " + closeOrderResponse.ErrorMessage + "<br/>"; } } else if(paymentOption.connection >= 400 && paymentOption.connection <= 499) // Payex { // Check the transaction Dictionary<string, string> payexResponse = PayExManager.CheckTransaction(order, webshopSettings); // Get response variables string error_code = payexResponse.ContainsKey("error_code") == true ? payexResponse["error_code"] : ""; string description = payexResponse.ContainsKey("description") == true ? payexResponse["description"] : ""; string parameter_name = payexResponse.ContainsKey("parameter_name") == true ? payexResponse["parameter_name"] : ""; string transaction_status = payexResponse.ContainsKey("transaction_status") == true ? payexResponse["transaction_status"] : ""; string transaction_number = payexResponse.ContainsKey("transaction_number") == true ? payexResponse["transaction_number"] : ""; // Check if the response was successful if(error_code.ToUpper() == "OK") { // Check if we should cancel or credit the order if(transaction_status == "3") // Authorize { // Cancel the transaction payexResponse = PayExManager.CancelTransaction(order, webshopSettings); // Get response variables error_code = payexResponse.ContainsKey("error_code") == true ? payexResponse["error_code"] : ""; description = payexResponse.ContainsKey("description") == true ? payexResponse["description"] : ""; parameter_name = payexResponse.ContainsKey("parameter_name") == true ? payexResponse["parameter_name"] : ""; transaction_status = payexResponse.ContainsKey("transaction_status") == true ? payexResponse["transaction_status"] : ""; transaction_number = payexResponse.ContainsKey("transaction_number") == true ? payexResponse["transaction_number"] : ""; if(error_code.ToUpper() != "OK" || transaction_status != "4") { // Set error messages error_message += "• " + "Payex code: " + error_code + "<br/>"; error_message += "• " + "Payex message: " + description + "<br/>"; error_message += "• " + "Payex parameter: " + parameter_name + "<br/>"; error_message += "• " + "Payex status: " + transaction_status + "<br/>"; error_message += "• " + "Payex number: " + transaction_number + "<br/>"; } } else if(transaction_status == "0" || transaction_status == "6") // Sale or capture { // Get the order rows List<OrderRow> orderRows = OrderRow.GetByOrderId(order.id); // Credit the transaction payexResponse = PayExManager.CreditTransaction(order, orderRows, webshopSettings); // Get response variables error_code = payexResponse.ContainsKey("error_code") == true ? payexResponse["error_code"] : ""; description = payexResponse.ContainsKey("description") == true ? payexResponse["description"] : ""; parameter_name = payexResponse.ContainsKey("parameter_name") == true ? payexResponse["parameter_name"] : ""; transaction_status = payexResponse.ContainsKey("transaction_status") == true ? payexResponse["transaction_status"] : ""; transaction_number = payexResponse.ContainsKey("transaction_number") == true ? payexResponse["transaction_number"] : ""; if (error_code.ToUpper() != "OK" || transaction_status != "2") { // Set error messages error_message += "• " + "Payex code: " + error_code + "<br/>"; error_message += "• " + "Payex message: " + description + "<br/>"; error_message += "• " + "Payex parameter: " + parameter_name + "<br/>"; error_message += "• " + "Payex status: " + transaction_status + "<br/>"; error_message += "• " + "Payex number: " + transaction_number + "<br/>"; } } } else { // Set error messages error_message += "• " + "Payex code: " + error_code + "<br/>"; error_message += "• " + "Payex message: " + description + "<br/>"; error_message += "• " + "Payex parameter: " + parameter_name + "<br/>"; error_message += "• " + "Payex status: " + transaction_status + "<br/>"; error_message += "• " + "Payex number: " + transaction_number + "<br/>"; } } } // Return the error message return error_message; } // End of the UpdateOrderStatus method