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