网站应用实现微信扫码登录完整示例

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 网站应用实现微信扫码登录完整示例,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

阅读文档

https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html

微信参数配置

wx:
  open:
    app_id: wxedaaaaaaaa89b47
    app_secret: 23wxedaaaaaaaa89b475155
    redirect_url: http://localhost:8888/api/wx/callback
@Component
public class WxConfig implements InitializingBean {

    @Value("${wx.open.app_id}")
    private String appId;

    @Value("${wx.open.app_secret}")
    private String appSecret;

    @Value("${wx.open.redirect_url}")
    private String redirectUrl;

    public static String WX_OPEN_APP_ID;
    public static String WX_OPEN_APP_SECRET;
    public static String WX_OPEN_REDIRECT_URL;

    @Override
    public void afterPropertiesSet() {
        WX_OPEN_APP_ID = appId;
        WX_OPEN_APP_SECRET = appSecret;
        WX_OPEN_REDIRECT_URL = redirectUrl;
    }
}

生成二维码

1.跳转新窗口二维码登录

通过网站点击事件跳转新窗口二维码登录

https://open.weixin.qq.com/connect/qrconnect?appid=xxxxxx&redirect_uri=http%3A%2F%2Flocalhost%3A8888%2Fapi%2Fwx%2Fcallback&response_type=code&scope=snsapi_login&state=3d6be0a4035d839573b04816624a415e#wechat_redirect

2.网站内嵌二维码微信登录

<template>
  <div>
    <el-button @click="login">登录</el-button>

    <div id="weixinLogin" style="width: 200px;height: 200px"></div>
  </div>
</template>

<script>
import demoApi from "@/api/demodemoApi";

export default {
  data() {
    return {}
  },
  mounted() {
    const script = document.createElement('script')
    script.type = 'text/javascript'
    script.src = 'http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js'
    document.body.appendChild(script)
  },
  methods: {
    login() {
      demoApi.getLoginParam().then(response => {
        var obj = new WxLogin({
          self_redirect: true,
          id: 'weixinLogin',
          appid: response.data.appid,
          scope: response.data.scope,
          redirect_uri: response.data.redirect_uri,
          state: response.data.state,
          style: 'black',
          href: ''
        })
        console.log(obj)
      })
    }
  }
}
</script>

<style scoped>

</style>

demoApi.js

import request from '@/utils/request'
export default {
   getLoginParam() {
    return request({
      url: 'http://localhost:8888/api/wx/getLoginParam',
      method: 'get'
    })
  }
}

封装二维码参数接口

    @GetMapping("getLoginParam")
    @ResponseBody
    public Map<String, Object> genQrConnect() {
        try {
            Map<String, Object> map = new HashMap<>();
            map.put("appid", WxConfig.WX_OPEN_APP_ID);
            map.put("scope","snsapi_login");
            String wxOpenRedirectUrl = WxConfig.WX_OPEN_REDIRECT_URL;
            wxOpenRedirectUrl = URLEncoder.encode(wxOpenRedirectUrl, "utf-8");
            map.put("redirect_uri",wxOpenRedirectUrl);
            map.put("state",System.currentTimeMillis()+"");
            return map;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }
    }

微信回调接口

    @GetMapping("callback")
    public String callback(String code, String state) {
        //获取临时票据 code
        log.info("code:{}", code);

        // 组装获取accessToken的url
        String accessTokenUrl = getAccessTokenUrl(code);

        // httpclient请求获取accesstokenInfo
        try {
            String accesstokenInfo = HttpClientUtils.get(accessTokenUrl);
            log.info("accesstokenInfo:{}", accesstokenInfo);

            //从返回字符串获取两个值 openid和access_token
            JSONObject jsonObject = JSONObject.parseObject(accesstokenInfo);
            String access_token = jsonObject.getString("access_token");
            String openid = jsonObject.getString("openid");

            // TODO 根据openid判断数据库是否存在微信用户信息
            UserInfo userInfo = null;
            if (userInfo == null) {
                // httpclient请求获取用户信息
                String userInfoUrl = getUserInfoUrl(access_token, openid);
                String resultInfo = HttpClientUtils.get(userInfoUrl);
                log.info("resultInfo:{}", resultInfo);

                //解析用户信息
                JSONObject resultUserInfoJson = JSONObject.parseObject(resultInfo);
                //用户昵称
                String nickname = resultUserInfoJson.getString("nickname");
                //用户头像
                String headimgurl = resultUserInfoJson.getString("headimgurl");

                // TODO 微信用户信息保存数据库
            }

            // 数据库存在微信用户信息,生产Token信息后直接返回
            Map<String, String> map = new HashMap<>();
            map.put("name", "userName");
            map.put("token", "createTwtToken");

            //跳转前端页面
            return "redirect:" + "http://localhost:9528" + "/weixin/callback?token=" + map.get("token") + "&name=" + URLEncoder.encode(map.get("name"), "utf-8");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("httpclient请求出现异常。。。");
            return null;
        }
    }

    /**
     * 使用code、appid、appscrect换取access_token
     *
     * @param code
     * @return
     */
    private String getAccessTokenUrl(String code) {
        StringBuffer baseAccessTokenUrl = new StringBuffer()
                .append("https://api.weixin.qq.com/sns/oauth2/access_token")
                .append("?appid=%s")
                .append("&secret=%s")
                .append("&code=%s")
                .append("&grant_type=authorization_code");
        String accessTokenUrl = String.format(baseAccessTokenUrl.toString(),
                WxConfig.WX_OPEN_APP_ID,
                WxConfig.WX_OPEN_APP_SECRET,
                code);
        return accessTokenUrl;
    }

    /**
     * 通过openid和access_token得到用户信息
     *
     * @param access_token
     * @param openid
     * @return
     */
    private String getUserInfoUrl(String access_token, String openid) {
        String baseUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo" +
                "?access_token=%s" +
                "&openid=%s";
        String userInfoUrl = String.format(baseUserInfoUrl, access_token, openid);
        return userInfoUrl;
    }

回调返回页面

<template>
  <div>

  </div>
</template>

<script>

export default {
  data() {
    return {}
  },
  mounted() {
    let token = this.$route.query.token
    let name = this.$route.query.name
    this.loginCallback(token,name);
  },
  methods: { 	
    loginCallback(name, token) {
      console.log(name,token)
    },

  }
}
</script>

<style scoped>

</style>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/136999.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!