Merge branch 'dev_aliyun' of https://bdgit.educoder.net/Hjqreturn/educoder into dev_aliyun
	
		
	
				
					
				
			
						commit
						ce2497ecbb
					
				| @ -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