Rails 微信的申请退款

liurui12w · 2019年01月17日 · 最后由 liurui12w 回复于 2019年01月17日 · 2176 次阅读

微信申请退款

微信官方文档https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4 请先看官方文档

接口地址 接口链接:https://api.mch.weixin.qq.com/secapi/pay/refund

官方需求 请求需要双向证书(没有加证书的话无法访问)

请求参数(详细请看官方文档)

例子

下面是我实现的代码

url = URI.parse('https://api.mch.weixin.qq.com/secapi/pay/refund') http = Net::HTTP.new(url.host, url.port) #这是我存放在配置文件里 app_id = ENV['SmallAppID']
app_key = ENV['Smallkey'] mch_id = ENV['Smallmch_id']

https 双向认证

http.use_ssl = true if url.scheme == 'https'

http.cert = OpenSSL::X509::Certificate.new(File.read("config/apiclient_cert.pem"))

http.key = OpenSSL::PKey::RSA.new((File.read("config/apiclient_key.pem")))

http.verify_mode = OpenSSL::SSL::VERIFY_NONE

req = Net::HTTP::Post.new(url, {'Content-Type' => 'application/xml'})

nonce_str = ['a'..'z','0'..'9',*'A'..'Z'].sample(32).join #随机数

#传的 xml body_xml = "#{app_id}#{mch_id}#{nonce_str}#{@last_order.payment.payment_no}#{@last_order.payment.payment_no}#{Float(@last_order.payment.total_money*100).round}#{Float(@last_order.payment.total_money*100).round}"

#签名 可在https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1 先测试 sign = Digest::MD5.hexdigest("appid=#{app_id}&mch_id=#{mch_id}&nonce_str=#{nonce_str}&out_refund_no=#{@last_order.payment.payment_no}&out_trade_no=#{@last_order.payment.payment_no}&refund_fee=#{Float(@last_order.payment.total_money*100).round}&total_fee=#{Float(@last_order.payment.total_money*100).round}&key=#{app_key}")

body_xml += "#{sign.upcase}" #这里的签名需要转大写

req.body = body_xml

response = http.request(req) result = Hash.from_xml(response.body)["xml"]

结果 result ["return_code"] SUCCESS/FAIL

因为最近才写这个需求,发现社区没有,就写了一下自己的成果,希望来的后辈前辈多指点,看完帮我优化优化代码,说说缺点 感谢 😊 如果做其他的微信相关的 推荐用前辈的 https://github.com/jasl/wx_pay 很好用

liurui12w 回复

你代码还是用 markdown 好好编辑下,没有格式估计就都点出去了

liurui12w 回复

wx_pay 这个 gem 包就有实现好的退款功能 wx_pay/lib/wx_pay/service.rb invoke_refund

mohao 回复

谢谢 是我看的不精了 😂

谢谢 以后会遵守的

liurui12w 关闭了讨论。 07月31日 22:04
需要 登录 后方可回复, 如果你还没有账号请 注册新账号