12/08/2018, 15:13

Tích hợp thanh toán thông qua PayPal bằng gem Active Merchant

Trong bài viết này, mình sẽ hướng dẫn các bạn cách để tích hợp thành toán thông qua Paypal express trong Rails 4 thông qua gem active merchant . Trước khi chúng ta tiếp tục, hãy chắc chắn rằng bạn có đủ các điều kiện sau: Tài khoản Paypal cho developer Tạo một tài khoản Paypal sandbox. Gem ...

Trong bài viết này, mình sẽ hướng dẫn các bạn cách để tích hợp thành toán thông qua Paypal express trong Rails 4 thông qua gem active merchant . Trước khi chúng ta tiếp tục, hãy chắc chắn rằng bạn có đủ các điều kiện sau:

  • Tài khoản Paypal cho developer
  • Tạo một tài khoản Paypal sandbox.

Gem mà chúng ta sử dụng ở đây sẽ là Active merchant

Chúng ta sẽ thêm những đoạn code sau vào file developer.rb và file test.rb. config/environments/developer.rb

config.after_initialize do
  ActiveMerchant::Billing::Base.mode = :test
  paypal_options = {
    login: "API_USERNAME_HERE",
    password: "API_PASSWORD_HERE",
    signature: "API_SIGNATURE_HERE"
  }
  ::EXPRESS_GATEWAY = ActiveMerchant::Billing::PaypalExpressGateway.new(paypal_options)
end

config/environments/test.rb

config.after_initialize do
  ActiveMerchant::Billing::Base.mode = :test
  ::EXPRESS_GATEWAY = ActiveMerchant::Billing::BogusGateway.new
end

Tùy vào ứng dụng của bạn như thế nào mà model sẽ thay đổi tương ứng. Có thể bạn sẽ có bảng Order, Cart hoặc booking trong cơ sở dữ liệu. Thường thì bảng Order hoặc Cart của bạn sẽ có những trường dữ liệu sau:

carts
 - id
 - total_amount_cents
 - purchased_at
 - created_at
 - updated_at
 
orders
 - id
 - cart_id
 - ip
 - express_token
 - express_payer_id

Hãy chỉnh sửa app/models/order.rb như sau

class Order < ActiveRecord::Base
  belongs_to :cart

  def purchase
    response = EXPRESS_GATEWAY.purchase(order.total_amount_cents, express_purchase_options)
    cart.update_attribute(:purchased_at, Time.now) if response.success?
    response.success?
  end

  def express_token=(token)
    self[:express_token] = token
    if new_record? && !token.blank?
      # you can dump details var if you need more info from buyer
      details = EXPRESS_GATEWAY.details_for(token)
      self.express_payer_id = details.payer_id
    end
  end

  private

  def express_purchase_options
    {
      :ip => ip,
      :token => express_token,
      :payer_id => express_payer_id
    }
  end
end

Sau khi bạn thêm express_checkout vào file routes, trong trang Cart, hãy đặt button thanh toán thông qua Paypal:

link_to(image_tag("https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif"), express_checkout_path)

Thêm hàm sau vào trong Order controller của bạn:

  • express_checkout hàm này sẽ thiết lập viveecj mua hàng của bạn và chuyển hướng nó đến paypal.
  • new được coi như là đường dẫn trả về của Paypal. Mình thường thêm button Confirm order tại đây, điều này sẽ làm cho việc order ko diễn ra ngay lập tức.
  • create Tạo và mua hàng. app/controllers/orders_controller.rb
def express_checkout
  response = EXPRESS_GATEWAY.setup_purchase(YOUR_TOTAL_AMOUNT_IN_CENTS,
    ip: request.remote_ip,
    return_url: YOUR_RETURN_URL_,
    cancel_return_url: YOUR_CANCEL_RETURL_URL,
    currency: "USD",
    allow_guest_checkout: true,
    items: [{name: "Order", description: "Order description", quantity: "1", amount: AMOUNT_IN_CENTS}]
  )
  redirect_to EXPRESS_GATEWAY.redirect_url_for(response.token)
end

def new
  @order = Order.new(:express_token => params[:token])
end

def create
  @order = @cart.build_order(order_params)
  @order.ip = request.remote_ip

  if @order.save
    if @order.purchase # this is where we purchase the order. refer to the model method below
      redirect_to order_url(@order)
    else
      render :action => "failure"
    end
  else
    render :action => 'new'
  end
end

Lưu ý: total_amount nên có giá trị tương ứng với tổng số item trong mảng hoặc trong hash nếu không bạn sẽ gặp lỗi trong quá trình sử dụng.

Nguồn: http://jldbasa.github.io/blog/2014/01/25/rails-4-paypal-express-checkout-integration/

0