//------------------------------------------------------------------------------------------- public IGatewayResponse Bill(WeavverEntityContainer data, Sales_Orders order, Logistics_Addresses primaryAddress, Logistics_Addresses billingAddress) { string memo = "WEB PURCHASE"; // Add the credit to the ledger. Accounting_LedgerItems item = new Accounting_LedgerItems(); item.Id = Guid.NewGuid(); item.OrganizationId = OrganizationId; if (order.Orderee.HasValue) item.AccountId = order.Orderee.Value; else item.AccountId = order.Id; item.LedgerType = LedgerType.Receivable.ToString(); item.TransactionId = order.Id; item.PostAt = DateTime.UtcNow; item.Code = CodeType.Payment.ToString(); item.Memo = "Payment from Card " + Number.Substring(Number.Length - 4); item.Amount = Math.Abs(order.Total.Value); // order.BillingContactEmail // Submit to Authorize.Net var request = new AuthorizationRequest(Number, ExpirationMonth.ToString("D2") + ExpirationYear.ToString("D2"), order.Total.Value, memo, true); request.AddCustomer("", order.PrimaryContactNameFirst, order.PrimaryContactNameLast, primaryAddress.Line1, primaryAddress.State, primaryAddress.ZipCode); request.AddMerchantValue("OrderId", order.Id.ToString()); request.AddMerchantValue("CreatedBy", order.CreatedBy.ToString()); request.AddMerchantValue("LedgerItemId", item.Id.ToString()); request.AddShipping("", order.BillingContactNameFirst, order.BillingContactNameLast, billingAddress.Line1, billingAddress.State, billingAddress.ZipCode); var gate = new Gateway(ConfigurationManager.AppSettings["authorize.net_loginid"], ConfigurationManager.AppSettings["authorize.net_transactionkey"], (ConfigurationManager.AppSettings["authorize.net_testmode"] == "true")); var response = gate.Send(request, memo); item.ExternalId = response.TransactionID; if (!response.Approved) { //item.Voided = true; //item.VoidedBy = Guid.Empty; item.Memo += "\r\nPayment failed: Code " + response.ResponseCode + ", " + response.Message; } data.Accounting_LedgerItems.Add(item); return response; }
//------------------------------------------------------------------------------------------- /// <summary> /// Payment processing IVR /// </summary> /// <param name="context"></param> public void Run(AppContext context) { WeavverEntityContainer data = new WeavverEntityContainer(); Logistics_Organizations org = null; var session = context.Session; try { session.Answer(); Start: // Welcome to the account payment system. session.Execute("Playback", @"receivepayment\WelcomeToTheAccountPaymentSystem.wav"); // Figure out the caller's balance decimal Balance = 0.0m; bool hasBalance = Decimal.TryParse(session.GetVariable("Balance"), out Balance); if (!hasBalance) { string OrganizationId = session.GetVariable("OrganizationId"); if (String.IsNullOrEmpty(OrganizationId)) { LogIn: string UserCode = GetVariable(ref session, "UserCode", "number iterated", null); string PassCode = GetVariable(ref session, "PassCode", "number iterated", null); var user = (from x in data.System_Users where x.UserCode == UserCode && x.PassCode == PassCode select x).FirstOrDefault(); if (user != null) { OrganizationId = user.OrganizationId.ToString(); } else if (session.getState() == "CS_EXECUTE") { session.Execute("Playback", @"receivepayment\AccountNotFound.wav"); goto LogIn; } else { session.SetVariable("PaymentStatus", "Failed"); session.SetVariable("ResponseCode", "0"); session.SetVariable("Message", "User did not log-in."); return; } } Guid orgGuid = new Guid(OrganizationId); org = (from orgs in data.Logistics_Organizations where orgs.OrganizationId == orgGuid select orgs).FirstOrDefault(); Balance = org.ReceivableBalance.Value; } // Play: Your account balance is: session.Execute("Playback", @"receivepayment\YourAccountBalanceIs.wav"); session.Execute("Say", "en currency pronounced masculine " + Balance); decimal PaymentAmount = Balance; bool customPayment = false; if (Balance == 0m) { string balanceIsEvenOption = PlayAndGet(ref session, 1, 1, @"YourBalanceIs0", null); if (balanceIsEvenOption == "1") { customPayment = true; } else { session.SetVariable("PaymentStatus", "Failed"); session.SetVariable("ResponseCode", "0"); session.SetVariable("Message", "User has no balance to pay."); return; } } else { // Press 1 to pay your balance in full or 2 to enter another amount. string entered = PlayAndGet(ref session, 1, 1, "Press1Or2", "^[1-2]$"); if (entered.Trim() == "2") { customPayment = true; } } if (customPayment) { string enteredAmount = GetVariable(ref session, "PaymentAmount", "currency pronounced", null); Decimal.TryParse(enteredAmount, out PaymentAmount); } string CardNumber = GetVariable(ref session, "CardNumber", "number iterated", "^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13})$"); string CardExpiration = GetVariable(ref session, "CardExpiration", "number iterated", "^[0-9][0-9][0-9][0-9]$"); // MMDD string CardCode = GetVariable(ref session, "CardCode", "number iterated", "^[0-9][0-9][0-9][0-9]|[0-9][0-9][0-9]$"); // 1234|123 // Process Card session.Execute("Playback", @"receivepayment\ProcessingPayment.wav"); var request = new AuthorizationRequest(CardNumber, CardExpiration, PaymentAmount, "Phone Payment", true); //request.AddCustomer("", org.BillingAddressFK.Name, order.PrimaryContactNameLast, primaryAddress.Line1, primaryAddress.State, primaryAddress.ZipCode); string referenceId = session.GetVariable("ReferenceId"); if (!String.IsNullOrEmpty(referenceId)) { request.AddMerchantValue("ReferenceId", referenceId); } if (org != null) { request.AddMerchantValue("OrganizationId", org.Id.ToString()); } var gate = new Gateway(ConfigurationManager.AppSettings["authorize.net_loginid"], ConfigurationManager.AppSettings["authorize.net_transactionkey"], // we use the reverse negative of testmode for safety in case the setting is missing from the app.config (ConfigurationManager.AppSettings["authorize.net_testmode"] != "false") ); var response = gate.Send(request, "Phone Payment"); if (response.Approved) { session.SetVariable("PaymentStatus", "Success"); session.SetVariable("PaymentAmount", PaymentAmount.ToString()); session.SetVariable("TransactionId", response.TransactionID); session.Execute("Playback", @"receivepayment\PaymentSuccessYourTransactionCodeIs.wav"); session.Execute("Say", "en name_spelled iterated masculine " + response.TransactionID); } else { session.SetVariable("PaymentStatus", "Failed"); session.SetVariable("PaymentAmount", "0"); session.SetVariable("ResponseCode", response.ResponseCode); session.SetVariable("Message", response.Message); if (PlayAndGet(ref session, 1, 1, "PaymentFailure", null) == "1") { session.Execute("Playback", @"receivepayment\ThankYou.wav"); if (session.getState() == "CS_EXECUTE") goto Start; else return; } } } catch (Exception ex) { Debug(ref session, ex.Message); session.SetVariable("PaymentStatus", "Failed"); session.SetVariable("Message", ex.Message); WriteToLog("SystemError: " + ex.ToString()); session.Execute("Playback", @"receivepayment\SystemError.wav"); } }