Tích hợp giao dịch qua Paypal

Giới thiệu về PayPal

paypal.png

  • PayPal là một cổng thanh toán trực tuyến (dịch vụ trung gian) giúp bạn đưa tiền từ tài khoản vào tài khoản PayPal để giao dịch trên mạng hoặc rút tiền từ tài khoản PayPal về ngân hàng.
  • Sử dụng PayPal rất đơn giản hơn và bảo mật, hỗ trợ an toàn giao dịch cho cả người mua và người bán, thanh toán nhanh chóng, an toàn và tiện lợi.
  • Đăng kí PayPal rất đơn giản và hoàn toàn miễn phí.

Tích hợp PayPal vào website ROR sử dụng Classic APIs

Bước 1. Tạo ứng dụng Rails và các tài khoản PayPal

  • Tạo ứng dụng với model UsageHistory gồm 3 trường chính (amount, used_date và settlement_code)
  • Tạo UsageHistoriesController:
  class UsageHistoriesController < ApplicationController
      def new
        @usage_history = UsageHistory.new
      end

      def create
      end
  end
  • Tạo form thanh toán (usage_histories/new.html.haml):
= form_for @usage_history, url: usage_histories_path(secure: true), remote: true do |f|
      = f.text_field :amount
      = f.submit "Buy"
  • Tạo 2 tài khoản PayPal cho người bán và người mua với các thông tin tài khoản người bán: USERNAME, PASSWORD, SIGNATURE, VERSION_API

Bước 2. Tạo TOKEN cho giao dịch và redirect đến PayPal

  • Tạo hàm lấy token qua Net::HTTP
class UsageHistory < ActiveRecord::Base
      def token_payment locale
        uri = URI "https://api-3t.sandbox.paypal.com/nvp"
        return_url = "http://localhost:3000/usage_histories/new"
        cancel_url = "http://localhost:3000/usage_histories/new"
        data = {USER: USERNAME, PWD: PASSWORD,
          SIGNATURE: SIGNATURE, VERSION: VERSION_API,
          PAYMENTREQUEST_0_PAYMENTACTION: "Sale",
          RETURNURL: return_url, CANCELURL: cancel_url,
          PAYMENTREQUEST_0_AMT: self.amount,
          PAYMENTREQUEST_0_CURRENCYCODE: "USD",
          METHOD: "SetExpressCheckout"}
        res = Net::HTTP.post_form uri, data
        response = to_hash res.body
        self.settlement_code = response[:TOKEN]
      end

      #Phân tích kết quả trả về dưới dạng hash
      def to_hash string
        string.split(/[&=]/).each_slice(2).inject({}) do |hash, i|
          hash[i.first.to_sym] = i.last
          hash
        end
      end
end
  • Redirect đến Paypal: Tạo file usage_histories/create.js.erb
<% @usage_history.token_payment %>
window.location.href = "https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=<%= @usage_history.settlement_code %>";

Bước 3. Tiến hành giao dịch trên PayPal và Confirm data trả về

  • Sau khi tiến hành giao dịch trên PayPal, kết quả giao dịch sẽ được trả về thông qua return_url ("http://localhost:3000/usage_histories/new")
  • Xây dựng hàm xử lý kết quả trả về của giao dịch trong model:
def data_confirm token
      uri = URI "https://api-3t.sandbox.paypal.com/nvp"
      data = {USER: USERNAME, PWD: PASSWORD,
        SIGNATURE: SIGNATURE, VERSION: VERSION_API,
        TOKEN: token, METHOD: "GetExpressCheckoutDetails"}
      res = Net::HTTP.post_form uri, data
      response = to_hash res.body
      self.amount = response[:AMT]
      if datetime = Time.zone.parse(URI.decode(response[:TIMESTAMP]))
        self.used_date = datetime
      end
      self.settlement_code = token
end
  • Xử lý controller:
def new
      @usage_history = UsageHistory.new
      @usage_history.data_confirm params[:token] if params[:PayerID].present?
end

Bước 4. Hoàn thành giao dịch

  • Xây dựng hàm xử lý kết quả giao dịch trong model:
def checkout_payment token, payer_id
      uri = URI "https://api-3t.sandbox.paypal.com/nvp"
      data = {USER: USERNAME, PWD: PASSWORD,
        SIGNATURE: SIGNATURE, VERSION: VERSION_API,
        PAYMENTREQUEST_0_PAYMENTACTION: "Sale",
        TOKEN: token,
        PAYERID: payer_id,
        PAYMENTREQUEST_0_AMT: self.amount,
        METHOD: "DoExpressCheckoutPayment",
        PAYMENTREQUEST_0_CURRENCYCODE: "USD"}
      res = Net::HTTP.post_form uri, data
      response = to_hash res.body
      if response[:ACK] == "Success"
        self.settlement_code = token
      end
  end
  • Xử lý controller:
  def create
      if params[:usage_history]
        @usage_history = UsageHistory.new usage_history_params
        @usage_history.checkout_payment params[:usage_history][:settlement_code], params[:usage_history][:PayerID]
      end
      if @usage_history.save
        respond_to do |format|
          format.js do
            render js: "window.location.href='" + usage_history_path(@usage_history) + "'"
          end
          format.html{redirect_to @usage_history}
        end
      else
        respond_to do |format|
          format.js do
            flash[:alert] = "Error"
            render js: "window.location.href='" + new_usage_history_path + "'"
          end
          format.html{redirect_to new_usage_history_path, alert: "Error"}
        end
      end
  end

  private
  def usage_history_params
      params.require(:usage_history).permit [:amount, :used_date, :settlement_code]
  end

Như vậy chúng ta đã có một website có thể thanh toán qua PayPal đơn giản

Thanks for reading!