protected PublicOrder PrepareOrder(PublicOrderContext publicOrderContext, PaymentDataHandler paymentHandler) { var newOrder = new PublicOrder() { OrderItems = new PublicOrderItem[0], CustomData = new PublicOrderCustomData[0] }; foreach (var handler in orderDataHandlers) { newOrder = handler.AmendOrder(newOrder, publicOrderContext); if (newOrder == null) { throw new InvalidOperationException("OrderDataHandler must return a non-null order from AmendOrder."); } } newOrder.PaymentMethod = paymentHandler.PaymentMethodType; // Only run the selected payment handler. newOrder = paymentHandler.AmendOrder(newOrder, publicOrderContext.PaymentData); if (newOrder == null) { throw new InvalidOperationException("PaymentDataHandler must return a non-null order from AmendOrder."); } return newOrder; }
/// <summary> /// Create PublicPaymentTransaction and call MakePayment in Atomia Billing Public Service. /// </summary> /// <param name="publicOrderContext">Order data</param> /// <param name="order">The order object returned from CreateOrder call in Atomia Billing Public Service</param> /// <param name="paymentHandler">Handler for customer's selected payment method</param> /// <returns>URL to redirect to for finishing or seeing result of payment transaction.</returns> public string CreatePaymentTransaction(PublicOrderContext publicOrderContext, PublicOrder order, PaymentDataHandler paymentHandler) { var paymentTransaction = new PublicPaymentTransaction { GuiPluginName = paymentHandler.Id, Attributes = new AttributeData[0], CurrencyCode = order.Currency, TransactionReference = order.Number, Amount = order.Total }; paymentTransaction = paymentHandler.AmendPaymentTransaction(paymentTransaction, publicOrderContext.PaymentData); if (paymentTransaction == null) { throw new InvalidOperationException("PaymentDataHandler must return a non-null payment transaction from AmendTransaction."); } foreach (var handler in transactionDataHandlers) { paymentTransaction = handler.AmendPaymentTransaction(paymentTransaction, publicOrderContext); if (paymentTransaction == null) { throw new InvalidOperationException("ExtraTransactionDataHandlers must return a non-null payment transaction from AmendTransaction."); } } PublicPaymentTransaction createdTransaction; try { createdTransaction = BillingApi.MakePayment(paymentTransaction); } catch (SoapException ex) { logger.LogException(ex, "MakePayment failed."); return urlProvider.FailureUrl; } if (createdTransaction.Status.ToUpper() == "IN_PROGRESS" && !string.IsNullOrEmpty(createdTransaction.RedirectUrl)) { return createdTransaction.RedirectUrl; } else if (createdTransaction.Status.ToUpper() == "OK") { return urlProvider.SuccessUrl; } else if (createdTransaction.Status.ToUpper() == "FRAUD_DETECTED" || createdTransaction.Status.ToUpper() == "FAILED") { return urlProvider.FailureUrl; } else { return createdTransaction.ReturnUrl; } }
/// <summary> /// Create PublicOrder and call CreateOrder in Atomia Billing Public Service. /// </summary> /// <param name="publicOrderContext">Order data</param> /// <param name="paymentHandler">Handler for customer's selected payment method</param> /// <returns>The order object returned from Atomia Billing Public Service</returns> public override PublicOrder CreateOrder(PublicOrderContext publicOrderContext, PaymentDataHandler paymentHandler) { var newOrder = PrepareOrder(publicOrderContext, paymentHandler); var createdOrder = BillingApi.CreateOrder(newOrder); if (createdOrder == null) { throw new InvalidOperationException("Order could not be created."); } if (this.auditLogger != null) { this.auditLogger.Log(AuditActionTypes.OrderCreated, string.Empty, createdOrder.CustomerId.ToString(), createdOrder.Email, createdOrder.Id.ToString(), null); } return createdOrder; }
public abstract PublicOrder CreateOrder(PublicOrderContext publicOrderContext, PaymentDataHandler paymentHandler);
public override PublicOrder CreateOrder(PublicOrderContext publicOrderContext, PaymentDataHandler paymentHandler) { var newOrder = this.PrepareOrder(publicOrderContext, paymentHandler); this.AddCustomAttributes(newOrder); string token = string.Empty; var resellerRootDomain = this.GetResellerRootDomain(); var createdOrder = BillingApi.CreateOrderWithLoginToken(newOrder, resellerRootDomain, out token); if (createdOrder == null) { throw new InvalidOperationException("Order could not be created."); } urlProvider.SuccessUrl = GetTokenLoginUrl(createdOrder.Email, token); return createdOrder; }