parent
							
								
									e9fc431c60
								
							
						
					
					
						commit
						7835ed034e
					
				| @ -0,0 +1,8 @@ | |||||||
|  | class Wechats::JsSdkSignaturesController < ApplicationController | ||||||
|  |   def create | ||||||
|  |     signature = Util::Wechat.js_sdk_signature(params[:url], params[:noncestr], params[:timestamp]) | ||||||
|  |     render_ok(signature: signature) | ||||||
|  |   rescue Util::Wechat::Error => ex | ||||||
|  |     render_error(ex.message) | ||||||
|  |   end | ||||||
|  | end | ||||||
| @ -0,0 +1,74 @@ | |||||||
|  | module Util::Wechat | ||||||
|  |   BASE_SITE = 'https://api.weixin.qq.com'.freeze | ||||||
|  | 
 | ||||||
|  |   Error = Class.new(StandardError) | ||||||
|  | 
 | ||||||
|  |   class << self | ||||||
|  |     attr_accessor :appid, :secret | ||||||
|  | 
 | ||||||
|  |     def js_sdk_signature(url, noncestr, timestamp) | ||||||
|  |       str = { jsapi_ticket: jsapi_ticket, noncestr: noncestr, timestamp: timestamp, url: url }.to_query | ||||||
|  |       Digest::SHA1.hexdigest(str) | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     def access_token | ||||||
|  |       # 7200s 有效时间 | ||||||
|  |       Rails.cache.fetch(access_token_cache_key, expires_in: 100.minutes) do | ||||||
|  |         result = request(:get, '/cgi-bin/token', appid: appid, secret: secret, grant_type: 'client_credential') | ||||||
|  |         result['access_token'] | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     def refresh_access_token | ||||||
|  |       Rails.cache.delete(access_token_cache_key) | ||||||
|  |       access_token | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     def jsapi_ticket | ||||||
|  |       # 7200s 有效时间 | ||||||
|  |       Rails.cache.fetch(jsapi_ticket_cache_key, expires_in: 100.minutes) do | ||||||
|  |         result = request(:get, '/cgi-bin/ticket/getticket', access_token: access_token, type: 'jsapi') | ||||||
|  |         result['ticket'] | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     def refresh_jsapi_ticket | ||||||
|  |       Rails.cache.delete(jsapi_ticket_cache_key) | ||||||
|  |       jsapi_ticket | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     def access_token_cache_key | ||||||
|  |       "#{base_cache_key}/access_token" | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     def jsapi_ticket_cache_key | ||||||
|  |       "#{base_cache_key}/jsapi_ticket" | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     def base_cache_key | ||||||
|  |       "wechat/#{appid}" | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     private | ||||||
|  | 
 | ||||||
|  |     def request(method, url, **params) | ||||||
|  |       Rails.logger.error("[wechat] request: #{method} #{url} #{params.inspect}") | ||||||
|  | 
 | ||||||
|  |       client = Faraday.new(url: BASE_SITE) | ||||||
|  |       response = client.public_send(method, url, params) | ||||||
|  |       result = JSON.parse(response.body) | ||||||
|  | 
 | ||||||
|  |       Rails.logger.error("[wechat] response:#{response.status} #{result.inspect}") | ||||||
|  | 
 | ||||||
|  |       if response.status != 200 | ||||||
|  |         raise Error, result.inspect | ||||||
|  |       end | ||||||
|  | 
 | ||||||
|  |       if result['errcode'].present? && result['errcode'].to_i.nonzero? | ||||||
|  |         raise Error, result.inspect | ||||||
|  |       end | ||||||
|  | 
 | ||||||
|  |       result | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
| @ -0,0 +1,16 @@ | |||||||
|  | wechat_config = {} | ||||||
|  | 
 | ||||||
|  | begin | ||||||
|  |   config = Rails.application.config_for(:configuration) | ||||||
|  |   wechat_config = config['wechat'] | ||||||
|  |   raise 'wechat config missing' if wechat_config.blank? | ||||||
|  | rescue => ex | ||||||
|  |   raise ex if Rails.env.production? | ||||||
|  | 
 | ||||||
|  |   puts %Q{\033[33m [warning] wechat config or configuration.yml missing, | ||||||
|  |            please add it or execute 'cp config/configuration.yml.example config/configuration.yml' \033[0m} | ||||||
|  |   wechat_config = {} | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | Util::Wechat.appid  = wechat_config['appid'] | ||||||
|  | Util::Wechat.secret = wechat_config['secret'] | ||||||
					Loading…
					
					
				
		Reference in new issue