利用alipay来实现支付功能 - tianlu1677/tianlu1677.github.io GitHub Wiki

这里借助了第三方的gem来实现了阿里支付宝的功能: 即时到帐

0. 去支付宝商户上申请账户

1. 安装gem

  gem 'alipay', '~> 0.1.0'

2. 初始化商户信息

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"

3.创建订单

数据库

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

module transaction.rb

class Transaction < ActiveRecord::Base
end

controller app/controllers/transactions_controller.rb

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

views/transactions/index.html.erb

<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

⚠️ **GitHub.com Fallback** ⚠️