How to integrate Stripe payment gateway to ASP.NET MVC

Viewed 8007

I want to integrate Stripe psp into my ASP.NET MVC application.

Before you roast me with looking for questions with same issues, I did look for the said questions but they seem to be outdated.

I tried to follow the procedures from stripe website, but the javascript couldn't load the payment. I know I'm missing something.

If you could help me rather than roast me it would be great :).
p.s I'm totally new to MVC :/

The cshtml view with script

@{
    Layout = null;
}


<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>ProcessPayment | Merchant Dashboard</title>
    <script src="https://js.stripe.com/v3/"></script>
  <script>
      var stripe = Stripe('pk_test_51H1XOgCuKWbkvTE3V6VYOV0qVBLrEcZMCISGPWJ3nZeDqq3JgWb1GL1c2HRxk4NAve4j7YFkZeAvWoatocuvgzLb00bSZL72k3');
      var elements = stripe.elements();

      // Custom styling can be passed to options when creating an Element.
      var style = {
          base: {
              // Add your base input styles here. For example:
              fontSize: '16px',
              color: '#32325d',
          },
      };

      // Create an instance of the card Element.
      var card = elements.create('card', { style: style });

      // Add an instance of the card Element into the `card-element` <div>.
      card.mount('#card-element');

      // Create a token or display an error when the form is submitted.
      var form = document.getElementById('payment-form');
      form.addEventListener('submit', function (event) {
          event.preventDefault();

          stripe.createToken(card).then(function (result) {
              if (result.error) {
                  // Inform the customer that there was an error.
                  var errorElement = document.getElementById('card-errors');
                  errorElement.textContent = result.error.message;
              } else {
                  // Send the token to your server.
                  stripeTokenHandler(result.token);
              }
          });
      });

      function stripeTokenHandler(token) {
          // Insert the token ID into the form so it gets submitted to the server
          var form = document.getElementById('payment-form');
          var hiddenInput = document.createElement('input');
          hiddenInput.setAttribute('type', 'hidden');
          hiddenInput.setAttribute('name', 'stripeToken');
          hiddenInput.setAttribute('value', token.id);
          form.appendChild(hiddenInput);

          // Submit the form
          form.submit();
      }

      // Set your secret key. Remember to switch to your live secret key in production!
      // See your keys here: https://dashboard.stripe.com/account/apikeys
      StripeConfiguration.ApiKey = "pk_test_51H1XOgCuKWbkvTE3V6VYOV0qVBLrEcZMCISGPWJ3nZeDqq3JgWb1GL1c2HRxk4NAve4j7YFkZeAvWoatocuvgzLb00bSZL72k3";

      // Token is created using Checkout or Elements!
      // Get the payment token submitted by the form:
      var token = model.Token; // Using ASP.NET MVC

      var options = new ChargeCreateOptions
      {
          Amount = 999,
              Currency = "usd",
              Description = "Example charge",
              Source = token,
};

      var service = new ChargeService();
      var charge = service.Create(options);
  </script>
</head>
<body>

    <form action="/charge" method="post" id="payment-form">
        <div class="form-row">
            <label for="card-element">
                Credit or debit card
            </label>
            <div id="card-element">
                <!-- A Stripe Element will be inserted here. -->
            </div>

            <!-- Used to display Element errors. -->
            <div id="card-errors" role="alert"></div>
        </div>

        <button>Submit Payment</button>
    </form>
</body>
</html>

The controller

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MerchantCheckout.Models;
using Stripe;

namespace MerchantCheckout.Controllers
{
    public class ProcessPaymentController : Controller
    {
        // GET: ProcessPayment
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult ProcessPayment()
        {
            var stripePublishKey = ConfigurationManager.AppSettings["pk_test_51H1XOgCuKWbkvTE3V6VYOV0qVBLrEcZMCISGPWJ3nZeDqq3JgWb1GL1c2HRxk4NAve4j7YFkZeAvWoatocuvgzLb00bSZL72k3"];
            ViewBag.StripePublishKey = stripePublishKey;
            return View();
        }

        public ActionResult Charge(string stripeEmail, string stripeToken)
        {
            Stripe.CustomerCreateOptions customer = new Stripe.CustomerCreateOptions();

            var custService = new Stripe.CustomerService();

            Stripe.Customer stpCustomer = custService.Create(customer);

            return View();
        }
    }
}
2 Answers

Well I managed to make it work :). For any one like me who is stucked, please follow the steps below:

Step 1: Once you get your key from stripe, add it to your web.config file

 <add key="stripePublishableKey" value="YourKeyHere"/>

Note: I've added for testing purposes only. You can later add your secret key when your app goes live.

Step 2: Add the following codes in your controller

public ActionResult Index()
{
    ViewBag.StripePublishKey = ConfigurationManager.AppSettings["stripePublishableKey"];
     return View();
}
    
[HttpPost]
public ActionResult Charge(string stripeToken, string stripeEmail)
{
   Stripe.StripeConfiguration.SetApiKey("your Publishable key");
    Stripe.StripeConfiguration.ApiKey = "your Secret key";
    
    var myCharge = new Stripe.ChargeCreateOptions();
    // always set these properties
    myCharge.Amount = 500;
    myCharge.Currency = "USD";
    myCharge.ReceiptEmail = stripeEmail;
    myCharge.Description = "Sample Charge";
    myCharge.Source = stripeToken;
    myCharge.Capture = true;
    var chargeService = new Stripe.ChargeService();
    Charge stripeCharge = chargeService.Create(myCharge);
    return View();
}

Step 3: Verify if your cshtml file contains the following codes, if not, add them:

<form action="/Home/Charge" method="POST">
    <article>
        <label>Amount: $5.00</label>
    </article>
    <script src="//checkout.stripe.com/v2/checkout.js"
            class="stripe-button"
            data-key="@ViewBag.StripePublishKey"
            data-locale="auto"
            data-description="Sample Charge"
            data-amount="500">
    </script>
</form>

Step 4: Test!! You should however use the stripe test data.

I do not own the above codes, did some research and came across this website where this man explains how its done.Click here

Stripe Integration is very easy.
Stripe has provided very useful documentation for payment gateway integration. we can follow the same
For new users it's important to understand how we can integrate payment gateway into our application.

Note: Before starting any development, First be ready with publishable key and secrete key. Register or login to Stripe account and get these keys from there.

When I used Stripe first time in my Application, I followed below link

  1. Go to https://stripe.com/docs/payments/integration-builder
  2. Choose language .NET
  3. Choose Prebuild Checkout Page/Custom Payment flow

To do a quick test I will suggest to use Prebuild Checkout Page. Once you get confidence then you can move on to Custom payment flow.

To integrate with .NET CORE MVC application you can refer github project :
https://github.com/rohitsoftt/stripe-payment-gateway-dot-net-core
You need to update your keys in appsettings.json file

Related