Skip to content
lanrion edited this page May 3, 2016 · 2 revisions

微信获取openid,主要是授权:oauth2。 场景是任何进入mobile页面,都获取openid,在使用 weixin_authorize 的基础下,我是这么干的:

application_controller.rb

class ApplicationController < ActionController::Base
  before_action :invoke_wx_auth
  before_action :get_wechat_sns, if: :is_wechat_brower?
 
  private
   # 调用微信授权获取openid
  def invoke_wx_auth
    if params[:state].present? || !is_wechat_brower? \
      || session['openid'].present? || session[:user_id].present? 
      return # 防止进入死循环授权
    end
    # 生成授权url,再进行跳转
    sns_url =  $wechat_client.authorize_url(request.url)
    redirect_to sns_url and return
  end

  # 在invoke_wx_auth中做了跳转之后,此方法截取
  def get_wechat_sns
    # params[:state] 这个参数是微信特定参数,所以可以以此来判断授权成功后微信回调。
    if session[:openid].blank? && params[:state].present?
      sns_info = $wechat_client.get_oauth_access_token(params[:code])
      Rails.logger.debug("Weixin oauth2 response: #{sns_info.result}")
      # 重复使用相同一个code调用时:
      if sns_info.result["errcode"] != "40029"
        session[:openid] = sns_info.result["openid"]
      end
    end
  end
end

这里只负责获取微信的openid,跟用户绑定,我的建议是用户在登录成功、注册功能后,都进行绑定。

Clone this wiki locally