From 70d58ccf85b7bdcb7b9aae2de8fceb17a041cc54 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Sat, 13 Aug 2016 15:24:52 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=81=A2=E5=A4=8D=E6=8E=88=E6=9D=83?= =?UTF-8?q?=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/mobile/apis/new_comment.rb | 22 +++++++++++- lib/wechat/lib/wechat/api.rb | 35 +++++++------------ lib/wechat/lib/wechat/api_base.rb | 2 +- .../lib/wechat/token/auth_access_token.rb | 33 +++++++++++++++++ public/javascripts/wechat/others/factory.js | 4 +-- 5 files changed, 69 insertions(+), 27 deletions(-) create mode 100644 lib/wechat/lib/wechat/token/auth_access_token.rb diff --git a/app/api/mobile/apis/new_comment.rb b/app/api/mobile/apis/new_comment.rb index 8d713d784..dbc471f0e 100644 --- a/app/api/mobile/apis/new_comment.rb +++ b/app/api/mobile/apis/new_comment.rb @@ -19,9 +19,29 @@ module Mobile raise "无法获取到openid,请在微信中打开本页面" unless openid us = UsersService.new - user = us.register ({:login=>openid, :mail=>"#{openid}@163.com", + access_token = session[:access_token] + refresh_token = session[:refresh_token] + + if access_token.present? && refresh_token.present? + refreshinfo = Wechat.api.web_refresh_access_token(refresh_token) + access_token = refreshinfo["access_token"] + refresh_token = refreshinfo["refresh_token"] + session[:access_token] = access_token + session[:refresh_token] = refresh_token + + #获取用户信息 + userinfo = Wechat.api.web_userinfo(access_token,openid) + Rails.logger.info "userinfo!!!!!!!!!" + Rails.logger.info userinfo + name = userinfo["nickname"] + else + name = openid[0..3]+"***"+openid.last + end + + user = us.register ({:login=>login, :mail=>login+"@163.com", :password=>"12345678", :password_confirmation=>"12345678", :should_confirmation_password => true}) + user.update_attributes(:lastname=>name) raise user.errors.full_messages.first if user.new_record? UserWechat.create!( diff --git a/lib/wechat/lib/wechat/api.rb b/lib/wechat/lib/wechat/api.rb index 7b754a07c..704af70b0 100644 --- a/lib/wechat/lib/wechat/api.rb +++ b/lib/wechat/lib/wechat/api.rb @@ -122,33 +122,22 @@ module Wechat get 'access_token', params: params, base: OAUTH2_BASE end - def web_refresh_access_token(refresh_token) + def web_auth_access_token(web_access_token, openid) + get 'auth', params: { access_token: web_access_token, openid: openid }, base: OAUTH2_BASE + end + + def web_refresh_access_token(user_refresh_token) params = { - appid: access_token.appid, - grant_type: 'refresh_token', - refresh_token: refresh_token + appid: access_token.appid, + grant_type: 'refresh_token', + refresh_token: user_refresh_token } - get 'refresh_token', params: params, base: OAUTH2_BASE + get 'oauth2/refresh_token', params: params, base: OAUTH2_BASE end - def web_userinfo(access_token,openid) - # params = { - # access_token: access_token, - # openid: openid, - # lang: "zh_CN" - # } - # - # # get 'https://api.weixin.qq.com/sns/userinfo',params: params - # get 'userinfo', params: params, base: OAUTH2_USERINFO - - require "open-uri" - #如果有GET请求参数直接写在URI地址中 - uri = 'https://api.weixin.qq.com/sns/userinfo?access_token='+access_token+'&openid='+openid+'&lang=zh_CN' - userinfo = nil - open(uri) do |http| - userinfo = JSON.parse(http.read) - end - userinfo + def web_userinfo(web_access_token, openid, lang = 'zh_CN') + get 'userinfo', params: { access_token: web_access_token, openid: openid, lang: lang }, base: OAUTH2_BASE end + end end diff --git a/lib/wechat/lib/wechat/api_base.rb b/lib/wechat/lib/wechat/api_base.rb index b873251f7..72b169829 100644 --- a/lib/wechat/lib/wechat/api_base.rb +++ b/lib/wechat/lib/wechat/api_base.rb @@ -1,6 +1,6 @@ module Wechat class ApiBase - attr_reader :access_token, :client, :jsapi_ticket + attr_reader :access_token, :client, :jsapi_ticket, :auth_access_token MP_BASE = 'https://mp.weixin.qq.com/cgi-bin/' diff --git a/lib/wechat/lib/wechat/token/auth_access_token.rb b/lib/wechat/lib/wechat/token/auth_access_token.rb new file mode 100644 index 000000000..811642dd7 --- /dev/null +++ b/lib/wechat/lib/wechat/token/auth_access_token.rb @@ -0,0 +1,33 @@ +require 'wechat/token/access_token_base' + +module Wechat + module Token + class AuthAccessToken + + def refresh + data = client.get('token', params: { grant_type: 'client_credential', appid: appid, secret: secret }) + write_token_to_file(data) + read_token_from_file + end + + def read_token_from_file + td = JSON.parse(CacheFile.read(token_file)) + @got_token_at = td.fetch('got_token_at').to_i + @token_life_in_seconds = td.fetch('expires_in').to_i + @access_token = td.fetch('access_token') + rescue JSON::ParserError, Errno::ENOENT, KeyError + refresh + end + + def write_token_to_file(token_hash) + token_hash.merge!('got_token_at'.freeze => Time.now.to_i) + CacheFile.write(token_file, token_hash.to_json) + end + + def remain_life_seconds + token_life_in_seconds - (Time.now.to_i - got_token_at) + end + end + end +end + diff --git a/public/javascripts/wechat/others/factory.js b/public/javascripts/wechat/others/factory.js index 3d66a649c..229c08a63 100644 --- a/public/javascripts/wechat/others/factory.js +++ b/public/javascripts/wechat/others/factory.js @@ -268,12 +268,12 @@ app.factory('common', ['$http', 'auth', '$routeParams','rms','config','wx','$loc var urlName = response.data.type_name + "_discussion"; link = "https://open.weixin.qq.com/connect/oauth2/authorize?appid="+window.g_appid + "&redirect_uri="+window.g_localhost+"/wechat/user_activities?id="+response.data.data.act_id+ - "&response_type=code&scope=snsapi_base&state="+urlName+"&connect_redirect=1#wechat_redirect"; + "&response_type=code&scope=snsapi_userinfo&state="+urlName+"&connect_redirect=1#wechat_redirect"; } else{ link = "https://open.weixin.qq.com/connect/oauth2/authorize?appid="+window.g_appid + "&redirect_uri="+window.g_localhost+"/wechat/user_activities?id="+response.data.data.act_id+ - "&response_type=code&scope=snsapi_base&state="+args.urlName+"&connect_redirect=1#wechat_redirect"; + "&response_type=code&scope=snsapi_userinfo&state="+args.urlName+"&connect_redirect=1#wechat_redirect"; } // if(args.urlName == "discussion"){ From 817fdad21d0b44fdba74134d4e984da2f9b12985 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Sat, 13 Aug 2016 16:24:37 +0800 Subject: [PATCH 2/2] . --- lib/wechat/lib/wechat/api.rb | 4 +-- .../lib/wechat/token/auth_access_token.rb | 34 ++++++------------- 2 files changed, 13 insertions(+), 25 deletions(-) diff --git a/lib/wechat/lib/wechat/api.rb b/lib/wechat/lib/wechat/api.rb index 704af70b0..f267f8b69 100644 --- a/lib/wechat/lib/wechat/api.rb +++ b/lib/wechat/lib/wechat/api.rb @@ -132,11 +132,11 @@ module Wechat grant_type: 'refresh_token', refresh_token: user_refresh_token } - get 'oauth2/refresh_token', params: params, base: OAUTH2_BASE + get 'refresh_token', params: params, base: OAUTH2_BASE end def web_userinfo(web_access_token, openid, lang = 'zh_CN') - get 'userinfo', params: { access_token: web_access_token, openid: openid, lang: lang }, base: OAUTH2_BASE + get 'userinfo', params: { access_token: web_access_token, openid: openid, lang: lang }, base: OAUTH2_USERINFO end end diff --git a/lib/wechat/lib/wechat/token/auth_access_token.rb b/lib/wechat/lib/wechat/token/auth_access_token.rb index 811642dd7..5b58e261c 100644 --- a/lib/wechat/lib/wechat/token/auth_access_token.rb +++ b/lib/wechat/lib/wechat/token/auth_access_token.rb @@ -2,31 +2,19 @@ require 'wechat/token/access_token_base' module Wechat module Token - class AuthAccessToken + class AuthAccessToken < AccessTokenBase - def refresh - data = client.get('token', params: { grant_type: 'client_credential', appid: appid, secret: secret }) - write_token_to_file(data) - read_token_from_file - end + # def refresh + # params = { + # appid: access_token.appid, + # grant_type: 'refresh_token', + # refresh_token: user_refresh_token + # } + # data = client.get 'oauth2/refresh_token', params: params, base: OAUTH2_BASE + # write_token_to_file(data) + # read_token_from_file + # end - def read_token_from_file - td = JSON.parse(CacheFile.read(token_file)) - @got_token_at = td.fetch('got_token_at').to_i - @token_life_in_seconds = td.fetch('expires_in').to_i - @access_token = td.fetch('access_token') - rescue JSON::ParserError, Errno::ENOENT, KeyError - refresh - end - - def write_token_to_file(token_hash) - token_hash.merge!('got_token_at'.freeze => Time.now.to_i) - CacheFile.write(token_file, token_hash.to_json) - end - - def remain_life_seconds - token_life_in_seconds - (Time.now.to_i - got_token_at) - end end end end