rails 上使用 微信支付( wx_pay gem ) ,不是ping++.
访问量: 4055
微信支付太可怕了.
我不愿意只为了搞定微信支付而去学习好多无用的内容.
对于程序员来说, 知识有两种:
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