微信扫一扫登录

微信网站扫一扫登录

标签(空格分隔): wechat


科普微信授权原理

Created with Raphaël 2.1.2 微信用户 微信用户 第三方应用 第三方应用 微信开发平台 微信开发平台 第三方应用 第三方应用 微信开发平台 微信开发平台 请求登录第三方应用 请求oauth2授权 请求用户确认 用户确认 拉起第三方应用或重定向到第三方的服务器,并带上code 通过code加上appid appsecret获取access_token 返回用户相关信息

前端的打开方式

前端有两种打开方式

  • 通过重定向到微信的页面然后用户扫描二维码授权,再重定向回第三方网站
  • 通过js直接显示二维码登录,不用跳转微信页面

第一种方式是通过后台重定向过去的所以前端只需要写个链接就行了,第二种方式是在页面上直接显示二维码登录减少了跳页面的时间,这种方式需要在网页上用js实现,一般第二种用的比较多

使用js显示微信扫一扫二维码的打开方式

步骤1:在页面中先引入如下JS文件(支持https):

http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js

步骤2:在需要使用微信登录的地方实例以下JS对象:

var obj = new WxLogin({
     id:"login_container", // 需要显示的容器id
     appid: "",  // 公众号appid wx*******
     scope: "snsapi_login",  // 网页默认即可
     redirect_uri: "", // 授权成功后回调的url
     state: "", // 可设置为简单的随机数加session用来校验
     style: "black", // 提供"black"、"white"可选。二维码的样式
     href: "" // 外部css文件url,需要https
});

参数说明

参数 是否必须 说明
self_redirect true:手机点击确认登录后可以在 iframe 内跳转到 redirect_uri,false:手机点击确认登录后可以在 top window 跳转到 redirect_uri。默认为 false。
id 第三方页面显示二维码的容器id
appid 应用唯一标识,在微信开放平台提交应用审核通过后获得
scope 应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即可
redirect_uri 重定向地址,需要进行UrlEncode
state 用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验
style 提供”black”、”white”可选,默认为黑色文字描述
href 自定义样式链接,第三方可根据实际需求覆盖默认样式

用户点击确认授权后网页会自动跳转redirect_uri

后端的打开方式

重定向到微信页面的打开方式

登录你的网站应用
https://xxx.xxx.com/wechat/login.do
打开后需要重定向至微信的地址并带上必要的参数

https://open.weixin.qq.com/connect/qrconnect?
appid=wxbdc5610cc59c1631
&
redirect_uri=https%3A%2F%2Fxxx.xxx.com%2Fwechat%2Fcallback.do
&
response_type=code
&
scope=snsapi_login
&
state=3d6be0a4035d839573b04816624a415e#wechat_redirect

这里需要变的参数是appid和redirect_url

访问以上链接微信开发平台会重定向到redirect_uri的网址上,并且带上codestate参数,如果用户没有授权就不会有code参数,仅会带上state参数

后台根据code获取用户信息封装

获取用户信息的步骤

  • 通过code获取access_token
  • 通过access_token调用接口

这里使用了weixin-java-tools工具来获取用户信息
github地址 传送门

public WxMpUser getWxUser(String code) {
        if (code == null) {
            return null;
        }
        WxMpOAuth2AccessToken wxMpOAuth2AccessToken = null;
        WxMpUser wxMpUser = null;
        try {
            wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(code);
            wxMpOAuth2AccessToken = wxMpService.oauth2refreshAccessToken(wxMpOAuth2AccessToken.getRefreshToken());
            wxMpUser = wxMpService.oauth2getUserInfo(wxMpOAuth2AccessToken, null);
        } catch (WxErrorException e) {
            return null;
        }

        return wxMpUser;
    }

猜你喜欢

转载自blog.csdn.net/isyoungboy/article/details/81669844
今日推荐