利用alipay来实现支付功能 - tianlu1677/tianlu1677.github.io GitHub Wiki
这里借助了第三方的gem来实现了阿里支付宝的功能: 即时到帐
gem 'alipay', '~> 0.1.0'
config/config/initializers/alipay.rb
Alipay.pid = Settings.alipay.pid
Alipay.key = Settings.alipay.key
Alipay.seller_email = Settings.alipay.seller_email
这个时候要借助了setting.yml
#alipay for test
alipay:
pid: ''
key: ''
seller_email: ""
return_url: "" #"https://nlcfcpohhd.localtunnel.me/transactions/done"
notify_url: "" #"https://nlcfcpohhd.localtunnel.me/transactions/notify"
class CreateTransactions < ActiveRecord::Migration
def change
create_table :transactions do |t|
t.string :notify_id
t.float :total_fee
t.string :trade_status
t.string :out_trade_no
t.datetime :notify_time
t.timestamps
end
end
end
class Transaction < ActiveRecord::Base
end
class TransactionsController < ApplicationController
before_action :create_transaction, :only => [:done, :notify]
before_filter :authenticate_administrator!
skip_before_filter :authenticate_administrator!, only: :notify
skip_before_filter :verify_authenticity_token, :notify
def index
@transactions = Transaction.all
end
def create_transaction
transaction = Transaction.find_by_out_trade_no(params[:out_trade_no])
if params[:trade_status] == 'TRADE_SUCCESS' && transaction.nil?
transaction = Transaction.new(notify_id: params[:notify_id], total_fee: params[:total_fee], out_trade_no: params[:out_trade_no], trade_status: params[:trade_status], notify_time: params[:notify_time])
transaction.save!
end
end
def show
flash[:notice] = "付款成功啦!"
redirect_to '/transactions'
# redirect_to '/transactions'
end
def done
# flash[:notice] = "付款成功啦!"
# redirect_to '/transactions'
end
def notify
notify_params = params.except(*request.path_parameters.keys)
if Alipay::Notify.verify?(notify_params)
render text: 'success'
else
render text: 'failed'
end
end
def checkout
options = {
:description => 'Lovely description',
:out_trade_no => Time.now.to_i.to_s,
:subject => '开课吧课程支付',
:price => params[:price],
:quantity => params[:quantity],
:discount => '0.00',
:return_url => "https://vsfblethya.localtunnel.me/transactions/done",
:notify_url => "https://vsfblethya.localtunnel.me/transactions/notify"
# :return_url => Settings.alipay.return_url,
# :notify_url => Settings.alipay.notify_url
}
redirect_to Alipay::Service.create_direct_pay_by_user_url(options)
end
end
<h1>
支付宝双功能接口示范程序
</h1>
<p>
</p>
<%= form_tag checkout_transactions_path do %>
<%= label_tag(:price, "商品价格(price)") %>
<%= text_field_tag(:price) %>
<%= label_tag(:quantity, "数量(quantity)") %>
<%= text_field_tag(:quantity) %>
<%= submit_tag("去支付宝结账") %>
<% end %>
<ul>
<li>
注意!到了支付宝页面,一定要选择“即时到账”,不支持“担保交易”
</li>
<li>
付款完成后,请不要关闭支付宝窗口,将自动跳回本站,方便您继续操作。
</li>
</ul>
<h2>交易记录</h2>
<%= flash[:notice] %>
<table>
<tr>
<th>
out_trade_no
</th>
<th>
total_fee
</th>
<th>
notify_time
</th>
</tr>
<% @transactions.reverse.each do |t| %>
<tr>
<td>
<%= t.out_trade_no %>
</td>
<td>
<%= t.total_fee %>
</td>
<td>
<%= t.notify_time %>
</td>
</tr>
<% end %>
</table>
## 修改routes
#for alipay
resources :transactions do
collection do
get 'done'
post 'notify'
post 'checkout'
end
end
如何解释说明: #1. 进行一次实际性的支付功能。 #2. 对一次支付过程的简单介绍,主要包括同步通知,和异步通知 #3. 借助alipay支付gem,进行一次实际支付功能的实现 #4. 注意: 将本地端口,转化为实际的端口 #5. 退款交易,可参加9wu