Profile avatar

鱼翅

同歌性歌颂,同歌性发原

最近更新

本站由 yuchiXiong 使用 Stellar 1.29.1 主题创建。

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

五彩斑斓的黑? 喷一喷单色黑与四色黑2024 年,我终于用上 rem 了......吐槽一下: 还得是拓展坞懂视频接口暗话 JavaScript 函数式: add(3)(4)一点都不酷前端条件竞态乱谈——可能被我误解的函数防抖数据结构其二 并查集数据结构其一 线性表JavaScript 元编程——基于 Proxy 实现 active_record 动态查找从 Rails 视角看现代前端——换一种方式实现 SPA在 Rails 中接入微信支付指北
主页/Rails 踩坑记录
2020-12-27
3245 次阅读

在 Rails 中接入微信支付指北

Rails微信支付支付集成API

准备工作

在接入微信支付前,需要准备以下内容:

  • 微信支付商户号
  • API密钥
  • 证书文件

安装相关Gem


# Gemfile
gem 'wx_pay'
      

配置微信支付


# config/initializers/wx_pay.rb
WxPay.appid = 'YOUR_APPID'
WxPay.key = 'YOUR_KEY'
WxPay.mch_id = 'YOUR_MCH_ID'
WxPay.apiclient_cert_path = 'path/to/apiclient_cert.p12'
WxPay.apiclient_cert_password = 'cert_password'
      

创建支付订单


def create_payment
  params = {
    body: '商品描述',
    out_trade_no: "order_#{Time.now.to_i}",
    total_fee: (product.price * 100).to_i, # 金额以分为单位
    spbill_create_ip: request.remote_ip,
    notify_url: 'https://example.com/wx_notify',
    trade_type: 'JSAPI',
    openid: current_user.wx_openid
  }
  
  result = WxPay::Service.invoke_unifiedorder(params)
  
  if result.success?
    # 生成支付参数
    payment_params = {
      appId: WxPay.appid,
      timeStamp: Time.now.to_i.to_s,
      nonceStr: SecureRandom.hex(16),
      package: "prepay_id=#{result['prepay_id']}",
      signType: 'MD5'
    }
    
    payment_params[:paySign] = WxPay::Sign.generate(payment_params)
    
    render json: { payment_params: payment_params }
  else
    render json: { error: result['return_msg'] }, status: :unprocessable_entity
  end
end
      

处理支付通知


def wx_notify
  result = Hash.from_xml(request.body.read)['xml']
  
  if WxPay::Sign.verify?(result)
    # 处理支付成功逻辑
    order = Order.find_by(out_trade_no: result['out_trade_no'])
    order.update(status: 'paid') if order
    
    render xml: { return_code: 'SUCCESS', return_msg: 'OK' }.to_xml(root: 'xml', dasherize: false)
  else
    render xml: { return_code: 'FAIL', return_msg: '签名失败' }.to_xml(root: 'xml', dasherize: false)
  end
end
      

许可协议

本文采用 署名-非商业性使用-相同方式共享 4.0 国际 许可协议,转载请注明出处。

较旧文章
在 Rails 上搭建 React 服务端渲染踩坑
从 Rails 视角看现代前端——换一种方式实现 SPA
较新文章