예제 #1
0
        //-------------------------------------------------------------------------------------------
        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;
        }
예제 #2
0
        //-------------------------------------------------------------------------------------------
        /// <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");
               }
        }