sử dụng Stripe checkout trong ROR

Giới thiệu Stripe là một cổng thanh toán cung cấp API được dùng để tích hợp Stripe vào các ứng dụng Ruby on Rails. Bài viết này sẽ hướng dẫn bạn qua toàn bộ quá trình tích hợp ứng dụng Stripe với một ứng dụng Rails.Stripe là 1 chuẩn PCI, rất dễ sử dụng.. Stripe sẽ lưu dữ tự động các dữ liệu thanh toán quan trọng trên các máy chủ của chính nó và thực hiện các tiêu chuẩn bảo mật cần thiết, chẳng hạn như mã hóa dữ liệu thẻ tín dụng. To add the Stripe Checkout gateway to your Rails app, follow these steps:

  • Đăng kí account trên hệ thống Stripe
  • Install Stripe gem.
  • Config các Stripe keys trong hệ thống
  • Khởi tạo routes, controller, và các Stripe service

Đăng kí account trên hệ thống Stripe Như chúng tôi đã đề cập trước đó, bạn sẽ cần có hồ sơ của riêng bạn trên trang web của Stripe để có được các API. Các API của Stripe là cần thiết để kiểm tra sự tích hợp của các phương thức thanh toán.Khi bạn đã tạo một tài khoản , hãy đăng nhập vào Stripe để lấy đc các thông tin về Secret Key, publish key để cung cấp cho các hệ thống ROR để sử dụng :

Install Stripe gem

Đăng kí Gemfile trong Ruby on Rails project và add new gem:

  gem 'stripe'

Install gemfile với command line :

  bundle install

Khởi tạo form payment Bạn sẽ không thể tính phí khách hàng của mình mà không có form thanh toán. Các tạo ra 1 form thanh toán sử dụng Stripe trong ROR :

  <%= form_tag charges_path do %>
    <article>
      <% if flash[:error].present? %>
      <div id="error_explanation">
        <p><%= flash[:error] %></p>
      </div>
      <% end %>
      <label class="amount">
      <span>Amount: $<%= @order.price %></span>
      </label>
    </article>
    <script src="https://checkout.stripe.com/checkout.js" class="stripe-button"
      data-key="<%= Rails.configuration.stripe[:publishable_key] %>"
      data-description="A month's subscription"
      data-amount="<%= @order.price %>"
      data-locale="auto"></script>
  <% end %>

Trong form trên bạn cần lưu ý Stripe yêu cầu sự dụng thư viện checkout.js của stripe , thêm nữa ,Stripe yêu cầu đưa publish key vào làm param của attribute data key.

Lưu ý rằng nếu bạn muốn có một hình thức thanh toán tùy chỉnh hoàn toàn, bạn sẽ phải tạo ra một mã thông báo và trình xử lý để gửi Stripe Token này tới máy chủ của bạn. Bạn cũng cần phải thêm một vài kịch bản như :

  1. sử dụng api v2 với stripe
      <script src="https://js.stripe.com/v2/"></script> 
    
  2. Add publish key trong biến toàn cục của hệ thống :
       <script>
          Stripe.setPublishableKey(‘pk_test_SAfpkFB2WVKLbQVukGCTVq5Z’);
       </script>
    
  3. Your main script must accept payment data from the payment form and run a callback function – a handler – that will add another input field to your payment form:
      <input type=”hidden” name=”stripeToken” />
    
    Trình xử lý cũng sẽ gửi biểu mẫu tới máy chủ của bạn. Nếu bạn không thêm input hiddent này thì Stripe sẽ không thể thực hiện đc quá trính thanh toán trên hệ thống. Để đơn giản và tăng tốc sự tích hợp của Stripe vào ứng dụng Rails của bạn, chúng tôi khuyên bạn nên sử dụng Stripe Checkout. Sau đó, khi tất cả mọi thứ hoạt động tốt, bạn có thể thiết kế mẫu thanh toán tùy chỉnh của riêng bạn.

Khởi tạo routes, controller, và các Stripe servicet Khởi tạo charges controller trong ROR :

  class ChargesController < ApplicationController
      rescue_from Stripe::CardError, with: :catch_exception
      def new
      end

      def create
        StripeChargesServices.new(charges_params, current_user).call
        redirect_to new_charge_path
      end

      private

      def charges_params
        params.permit(:stripeEmail, :stripeToken, :order_id)
      end

      def catch_exception(exception)
        flash[:error] = exception.message
      end
end

Khởi tạo Charge services:

  class StripeChargesServices
      DEFAULT_CURRENCY = 'usd'.freeze

      def initialize(params, user)
        @stripe_email = params[:stripeEmail]
        @stripe_token = params[:stripeToken]
        @order = params[:order_id]
        @user = user
      end

      def call
        create_charge(find_customer)
      end

      private

      attr_accessor :user, :stripe_email, :stripe_token, :order

      def find_customer
      if user.stripe_token
        retrieve_customer(user.stripe_token)
      else
        create_customer
      end
      end

      def retrieve_customer(stripe_token)
        Stripe::Customer.retrieve(stripe_token) 
      end

      def create_customer
        customer = Stripe::Customer.create(
          email: stripe_email,
          source: stripe_token
        )
        user.update(stripe_token: customer.id)
        customer
      end

      def create_charge(customer)
        Stripe::Charge.create(
          customer: customer.id,
          amount: order_amount,
          description: customer.email,
          currency: DEFAULT_CURRENCY
        )
      end

      def order_amount
        Order.find_by(id: order).amount
      end
end

Khi bạn đã hoàn tất tất cả các bước được mô tả ở trên, bạn đã tích hợp thành công tính năng Checkout trong ứng dụng Rails của bạn. Bây giờ, bạn có thể tạo một mẫu thanh toán tùy chỉnh và sử dụng các API trực tiếp và bạn có thể cho phép khách hàng thanh toán bằng Stripe trên trang web của bạn.