Commit 9752fa1164fc73d44cad83fc636f9987a0d19a43

Authored by Theo
1 parent ee0099fd
Exists in master

new feature: 微信企业付款

Showing 2 changed files with 33 additions and 14 deletions   Show diff stats
lib/wx_pay/service.rb
@@ -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
@@ -81,14 +88,26 @@ module WxPay @@ -81,14 +88,26 @@ module WxPay
81 "<xml>#{params.map { |k, v| "<#{k}>#{v}</#{k}>" }.join}<sign>#{sign}</sign></xml>" 88 "<xml>#{params.map { |k, v| "<#{k}>#{v}</#{k}>" }.join}<sign>#{sign}</sign></xml>"
82 end 89 end
83 90
84 - def self.invoke_remote(url, payload) 91 + def self.invoke_remote_with_cert(url, payload)
  92 + # 微信退款、企业付款等需要双向证书
  93 + # https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4
  94 + # https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3
  95 +
  96 + invoke_remote(url, payload, {
  97 + ssl_client_cert: WxPay.apiclient_cert.certificate,
  98 + ssl_client_key: WxPay.apiclient_cert.key,
  99 + verify_ssl: OpenSSL::SSL::VERIFY_NONE
  100 + })
  101 + end
  102 +
  103 + def self.invoke_remote(url, payload, extra_rest_client_options = {})
85 r = RestClient::Request.execute( 104 r = RestClient::Request.execute(
86 { 105 {
87 method: :post, 106 method: :post,
88 url: url, 107 url: url,
89 payload: payload, 108 payload: payload,
90 headers: { content_type: 'application/xml' } 109 headers: { content_type: 'application/xml' }
91 - }.merge(WxPay.extra_rest_client_options) 110 + }.merge(WxPay.extra_rest_client_options).merge(extra_rest_client_options)
92 ) 111 )
93 112
94 if r 113 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