From 9752fa1164fc73d44cad83fc636f9987a0d19a43 Mon Sep 17 00:00:00 2001 From: Theo Date: Sat, 5 Sep 2015 17:15:27 +0800 Subject: [PATCH] new feature: 微信企业付款 --- lib/wx_pay/service.rb | 43 +++++++++++++++++++++++++++++++------------ lib/wx_pay/sign.rb | 4 ++-- 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/lib/wx_pay/service.rb b/lib/wx_pay/service.rb index ea58640..504d651 100644 --- a/lib/wx_pay/service.rb +++ b/lib/wx_pay/service.rb @@ -49,19 +49,26 @@ module WxPay check_required_options(params, INVOKE_REFUND_REQUIRED_FIELDS) - # 微信退款需要双向证书 - # https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4 - # https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3 + r = invoke_remote_with_cert("#{GATEWAY_URL}/secapi/pay/refund", make_payload(params)) - WxPay.extra_rest_client_options = { - ssl_client_cert: WxPay.apiclient_cert.certificate, - ssl_client_key: WxPay.apiclient_cert.key, - verify_ssl: OpenSSL::SSL::VERIFY_NONE - } + yield(r) if block_given? - r = invoke_remote "#{GATEWAY_URL}/secapi/pay/refund", make_payload(params) + r + end - yield(r) if block_given? + INVOKE_TRANSFER_REQUIRED_FIELDS = %i(partner_trade_no openid check_name amount desc spbill_create_ip) + def self.invoke_transfer params + params = { + mch_appid: WxPay.appid, + mchid: WxPay.mch_id, + nonce_str: SecureRandom.uuid.tr('-', '') + }.merge(params) + + check_required_options(params, INVOKE_TRANSFER_REQUIRED_FIELDS) + + r = invoke_remote_with_cert("#{GATEWAY_URL}/mmpaymkttransfers/promotion/transfers", make_payload(params)) + + yield r if block_given? r end @@ -81,14 +88,26 @@ module WxPay "#{params.map { |k, v| "<#{k}>#{v}" }.join}#{sign}" end - def self.invoke_remote(url, payload) + def self.invoke_remote_with_cert(url, payload) + # 微信退款、企业付款等需要双向证书 + # https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4 + # https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3 + + invoke_remote(url, payload, { + ssl_client_cert: WxPay.apiclient_cert.certificate, + ssl_client_key: WxPay.apiclient_cert.key, + verify_ssl: OpenSSL::SSL::VERIFY_NONE + }) + end + + def self.invoke_remote(url, payload, extra_rest_client_options = {}) r = RestClient::Request.execute( { method: :post, url: url, payload: payload, headers: { content_type: 'application/xml' } - }.merge(WxPay.extra_rest_client_options) + }.merge(WxPay.extra_rest_client_options).merge(extra_rest_client_options) ) if r diff --git a/lib/wx_pay/sign.rb b/lib/wx_pay/sign.rb index 9b94266..a6e164f 100644 --- a/lib/wx_pay/sign.rb +++ b/lib/wx_pay/sign.rb @@ -6,8 +6,8 @@ module WxPay key = params.delete(:key) query = params.sort.map do |key, value| - "#{key}=#{value}" - end.join('&') + "#{key}=#{value}" if value != "" && !value.nil? + end.compact.join('&') Digest::MD5.hexdigest("#{query}&key=#{key || WxPay.key}").upcase end -- libgit2 0.21.0