12/08/2018, 10:48
Tích hợp giao dịch qua Paypal
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 ...
- 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í.
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