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/