public void Set_Users_Charge_Info_Should_Set_Billing_Related_Info_in_Db() { //This is Assert valid user with NO billing info var user = new AspNetUser() { Email = "*****@*****.**", MyShopifyDomain = "test3.myshopify.com", UserName = "******", Id = Guid.NewGuid().ToString(), ShopifyAccessToken = "validtoken", BillingOn = null, PlanId = null, ShopifyChargeId = null }; service.Add(user); var ret = UserDbServiceHelper.SetUsersChargeInfo(service, user.Id, 2, 2, DateTime.Now); Assert.True(ret); var data = service.FindSingleWhere(x => x.Id == user.Id); Assert.NotNull(data.BillingOn); Assert.Equal(2, data.ShopifyChargeId); Assert.Equal(2, data.PlanId); }
public virtual async Task <IActionResult> ChargeResult(string shop, long charge_id) { using (Logger.BeginScope(new { Shop = shop, ChargeId = charge_id })) { try { Logger.LogInformation("Getting current user."); var user = await UserDbServiceHelper.GetAppUserByIdAsync(UserDbService, UserInContextHelper.GetCurrentUserId(HttpContext)); Logger.LogInformation($"Found user. Id is '{user.Id}'"); //to detect if its an upgrade we need users previous plan id, 0 means no previous plan. Logger.LogInformation($"Getting previous plan info, if any."); var previousPlan = user.GetPlanId(); Logger.LogInformation($"Previous plan ID is set to '{previousPlan}'."); PlanAppModel newPlan = null; ShopifyRecurringChargeObject charge = null; try { Logger.LogInformation($"Retriving recurring charge info (before activation). Access token '{user.ShopifyAccessToken}' and charge id '{charge_id}'."); charge = await ShopifyAPI.GetRecurringChargeAsync(user.MyShopifyDomain, user.ShopifyAccessToken, charge_id); Logger.LogInformation($"Successfully retrived recurring charge info (before activation).Id is '{charge.Id}'.Associated plan name '{charge.Name}' and price '{charge.Price}'."); } catch (Exception ex) { Logger.LogError(ex, "Error retriving recurring charge info (before activation)."); WebMsg.AddTempDanger(this, "Could not retrive charge status by charge id via shopify api (before activation)."); return(RedirectToAction(SHOPIFY_ACTIONS.ChoosePlan.ToString(), Settings.GetShopifyControllerName())); } newPlan = PlanReader[charge.Name]; if (newPlan != null) { Logger.LogInformation($"New plan ID is set to '{newPlan.Id}'."); Logger.LogInformation($"Recurring charge status (before activation) is '{charge.Status}'."); if (charge.Status == "accepted") { //Lets activate the charge try { Logger.LogInformation("Trying to activate the recurring charge."); await ShopifyAPI.ActivateRecurringChargeAsync(user.MyShopifyDomain, user.ShopifyAccessToken, charge_id); Logger.LogInformation("Recurring charge activationon is done."); } catch (Exception ex) { Logger.LogError(ex, $"Recurring charge activation failed.Redirecting to '{SHOPIFY_ACTIONS.ChoosePlan.ToString()}' action."); WebMsg.AddTempDanger(this, "Could not activate the recurring charge via shopify api.Please try again."); return(RedirectToAction(SHOPIFY_ACTIONS.ChoosePlan.ToString(), Settings.GetShopifyControllerName())); } //Lets check if we were sucessful activating the charge try { Logger.LogInformation("Checking recurring charge status after activation."); charge = await ShopifyAPI.GetRecurringChargeAsync(user.MyShopifyDomain, user.ShopifyAccessToken, charge_id); } catch (Exception ex) { Logger.LogError(ex, "Error getting recurring charge status after activation."); WebMsg.AddTempDanger(this, "Could not retrieve charge status by id via shopify api (after activation). Please try again or contact support"); return(RedirectToAction(SHOPIFY_ACTIONS.ChoosePlan.ToString(), Settings.GetShopifyControllerName())); } Logger.LogInformation($"Recurring Charge Status after activation is '{charge.Status}'."); //if we were succesful if (charge.Status == "active") { Logger.LogInformation($"Saving user payment information. User id '{user.Id}', charge id '{charge_id}' , plan id '{newPlan.Id}' and billing on '{charge.BillingOn}'."); var updateResult = UserDbServiceHelper.SetUsersChargeInfo(UserDbService, user.Id, charge_id, newPlan.Id, charge.BillingOn); if (!updateResult) { Logger.LogCritical($"Could not save user payment information.Redirecting to '{SHOPIFY_ACTIONS.ChoosePlan.ToString()}' action."); await Emailer.UserPaymentInfoCouldNotBeSavedAsync(user, charge_id, charge.Name); //this.LogCoreException(new CoreException(CoreErrorType.APP_COULD_NOT_SAVE_CHARGE_INFO, errMessage + $".Activated Charge Id {charge.Id}", user, shop)); WebMsg.AddTempDanger(this, "Could not save your payment confirmation in our db.Please try again."); return(RedirectToAction(SHOPIFY_ACTIONS.ChoosePlan.ToString(), Settings.GetShopifyControllerName())); } else { Logger.LogInformation("Succesfully saved user payment information."); Logger.LogInformation("Refreshing user cache data now."); user = await UserCache.GetLoggedOnUser(true); Logger.LogInformation("Now detecting installation type."); if (previousPlan > 0 && previousPlan != newPlan.Id)//its an upgrade { Logger.LogInformation("Installation was an upgrade type for existing store. Redirecting to RedirectAfterSuccessfulUpgrade()."); await UserChangedPlan(user, newPlan.Id); //handle upgrade event return(RedirectAfterSuccessfulUpgrade(charge.Name)); //now redirect } else//new installation { Logger.LogInformation("Installation was for a new store."); Logger.LogInformation("Now handling post installation tasks by calling DoPostInstallationTasks()."); await DoPostInstallationTasks(user);//handle new installation event Logger.LogInformation("Done handling post installation tasks. "); await SendEmailsOnSuccessfullInstallation(user);//send emails Logger.LogInformation($"Now processing all webhooks defined in the appsettings.json by calling ProcessWebHooksCreation()."); await ProcessWebhooks(user); Logger.LogInformation("Done processing webhooks defined in appsettings.json."); Logger.LogInformation("Now redirecting after successfull sign in."); return(RedirectAfterSuccessfullLogin());//now redirect } } } else /*if status is not active*/ { Logger.LogCritical($"SHopify could not activate the recurring charge. Redirecting to '{SHOPIFY_ACTIONS.ChoosePlan.ToString()}' action."); WebMsg.AddTempDanger(this, "Shopify did not activate the recurring payment this app requested. Please try again by choosing a plan."); return(RedirectToAction(SHOPIFY_ACTIONS.ChoosePlan.ToString(), Settings.GetShopifyControllerName())); } } else if (charge.Status == "declined") { Logger.LogCritical("Recurring charge was declined (before activation).Probably user declined payment."); Logger.LogInformation("Calling UserCancelledPayment() event."); await UserCancelledPayment(user, newPlan.Id); Logger.LogInformation("Done handling UserCancelledPayment() event."); if (user.GetPlanId() <= 0) { Logger.LogWarning("Redirecting to RedirectAfterNewUserCancelledPayment() as payment cancelled."); return(RedirectAfterNewUserCancelledPayment(user)); } else { Logger.LogWarning("Redirecting to RedirectAfterPlanChangePaymentDeclined() as payment declined"); return(RedirectAfterPlanChangePaymentDeclined()); } } else { Logger.LogCritical($"Recurring charge was not accepted by shopify (before activation). Redirecting to '{SHOPIFY_ACTIONS.ChoosePlan.ToString()}' action."); WebMsg.AddTempDanger(this, "Payment was not accepted by shopify. Please try again."); return(RedirectToAction(SHOPIFY_ACTIONS.ChoosePlan.ToString(), Settings.GetShopifyControllerName())); } } else { Logger.LogCritical($"Recurring charge's plan is not found in the loaded db plan list.Redirecting to '{SHOPIFY_ACTIONS.ChoosePlan.ToString()}' action."); WebMsg.AddTempDanger(this, "Could not retrieve plan information.Please try again."); return(RedirectToAction(SHOPIFY_ACTIONS.ChoosePlan.ToString(), Settings.GetShopifyControllerName()));//let the user try again } } catch (Exception ex) { Logger.LogWarning("Error occurred while executing ChargeResult()."); LogGenericError(ex); throw ex; } } }