Tích hợp thanh toán thông qua PayPal bằng gem Active Merchant
Bài đăng này đã không được cập nhật trong 5 năm
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
Cài đặt gem 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
Chỉnh sửa model
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
Chỉnh sửa trong Views
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)
Chỉnh sửa controller:
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 việc 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/
All rights reserved