public IActionResult RecurringInitial(PaymentViewModel model) { PayOnClient client = new PayOnClient(Settings.EntityIdThreeDSecure, Settings.UserId, Settings.Password, Settings.BaseUrl); PaymentRequest request = new PaymentRequest { PaymentBrand = model.PaymentBrand, Amount = model.Amount, Card = new CardAccount { Holder = model.CardHolder, Number = model.CardNumber, ExpiryMonth = model.CardExpiryMonth, ExpiryYear = model.CardExpiryYear, Cvv = model.CardCvv, PaymentBrand = model.PaymentBrand }, Currency = "ZAR", PaymentType = "DB", RecurringType = "INITIAL", CreateRegistration = true, Timestamp = DateTime.Now.ToIso8601String(), ShopperResultUrl = $"{Request.Scheme}://{Request.Host}/Home/RecurringInitialConfirm" }; try { PaymentResponse response = client.RequestPayment(request); model.Id = response.Id; // Not enrolled for 3D Secure if (response.Result.GetResultStatus() == ResultStatus.Approved) { return(RedirectToAction("RedirectComplete", response.RegistrationId)); } if (response.Result.GetResultStatus() == ResultStatus.Declined || response.Result.GetResultStatus() != ResultStatus.Pending) { model.Status = $"{Enum.GetName(typeof(ResultStatus), response.Result.GetResultStatus())}. Result code: {response.Result.Code}. Result Description: {response.Result.Description}"; return(View(model)); } CachedRegistrationId = response.RegistrationId; return(Content(GetRedirectPageHtml(response), "text/html")); } catch (Exception ex) { _logger.LogError("Unable to start Recurring Transaction", ex); model.Status = $"Unable to start Recurring Transaction. {ex}"; } return(View(model)); }
public void ThreeDSecureTokenizationWithRecurringPayment() { PayOnClient threeDSecureClient = new PayOnClient(EntityId_ThreeDPayment, UserId, Password, BaseUrl, TestMode); PayOnClient recurringPaymentClient = new PayOnClient(EntityId_Recurring, UserId, Password, BaseUrl, TestMode); CardAccount[] cardAccounts = TestData.GetTestPaymentCardAccounts(); foreach (var cardAccount in cardAccounts) { int idx = Array.FindIndex(cardAccounts, x => x == cardAccount) + 1; Log($"\nTest card: {idx}/{cardAccounts.Count()}: {cardAccount.Number}"); PaymentRequest request = new PaymentRequest { PaymentBrand = cardAccount.PaymentBrand, Amount = "1.00", Currency = "ZAR", Card = cardAccount, PaymentType = "DB", RecurringType = "INITIAL", CreateRegistration = true, ShopperResultUrl = "https://newco/payment/confirm", Timestamp = DateTime.Now.ToIso8601String() }; Log("3D Secure Request with Tokenization", JsonConvert.SerializeObject(request)); PaymentResponse response = threeDSecureClient.RequestPayment(request); Log("3D Secure Response with Tokenization", JsonConvert.SerializeObject(response)); string registrationId = response.RegistrationId; Assert.NotNull(registrationId); // If ACS is required if (response.Result.GetResultStatus() == ResultStatus.Pending) { PaymentStatusResponse paymentResult = RequestPaymentStatus(threeDSecureClient, cardAccount, response.Redirect); Assert.Equal(ResultStatus.Approved, paymentResult?.Result?.GetResultStatus()); } else { Assert.Equal(ResultStatus.Approved, response.Result.GetResultStatus()); } // Recurring transaction RegistrationRequest recurringRequest = new RegistrationRequest { PaymentBrand = cardAccount.PaymentBrand, Amount = "123.45", Currency = "ZAR", RecurringType = "REPEATED", PaymentType = "DB", CreateRegistration = false, RegistrationId = registrationId }; Log("Initial Recurring Registration Request", JsonConvert.SerializeObject(recurringRequest)); RegistrationResponse recurringResponse = recurringPaymentClient.RequestRegistration(recurringRequest); Log("Repeat Recurring Registration Response", JsonConvert.SerializeObject(recurringResponse)); Assert.Equal(ResultStatus.Approved, recurringResponse.Result.GetResultStatus()); } }