/// <summary> /// /// </summary> /// <param name="authCode"></param> /// <param name="tradeCode"></param> /// <returns></returns> public string GenerateH5SignedParams(string authCode, string tradeCode) { authCode.AssertNotNull("openId"); tradeCode.AssertNotNull("tradeCode"); var tradeJournal = TradeJournal.FindById(tradeCode); if (null == tradeJournal || tradeJournal.TradeStatus != TradeStatus.WaitingPayment) { return(null); } var authInfo = this.LoadAuthorizationInfo(tradeJournal.PayRoute, authCode); if (null == authInfo && string.IsNullOrEmpty(authInfo.OpenId)) { return(null); } PaymentEngine.EnableTestTotalFee(tradeJournal); var orderParams = UnifiedOrder(tradeJournal, authInfo.OpenId); if (null == orderParams) { return(null); } var payParams = BuildPayParamsWithH5(tradeJournal, orderParams["prepay_id"]); return(payParams.ToJson()); }
public async Task <List <TransactionAPIModel> > GetTransactions(Guid merchantId) { using (PaymentEngine paymentEngine = new PaymentEngine()) { return(await paymentEngine.GetTransactions(merchantId)); } }
public async Task <ResponseAPIModel> ProcessPayment([FromBody] ProcessPaymentAPIModel processPaymentModel) { using (PaymentEngine paymentEngine = new PaymentEngine()) { return(await paymentEngine.ProcessPayment(processPaymentModel)); } }
public void Process() { string googleOrderNum = N1.googleordernumber; Order order = OrderDataSource.LoadForGoogleOrderNumber(googleOrderNum); if (order == null) { Logger.Warn("Unknown Google Order Number Risk Information. GoogleOrderNumber=" + googleOrderNum); } else { Payment payment = AcHelper.GetGCPayment(order, GatewayInstance, true); //IF THE PAYMENT IS A GIFT CERTIFICATE WE SHOULD ADD THIS TX FOR INFO ONLY int gcPayMethodId = PaymentEngine.GetGiftCertificatePaymentMethod().PaymentMethodId; bool isGiftCert = (payment.PaymentMethodId == gcPayMethodId); Transaction trans = GetGCAuthorizationTransaction(payment.Transactions, N1.googleordernumber); trans.AVSResultCode = N1.riskinformation.avsresponse; trans.RemoteIP = N1.riskinformation.ipaddress; if (!isGiftCert) { trans.Amount = payment.Amount; trans.TransactionType = TransactionType.Authorize; } else { trans.Amount = 0; trans.TransactionType = TransactionType.AuthorizeCapture; } trans.TransactionDate = N1.timestamp; trans.PaymentGatewayId = GatewayInstance.PaymentGatewayId; trans.ProviderTransactionId = googleOrderNum; bool protection = N1.riskinformation.eligibleforprotection; string cvn = N1.riskinformation.cvnresponse; int age = N1.riskinformation.buyeraccountage; trans.CVVResultCode = cvn; StringBuilder responseMessage = new StringBuilder(); if (protection) { responseMessage.Append("Eligible for protection."); } else { responseMessage.Append("NOT eligible for protection."); } responseMessage.Append(" Buyer account is " + age + " days old."); trans.ResponseMessage = responseMessage.ToString(); trans.AuthorizationCode = googleOrderNum; //trans.AuthorizationCode = (protection ? 1 : 0).ToString() + "|" + cvn + "|" + age; payment.Transactions.Add(trans); //do not update payment status. //It will be updated when order state change notification is received payment.Save(); } }
public void Process() { string googleOrderNum = N1.googleordernumber; Order order = OrderDataSource.LoadForGoogleOrderNumber(googleOrderNum); if (order == null) { Logger.Warn("Unknown Google Order Number Charged. GoogleOrderNumber=" + googleOrderNum + ". Amount=" + N1.latestchargeamount.Value); } else { Payment payment = AcHelper.GetGCPayment(order, GatewayInstance, true); Transaction trans = payment.Transactions.LastCapturePending; if (trans == null) { trans = new Transaction(); } else { //remove the transaction from collection for correct calculations payment.Transactions.Remove(trans); } trans.TransactionStatus = TransactionStatus.Successful; //trans.TransactionDate = N1.timestamp; trans.Amount = N1.latestchargeamount.Value; trans.PaymentGatewayId = GatewayInstance.PaymentGatewayId; trans.ProviderTransactionId = googleOrderNum; LSDecimal totalAuth = payment.Transactions.GetTotalAuthorized(); LSDecimal totalCapt = payment.Transactions.GetTotalCaptured(); LSDecimal remainCapt = totalAuth - totalCapt; trans.TransactionType = TransactionType.PartialCapture; if (remainCapt > trans.Amount) { trans.TransactionType = TransactionType.PartialCapture; } else { trans.TransactionType = TransactionType.Capture; } if (payment.PaymentStatus == PaymentStatus.CapturePending) { PaymentEngine.ProcessCapturePending(payment, trans); } else { PaymentEngine.ForceTransaction(payment, trans); } } }
public void Process() { // Google has successfully refunded the customer's credit card. string googleOrderNum = N1.googleordernumber; Order order = OrderDataSource.LoadForGoogleOrderNumber(googleOrderNum); if (order == null) { Logger.Warn("Unknown Google Order Number Refunded. GoogleOrderNumber=" + googleOrderNum + ". Amount=" + N1.latestrefundamount.Value); } else { Payment payment = AcHelper.GetGCPayment(order, GatewayInstance, true); Transaction trans = payment.Transactions.LastRefundPending; if (trans == null) { trans = new Transaction(); } else { //remove the transaction from collection for correct calculations payment.Transactions.Remove(trans); } trans.TransactionStatus = TransactionStatus.Successful; trans.PaymentGatewayId = GatewayInstance.PaymentGatewayId; //LSDecimal totalRefunded = payment.Transactions.GetTotalRefunded(); //trans.Amount = N1.totalrefundamount.Value - totalRefunded; trans.Amount = N1.latestrefundamount.Value; trans.ProviderTransactionId = N1.googleordernumber; LSDecimal totalCharged = payment.Transactions.GetTotalCaptured(); if (totalCharged > trans.Amount) { trans.TransactionType = TransactionType.PartialRefund; } else { trans.TransactionType = TransactionType.Refund; } if (payment.PaymentStatus == PaymentStatus.RefundPending) { PaymentEngine.ProcessRefundPending(payment, trans); } else { PaymentEngine.ForceTransaction(payment, trans); } } }
/// <summary> /// Captures this payment /// </summary> /// <param name="amount">The amount to capture</param> /// <param name="final">If <b>true</b> this capture is considered to be the final capture</param> /// <param name="async">If <b>true</b> payment is captured asynchronously</param> /// <param name="remoteIP">Remote IP of the user initiating the request</param> public virtual void Capture(LSDecimal amount, bool final, bool async, string remoteIP) { CaptureTransactionRequest request = new CaptureTransactionRequest(this, remoteIP); request.Amount = amount; request.IsFinal = final; if (!async) { PaymentEngine.DoCapture(request); } else { PaymentEngine.AsyncDoCapture(request); } }
public static Payment GetGCPayment(Order order, GoogleCheckout instance, bool createNew) { int GCPayMethodId = AcHelper.GetGCPaymentMethodId(instance); foreach (Payment pmnt in order.Payments) { if (pmnt.PaymentMethodId == GCPayMethodId) { return(pmnt); } } //IF THERE IS ONE PAYMENT //AND IT IS A GIFT CERTIFICATE //AND IT COVERS THE BALANCE OF THE ORDER //THEN THIS IS THE GOOGLE PAYMENT if (order.Payments.Count == 1) { int gcPayMethodId = PaymentEngine.GetGiftCertificatePaymentMethod().PaymentMethodId; Payment payment = order.Payments[0]; if (payment.PaymentMethodId == gcPayMethodId) { if (payment.Amount == order.TotalCharges) { return(payment); } } } if (createNew) { Payment payment = new Payment(); payment.PaymentMethodId = GCPayMethodId; payment.Amount = order.GetBalance(false); payment.OrderId = order.OrderId; payment.PaymentMethodName = "GoogleCheckout"; payment.PaymentStatus = PaymentStatus.Unprocessed; order.Payments.Add(payment); //payment.Save(); order.Save(); return(payment); } else { return(null); } }
/// <summary> /// Authorizes this payment /// </summary> /// <param name="async">If <b>true</b> payment is authorized asynchronously</param> /// <param name="remoteIP">Remote IP of the user initiating the request</param> public virtual void Authorize(bool async, string remoteIP) { if (SubscriptionId == 0) { AuthorizeTransactionRequest request = new AuthorizeTransactionRequest(this, remoteIP); if (!async) { PaymentEngine.DoAuthorize(request); } else { PaymentEngine.AsyncDoAuthorize(request); } } else { AuthorizeRecurringTransactionRequest request = new AuthorizeRecurringTransactionRequest(this, this.Subscription.SubscriptionPlan, remoteIP); PaymentEngine.DoAuthorizeRecurring(request); } }
protected void SubmitRefundButton_Click(object sender, EventArgs e) { //GET THE REFUND AMOUNT string originalRefundAmount = string.Format("{0:F2}", _Payment.Amount); decimal refundAmount = AlwaysConvert.ToDecimal(RefundAmount.Text); // AC8-2854, AC8-3117: IF amount is not changed by merchant then // to avoid rounding issues, restore the original amount upto 4 decimal digits if (originalRefundAmount == RefundAmount.Text) { refundAmount = _Payment.Amount; } if (refundAmount > 0 && _Payment.PaymentStatus == PaymentStatus.Captured) { RefundTransactionRequest refundRequest = new RefundTransactionRequest(_Payment, Request.UserHostAddress); if (CreditCardFields.Visible) { SetRequestForCreditCard(refundRequest); } else if (CheckFields.Visible) { SetRequestForCheck(refundRequest); } refundRequest.Amount = refundAmount; PaymentEngine.DoRefund(refundRequest); //_Payment.Refund(refundRequest); if (!string.IsNullOrEmpty(CustomerNote.Text)) { OrderNote note = new OrderNote(_Order.Id, AbleContext.Current.UserId, DateTime.UtcNow, CustomerNote.Text, NoteType.Public); note.Save(); } } Response.Redirect("Default.aspx?OrderNumber=" + _Order.OrderNumber.ToString()); }
/// <summary> /// Voids this payment /// </summary> /// <param name="remoteIP">Remote IP of the user initiating the request</param> public virtual void Void(string remoteIP) { VoidTransactionRequest request = new VoidTransactionRequest(this, remoteIP); PaymentEngine.DoVoid(request); }
/// <summary> /// Refunds this payment /// </summary> /// <param name="remoteIp">Remote IP of the user initiating the request</param> public virtual void Refund(string remoteIp) { RefundTransactionRequest request = new RefundTransactionRequest(this, remoteIp); PaymentEngine.DoRefund(request); }
public void Process() { string googleOrderNum = N1.googleordernumber; Order order = OrderDataSource.LoadForGoogleOrderNumber(googleOrderNum); if (order == null) { Logger.Warn("Unknown Google Order Number Order State Changed. GoogleOrderNumber=" + googleOrderNum); } else { //update financial order payment status Payment payment = AcHelper.GetGCPayment(order, GatewayInstance, true); switch (N1.newfinancialorderstate) { case FinancialOrderState.CHARGEABLE: //authorized payment.PaymentStatusReason = N1.reason; if (payment.PaymentStatus == PaymentStatus.AuthorizationPending) { PaymentEngine.ProcessAuthorizePending(payment, GatewayInstance.PaymentGatewayId, true); } break; case FinancialOrderState.CHARGING: //capture pending break; case FinancialOrderState.CANCELLED: case FinancialOrderState.CANCELLED_BY_GOOGLE: //cancel the order //if the order has been paid order cancellation will be preceeded by a refund notification //so that aspect will be handled in refund handler //TODO: Do we need to force void the remaining payments? //payment.PaymentStatusReason = N1.reason; //PaymentEngine.ForceVoid(payment, GatewayInstance.PaymentGatewayId, true); if (order.OrderStatus.IsValid) { if (!string.IsNullOrEmpty(N1.reason)) { OrderNote on = new OrderNote(); on.Comment = "Order Cancelled : " + N1.reason; on.OrderId = order.OrderId; order.Notes.Add(on); } order.Cancel(); } break; case FinancialOrderState.CHARGED: //charge the payment //we will handle this in charge amount notification handler only //otherwise it can result in double charge transactions /*payment.PaymentStatusReason = N1.reason; * if (payment.PaymentStatus == PaymentStatus.CapturePending) * { * PaymentEngine.ProcessCapturePending(payment, GatewayInstance.PaymentGatewayId, true); * }*/ break; case FinancialOrderState.PAYMENT_DECLINED: //payment declined payment.PaymentStatusReason = N1.reason; if (payment.PaymentStatus == PaymentStatus.CapturePending) { PaymentEngine.ProcessCapturePending(payment, GatewayInstance.PaymentGatewayId, false); } else if (payment.PaymentStatus == PaymentStatus.AuthorizationPending) { PaymentEngine.ProcessAuthorizePending(payment, GatewayInstance.PaymentGatewayId, false); } else { PaymentEngine.ForceCapture(payment, GatewayInstance.PaymentGatewayId, false); } break; case FinancialOrderState.REVIEWING: //No AC equivalent default: break; } //TODO : order statuses are custom defined in AC //update order shipment status switch (N1.newfulfillmentorderstate) { case FulfillmentOrderState.NEW: //do nothing break; case FulfillmentOrderState.DELIVERED: //order has been shipped foreach (OrderShipment os in order.Shipments) { if (!os.IsShipped) { os.Ship(false); } } break; case FulfillmentOrderState.PROCESSING: //no equivalent in AC break; case FulfillmentOrderState.WILL_NOT_DELIVER: //this may happen if order is cancelled //order cancelled event will take care of this break; default: break; } } }
public void Process() { TraceContext trace = WebTrace.GetTraceContext(); string traceKey = "GoogleCheckout.AC.NewOrderHandler"; trace.Write(traceKey, "Begin NewOrderHandler.Process, Google order number " + N1.googleordernumber); Order order = OrderDataSource.LoadForGoogleOrderNumber(N1.googleordernumber); if (order == null) // ordernumber not already entered { trace.Write(traceKey, "Google order not present in database, get basket"); Basket basket = AcHelper.GetAcBasket(N1.shoppingcart, true); if (basket == null) { trace.Write(traceKey, "Basket could not be obtained (End NewOrderHandler.Process)"); return; } //basket is ready. check if there are any order adjustments to be made trace.Write(traceKey, "Check for order adjustments"); OrderAdjustment orderAdj = N1.orderadjustment; if (orderAdj != null) { trace.Write(traceKey, "Order adjustments present, add to basket"); OrderAdjustmentHelper.DoOrderAdjustments(orderAdj, basket); } trace.Write(traceKey, "set billing address"); Users.Address primaryAddress = basket.User.PrimaryAddress; AcHelper.PopulateAcAddress(primaryAddress, N1.buyerbillingaddress); trace.Write(traceKey, "set shipping address"); Users.Address shipAddr = AcHelper.GetAcAddress(basket.User, N1.buyershippingaddress); basket.User.Addresses.Add(shipAddr); basket.User.Save(); trace.Write(traceKey, "package the basket"); basket.Package(false); if (basket.Shipments.Count > 0) { //there are shippable items / shipments //set shipment address and shipment method trace.Write(traceKey, "shippable items present, get shipping method"); ShipMethod shipMethod = AcHelper.GetShipMethod(basket); trace.Write(traceKey, "ship method is " + shipMethod.Name + " (ID" + shipMethod.ShipMethodId.ToString() + ")"); foreach (BasketShipment shipment in basket.Shipments) { shipment.AddressId = shipAddr.AddressId; shipment.ShipMethodId = shipMethod.ShipMethodId; shipment.Save(); } //have to link the shipping charges with some shipment. //we can't know which shipment. Just link to the first. trace.Write(traceKey, "assign shipping charges to first shipment"); BasketShipment basketShipment = basket.Shipments[0]; foreach (BasketItem item in basket.Items) { if (item.OrderItemType == OrderItemType.Shipping) { item.BasketShipmentId = basketShipment.BasketShipmentId; //update the sku and shipping method name so that scrubbed name is not used item.Name = shipMethod.Name; item.Sku = string.Empty; } } } trace.Write(traceKey, "save basket"); basket.Save(); //now checkout the order with null payment. //this will alow payment to be processed later trace.Write(traceKey, "submit basket checkout"); CheckoutRequest acCheckout = new CheckoutRequest(null); CheckoutResponse acResp = basket.Checkout(acCheckout); if (acResp.Success) { trace.Write(traceKey, "checkout was successful, update the google order number for AC order number " + acResp.OrderNumber.ToString()); order = OrderDataSource.Load(acResp.OrderId, false); if (order != null) { //update email address associated with order order.BillToEmail = N1.buyerbillingaddress.email; order.GoogleOrderNumber = N1.googleordernumber; bool isPaidByGc = false; //IF THERE IS ONE PAYMENT AND IT IS A GIFT CERTIFICATE //AND IT COVERS THE BALANCE OF THE ORDER THEN THIS IS THE GOOGLE PAYMENT if (order.Payments.Count == 1) { int gcPayMethodId = PaymentEngine.GetGiftCertificatePaymentMethod().PaymentMethodId; Payment payment = order.Payments[0]; if (payment.PaymentMethodId == gcPayMethodId) { if (payment.Amount == order.TotalCharges) { isPaidByGc = true; } } } if (!isPaidByGc) { //We need to create a new payment with status of authorization pending Payment payment = new Payment(); payment.PaymentMethodId = AcHelper.GetGCPaymentMethodId(this.GatewayInstance); payment.Amount = order.GetBalance(false); payment.OrderId = order.OrderId; payment.PaymentMethodName = "GoogleCheckout"; Transaction trans = new Transaction(); trans.TransactionType = TransactionType.Authorize; trans.TransactionStatus = TransactionStatus.Pending; trans.Amount = payment.Amount; trans.PaymentGatewayId = this.GatewayInstance.PaymentGatewayId; trans.ProviderTransactionId = N1.googleordernumber; trans.TransactionDate = N1.timestamp; payment.Transactions.Add(trans); payment.PaymentStatus = PaymentStatus.AuthorizationPending; order.Payments.Add(payment); } order.Save(); } else { OrderDataSource.UpdateGoogleOrderNumber(acResp.OrderId, N1.googleordernumber); } } else { trace.Write(traceKey, "checkout failed for google order"); CommerceBuilder.Utility.Logger.Warn("GoogleCheckout : New Order Checkout Failed."); } trace.Write(traceKey, "Send AC order number back to Google"); AcNotifier.AddMerchantOrderNumber(GatewayInstance, N1.googleordernumber, acResp.OrderNumber.ToString()); } else { //order number already entered. Just send notification trace.Write(traceKey, "Google order in database, send AC order number back to Google"); AcNotifier.AddMerchantOrderNumber(GatewayInstance, N1.googleordernumber, order.OrderNumber.ToString()); } trace.Write(traceKey, "End NewOrderHandler.Process"); }
/// <summary> /// /// </summary> public static void Initialize() { PaymentEngine.RegisterType <IPaymentHandler, OpenEnterpriseServiceHandler>("Handler"); }