Tích hợp giao dịch qua Paypal
Bài đăng này đã không được cập nhật trong 3 năm
Giới thiệu về 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 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!
All rights reserved