# wcpay
**Repository Path**: oldfritter/wcpay
## Basic Information
- **Project Name**: wcpay
- **Description**: wcpay
- **Primary Language**: Ruby
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2017-08-11
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## wcpay
=====
Wcpay 是一个用于微信公众号扫码支付的gem,可以将微信支付集成到自己开发的网站中。
囊括了,扫码支付 和 退款 两项功能
## useage
=====
0.准备
```
configs = YAML.safe_load File.open(File.expand_path('../payment.yml', __dir__))
WCPay.app_id = configs['WCPay']['app_id']
WCPay.app_secret = configs['WCPay']['app_secret']
WCPay.mch_id = configs['WCPay']['mch_id']
WCPay.key = configs['WCPay']['key']
WCPay.set_apiclient_by_pkcs12 File.read(File.expand_path('../pems/apiclient_cert.p12', __dir__)), WCPay.mch_id.to_s
```
1.获取生成支付二维码的字符串
```
WCPay::Service.unified_order(
body: '商品描述',
out_trade_no: '本地订单号',
total_fee: 1223, #总金额,分
spbill_create_ip: '10.10.222.333', #用户的IP
notify_url: #异步通知的url
)
```
2.生成二维码供用户扫码支付
3.支付成功后,微信异步通知的校验
```
nokogiri = Nokogiri::XML(request.body.read)
params_ha = {}
nokogiri.children[0].children.each { |child| params_ha[child.name] = child.text unless child.name == 'text' || child.text == "\n " }
return render xml: '' if params_ha['result_code'] != 'SUCCESS' || params_ha['return_code'] != 'SUCCESS'
@order = Order.find_by sn: params_ha['out_trade_no'] # 依据订单号找到对应订单
@pay_log = @order.wechat_pay_log # @pay_log为微信支付记录
if WCPay::Sign.verify?(params_ha) && params_ha['total_fee'].to_i == @pay_log.amount
@pay_log.obtain(trade_no: params_ha['transaction_id']) unless @pay_log.paid? # 确认到款,并记录微信订单号
render xml: ''
end
```
4.退款
```
batch_num = batch_no || WCPay::Utils.generate_batch_no # 生成退款单号
self.update_attributes batch_no: batch_num, status: PayLog::STATUS[:REFUNDING]
result = WCPay::Service.refund transaction_id: trade_no, out_refund_no: batch_num, total_fee: amount, refund_fee: amount # 请求退款接口
self.auto_refund_obtain pay_log_type: 'PayLogs::Wechat' if result['return_code'] == 'SUCCESS' && result['return_msg'] == 'OK' && notify_verify?(result) && result['total_fee'].to_i == amount # 验证退款结果
```