Commit 6603caf7c9913e3171a0eca8b6bb71a3785998f6
Exists in
master
Merge pull request #17 from bbtfr/master
微信企业付款
Showing
2 changed files
with
34 additions
and
15 deletions
Show diff stats
lib/wx_pay/service.rb
@@ -38,7 +38,7 @@ module WxPay | @@ -38,7 +38,7 @@ module WxPay | ||
38 | params | 38 | params |
39 | end | 39 | end |
40 | 40 | ||
41 | - INVOKE_REFUND_REQUIRED_FIELDS = %i(transaction_id out_trade_no out_refund_no total_fee refund_fee) | 41 | + INVOKE_REFUND_REQUIRED_FIELDS = %i(out_refund_no total_fee refund_fee) |
42 | def self.invoke_refund(params) | 42 | def self.invoke_refund(params) |
43 | params = { | 43 | params = { |
44 | appid: WxPay.appid, | 44 | appid: WxPay.appid, |
@@ -49,19 +49,26 @@ module WxPay | @@ -49,19 +49,26 @@ module WxPay | ||
49 | 49 | ||
50 | check_required_options(params, INVOKE_REFUND_REQUIRED_FIELDS) | 50 | check_required_options(params, INVOKE_REFUND_REQUIRED_FIELDS) |
51 | 51 | ||
52 | - # 微信退款需要双向证书 | ||
53 | - # https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4 | ||
54 | - # https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3 | 52 | + r = invoke_remote_with_cert("#{GATEWAY_URL}/secapi/pay/refund", make_payload(params)) |
55 | 53 | ||
56 | - WxPay.extra_rest_client_options = { | ||
57 | - ssl_client_cert: WxPay.apiclient_cert.certificate, | ||
58 | - ssl_client_key: WxPay.apiclient_cert.key, | ||
59 | - verify_ssl: OpenSSL::SSL::VERIFY_NONE | ||
60 | - } | 54 | + yield(r) if block_given? |
61 | 55 | ||
62 | - r = invoke_remote "#{GATEWAY_URL}/secapi/pay/refund", make_payload(params) | 56 | + r |
57 | + end | ||
63 | 58 | ||
64 | - yield(r) if block_given? | 59 | + INVOKE_TRANSFER_REQUIRED_FIELDS = %i(partner_trade_no openid check_name amount desc spbill_create_ip) |
60 | + def self.invoke_transfer params | ||
61 | + params = { | ||
62 | + mch_appid: WxPay.appid, | ||
63 | + mchid: WxPay.mch_id, | ||
64 | + nonce_str: SecureRandom.uuid.tr('-', '') | ||
65 | + }.merge(params) | ||
66 | + | ||
67 | + check_required_options(params, INVOKE_TRANSFER_REQUIRED_FIELDS) | ||
68 | + | ||
69 | + r = invoke_remote_with_cert("#{GATEWAY_URL}/mmpaymkttransfers/promotion/transfers", make_payload(params)) | ||
70 | + | ||
71 | + yield r if block_given? | ||
65 | 72 | ||
66 | r | 73 | r |
67 | end | 74 | end |
@@ -141,14 +148,26 @@ module WxPay | @@ -141,14 +148,26 @@ module WxPay | ||
141 | "<xml>#{params.map { |k, v| "<#{k}>#{v}</#{k}>" }.join}<sign>#{sign}</sign></xml>" | 148 | "<xml>#{params.map { |k, v| "<#{k}>#{v}</#{k}>" }.join}<sign>#{sign}</sign></xml>" |
142 | end | 149 | end |
143 | 150 | ||
144 | - def self.invoke_remote(url, payload) | 151 | + def self.invoke_remote_with_cert(url, payload) |
152 | + # 微信退款、企业付款等需要双向证书 | ||
153 | + # https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4 | ||
154 | + # https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3 | ||
155 | + | ||
156 | + invoke_remote(url, payload, { | ||
157 | + ssl_client_cert: WxPay.apiclient_cert.certificate, | ||
158 | + ssl_client_key: WxPay.apiclient_cert.key, | ||
159 | + verify_ssl: OpenSSL::SSL::VERIFY_NONE | ||
160 | + }) | ||
161 | + end | ||
162 | + | ||
163 | + def self.invoke_remote(url, payload, extra_rest_client_options = {}) | ||
145 | r = RestClient::Request.execute( | 164 | r = RestClient::Request.execute( |
146 | { | 165 | { |
147 | method: :post, | 166 | method: :post, |
148 | url: url, | 167 | url: url, |
149 | payload: payload, | 168 | payload: payload, |
150 | headers: { content_type: 'application/xml' } | 169 | headers: { content_type: 'application/xml' } |
151 | - }.merge(WxPay.extra_rest_client_options) | 170 | + }.merge(WxPay.extra_rest_client_options).merge(extra_rest_client_options) |
152 | ) | 171 | ) |
153 | 172 | ||
154 | if r | 173 | if r |
lib/wx_pay/sign.rb
@@ -6,8 +6,8 @@ module WxPay | @@ -6,8 +6,8 @@ module WxPay | ||
6 | key = params.delete(:key) | 6 | key = params.delete(:key) |
7 | 7 | ||
8 | query = params.sort.map do |key, value| | 8 | query = params.sort.map do |key, value| |
9 | - "#{key}=#{value}" | ||
10 | - end.join('&') | 9 | + "#{key}=#{value}" if value != "" && !value.nil? |
10 | + end.compact.join('&') | ||
11 | 11 | ||
12 | Digest::MD5.hexdigest("#{query}&key=#{key || WxPay.key}").upcase | 12 | Digest::MD5.hexdigest("#{query}&key=#{key || WxPay.key}").upcase |
13 | end | 13 | end |