微信开放平台实现扫码登录(java)

微信开放平台实现扫码登录(java)微信第三方登录准备阶段微信官方文档准备工作在进行第三方授权登录之前,需要在微信开放平台注册开发者账号,拿到相应的AppId和AppSecret以及redirect_uri,即可进行授权接入流程授权流程说明整体流程分:1.第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;2.通过code参数加上AppID和AppSecret等,通过API换取access_token;3.通过access_token进行接口调

大家好,又见面了,我是你们的朋友全栈君。

微信第三方登录准备阶段

微信官方文档

准备工作

在进行第三方授权登录之前,需要在微信开放平台注册开发者账号,拿到相应的AppId和AppSecret以及redirect_uri,即可进行授权接入流程

授权流程说明
在这里插入图片描述
整体流程分:

1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;
2. 通过code参数加上AppID和AppSecret等,通过API换取access_token;
3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

第一步:请求code
根据参数访问链接获取授权信息
用户允许授权后,将会重定向到redirect_uri的网址上,并且带上code和state参数;
若用户禁止授权,则重定向后不会带上code参数,仅会带上state参数
在这里插入图片描述

 String oauthUrl = "https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";
        String redirect_uri = URLEncoder.encode(WXConfig.CALLBACK, "utf-8");
        oauthUrl = oauthUrl.replace("APPID", WXConfig.PC_JSID).replace("REDIRECT_URI", redirect_uri).replace("SCOPE", WXConfig.SCOPE);
        model.addAttribute("oauthUrl", oauthUrl);
        model.addAttribute("appid", WXConfig.PC_JSID);
        model.addAttribute("scope", WXConfig.SCOPE);
        model.addAttribute("redirect_uri", redirect_uri);

前端通过回调链接生成二维码:
在这里插入图片描述
第二步:通过code获取access_tokeen

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

在这里插入图片描述
第三步:通过access_token调用接口
获取access_token后,进行接口调用,有以下前提:

1. access_token有效且未超时;
2. 微信用户已授权给第三方应用帐号相应接口作用域(scope)。

获取用户个人信息:

授权作用域(scope) 接口
snsapi_userinfo /sns/userinfo

参考代码:

 public Map<String, String> pcCode2Session(String js_code) throws UnsupportedEncodingException { 
   
        //1.通过code获取access_token
        String url = WXConstants.DOMAIN_API + WXConstants.OAUTH2_URL_SUFFIX
                + "?appid=" + WXConfig.PC_JSID + "&secret="
                + WXConfig.PC_JSSECRET + "&code="
                + js_code + "&grant_type=authorization_code";
        String result = restTemplate.getForObject(url, String.class);
        if (result != null && result.trim().length() != 0) { 
   
            JSONObject json = JSONObject.parseObject(result);
            Integer code = json.getInteger("errcode");
            if (code == null || code == WXConstants.SUCCESS) { 
   
                //获取access_token
                Map<String, String> map = new HashMap<>();
                map.put("access_token", json.getString("access_token"));
                map.put("expires_in", json.getString("expires_in"));
                map.put("refresh_token", json.getString("refresh_token"));
                map.put("openid", json.getString("openid"));
                map.put("scope", json.getString("scope"));
                map.put("unionid", json.getString("unionid"));
                //通过access_token和openid获取用户个人信息(头像、昵称)
                String url_user = WXConstants.DOMAIN_API + WXConstants.USERINFO_URL_SUFFIX
                        + "?access_token=" + json.getString("access_token") + "&openid="
                        + json.getString("openid");
                String result_user = restTemplate.getForObject(url_user, String.class);
                result_user = new String(result_user.getBytes("ISO-8859-1"), "UTF-8");
                System.out.println("--------result2="+result_user);
                if (result_user != null && result_user.trim().length() != 0) { 
   
                    JSONObject json_user = JSONObject.parseObject(result_user);
                    Integer code_user = json_user.getInteger("errcode");
                    System.out.println("======="+code_user);
                    if (code_user == null || code_user == WXConstants.SUCCESS) { 
   
                        //用户头像url
                        map.put("headimgurl", json_user.getString("headimgurl"));
                        //用户昵称
                        map.put("nickname", json_user.getString("nickname"));
                    }
                }
                return map;
            } else { 
   
                LOGGER.error("微信JSAPI请求失败:{}", result);
            }
        } else { 
   
            LOGGER.error("微信JSAPI请求失败:null");
        }
        return null;
    }

注:未调用刷新access_token有效期,因为项目中已经做了超时处理

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/131603.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 微信模拟地理位置_微信伪装地理位置是什么个原理「建议收藏」

    微信模拟地理位置_微信伪装地理位置是什么个原理「建议收藏」展开全部微信的定位数据来源主要有,基站定位、GPS定位。原理主体为:通过劫持代码关闭636f70793231313335323631343130323136353331333366306537从基站获取位置程序运行,伪造CELLID伪造WIFIMAC地址通过Xposed模块进行模拟地理位置、基站信息并上传伪装信息到微信客户端进行系统欺骗进而达到伪装地理位置的目的。扩展资料:微信定位功能实践上…

    2022年6月13日
    35
  • 交换机基础

    交换机基础

    2022年2月2日
    82
  • java实现tail -f 日志实时输出到页面

    java实现tail -f 日志实时输出到页面背景今天有点无聊,于是有了这个项目……解决了什么问题页面实时查看日志,省去了连接服务器再查找日志……效果talkischeap,showmethecodepom <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-sta…

    2022年5月27日
    156
  • C#学生成绩管理系统「建议收藏」

    C#学生成绩管理系统「建议收藏」##课设不用愁C#学生成绩管理系统>学生选课及成绩查询系统是一个学校不可缺少的部分,传统的人工管理档案的方式存在着很多的缺点,如:效率低、保密性差等,所以开发一套综合教务系统管理软件很有必要

    2022年7月3日
    33
  • 傅里叶变换公式整理,意义和定义,概念及推导

    傅里叶变换公式整理,意义和定义,概念及推导看到论坛有一个朋友提问为什么傅里叶变换可以将时域变为频域?这个问题真是问到了灵魂深处。在这我只能简单讲讲我的理解,要深刻理解翻信号处理教科书是最好的方法。1.如何描述信号我们常常用数学模型去抽象物理事件。信号也可以用数学模型来表示。有了信号的数学模型,我们就可以利用数学计算对信号模型做各种各样的改变。如果加以计算机,模电,数电的相关知识,我们就可以将我们对信号模型的改变转换为对物理信…

    2022年7月17日
    24
  • Fork/Join框架基本使用[通俗易懂]

    1.概述ava.util.concurrent.ForkJoinPool由Java大师DougLea主持编写,它可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出。本文中对Fork/Join框架的讲解,基于JDK1.8+中的Fork/Join框架实现,参考的Fork/Join框架主要源代码也基于JDK1.8+。这几篇文章将试图解释Fork/…

    2022年4月5日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号