Back

rails 上使用 微信支付( wx_pay gem ) ,不是ping++.

发布时间: 2016-07-14 08:12:00

微信支付太可怕了.

我不愿意只为了搞定微信支付而去学习好多无用的内容. 

对于程序员来说,  知识有两种: 

1. 学了之后能用很久的. (rails, 设计模式, 单元测试, 方法论 , 英语 等等.)

2. 学了之后很快就没用的.  ( jsf, velocity, 解析xml, jdbc连接数据库,  struts标签, swing组件, ie6以前的IE特定组件, realplayer  object等等)

我觉得微信支付就是属于后者. 

所幸的是,我们有ping++.  这个项目暂时先不用它.  先使用 ruby gem.  

refer to:  https://github.com/jasl/wx_pay

过程就不说了. 可以来这里下载,学习微信的无用知识:  

基本过程: 

1. 使用gem  wx_pay, 修改Gemfile: 

gem 'wx_pay', git: 'https://github.com/jasl/wx_pay.git'

2. 增加: config/initializers/wx_pay.rb

WxPay.appid = Settings.wx_pay.appid  ( wxae???7236b1???5a )
WxPay.key = Settings.wx_pay.key   (tAjcyEypGZR???YZonSpUiHt?????sYb )
WxPay.mch_id = Settings.wx_pay.mch_id ( 1342?????1 )

# 下面这句没有用. TODO .删掉它.
#WxPay.set_apiclient_by_pkcs12(File.read(pkcs12_filepath), pass)

WxPay.extra_rest_client_options = {timeout: 2, open_timeout: 3}

3. 创建一个controller, 作为在调用支付页面之前的 准备: 

class Interface::PaymentsController < Interface::ApplicationController
  def information
    fee = params[:fee]
    order_sn = params[:order_sn]
    payment_params = { 
      body: "在某某店铺消费了#{fee}元",
      out_trade_no: order_sn,

      # 单位是 分, 所以要 乘以 100
      total_fee: (fee.to_f * 100).to_i,

      # 我们服务器的 IP
      spbill_create_ip: '123.56.76.212',
      # 微信服务器调用我们服务器的接口
      notify_url: 'http://www.touring.com.cn/interface/payments/notify',
      trade_type: 'JSAPI', # could be "JSAPI", "NATIVE" or "APP",
      # 用户的open id
      openid: params[:open_id]  # required when trade_type is `JSAPI`
    }   
    puts "== payment_params: #{payment_params.inspect}"

    r = WxPay::Service.invoke_unifiedorder payment_params
    #render json: {
    #  result: 'ok',
    #  r: r
    #}  

    if r.success? # => true
      timeStamp = Time.now.to_i.to_s
      nonceStr = SecureRandom.uuid.tr('-', '') 
      params = { 
        appId: r['appid'],
        timeStamp: timeStamp,
        nonceStr: nonceStr,
        package: "prepay_id=#{r['prepay_id']}",
        signType: 'MD5'
      }   
      paySign = WxPay::Sign.generate(params)
      result = { "prepay_id" => r["prepay_id"], "timeStamp" => timeStamp, "nonceStr" => nonceStr, "paySign" => paySign, "return_code" => r["return_code"], "return_msg" => r[
    else
      result = { "return_code" => r["return_code"], "return_msg" => r["return_msg"], "result_code" => r["result_code"], "err_code" => r["err_code"], "err_code_des" => r["err
    end 
    render json: {
      result: result
    }
  end

  # 这个是支付完之后的回调函数. 
  def notify
logger.info "== notify from weixin server: "
logger.info params.inspect
logger.info "== notify from weixin server( done ) : " end

Back