微信小程序> 图文详解微信小程序如何实现微信授权登录(Java后台)上

图文详解微信小程序如何实现微信授权登录(Java后台)上

浏览量:5997 时间: 来源:随机昵称_123456

详解微信小程序如何实现微信授权登录(Java后台+springboot框架),附关键源码

jar包依赖

 <!-- http请求工具包依赖 -->        <dependency>            <groupId>org.apache.httpcomponents</groupId>            <artifactId>httpclient</artifactId>            <version>4.5.2</version>        </dependency>        <!--jsonObject需要的jar包-->        <dependency>            <groupId>net.sf.json-lib</groupId>            <artifactId>json-lib</artifactId>            <version>2.4</version>            <classifier>jdk15</classifier>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-data-redis</artifactId>        </dependency>        <!--工具类wxutils所需-->        <dependency>            <groupId>org.bouncycastle</groupId>            <artifactId>bcprov-jdk15on</artifactId>            <version>1.59</version>        </dependency>        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->        <!--工具类wxutils的JSONObject.parseObject需要-->        <dependency>            <groupId>com.alibaba</groupId>            <artifactId>fastjson</artifactId>            <version>1.2.56</version>        </dependency>

wx.login

小程序
虽然微信的文档写的很清楚,但是遗憾的是,我看懂了也不会写。如果是前后端分离的还好一些,你只需要让前端在小程序的aap.js中发送一个wx.login()的请求。我们的个人信息都存在微信服务器上,所有需要先去服务器获取一个对应你账户信息的随机code,这个code就是后端可以从服务器换取sessionkey和openid的关键。

// 网上的请求案例    //请求code    wx.login({      success(res) {        if (res.code) {             //把获取到的code通过一个request的请求发给java服务器            wx.request({            url:你的url地址,            data: {              code: res.code            },              method: 'POST',            dataType: 'json',            success: function (res) {                //请求成功的处理            }        }      },      fail: function () {        console.log("发送code失败:", res.data);        }    })

使用code换取信息

//不多说,直接上代码 @RequestMapping("getSessionKey")    public ReturnData getSessionKey(@RequestParam("code")String code) {        ReturnData returnData = new ReturnData();        Map<String, Object> key = appletService.getSessionKey(code);        YxMember member = appletService.selectExist(key.get("openid").toString());        if(member!=null) {            returnData.setCode("1");            returnData.setData(member);        }        else{            //将用户的openid存入数据库            LogUtils.debug("存到缓存当中,key为: "+key.get("openid")+",value: "+key.get("session_key"));            redisTemplate.opsForValue().set(key.get("openid"),key.get("session_key"),3000,TimeUnit.MILLISECONDS);            returnData.setCode("0");            returnData.setData(key.get("openid").toString());        }        return returnData;

returndata是封装的结果类,不用在意。请注意,微信提到为了信息的安全,建议使用3rdsessionkey返回给前端,但是我这里偷懒,实际我也没用过,使用openid返回给前端。同时把openid和sessionkey放到redis,设置合理的过期时间,其它缓存也可以。需要注意的是,如果用户已经授权过,也就是登陆。我们可以在数据库的用户表中根据你设的关键字查询是否存在,我这里是openid,因为每个用户的openid是唯一的。存在,直接返回用户信息,不存在,缓存放好sessionkey,然后返回。我这里约定的是code,前端会判断,setCode为1会发送getUserInfo请求,为0不再请求。

//service代码public Map<String,Object> getSessionKey(String code) {        StringBuilder url = new StringBuilder("https://api.weixin.qq.com/sns/jscode2session?");        url.append("appid=");//appid设置        url.append("你的appid");        url.append("&secret=");//secret设置        url.append("你的secret");        url.append("&js_code=");//code设置        url.append(code);        url.append("&grant_type=authorization_code");        Map<String, Object> map = null;        try {            HttpClient client =HttpClientBuilder.create().build();//构建一个Client            HttpGet get = new HttpGet(url.toString());    //构建一个GET请求            HttpResponse response = client.execute(get);//提交GET请求            HttpEntity result = response.getEntity();//拿到返回的HttpResponse的"实体"            String content = EntityUtils.toString(result);            LogUtils.debug(content);//打印返回的信息            JSONObject res = JSONObject.fromObject(content);            map=JsonUtil.parseJSON2Map(res);        } catch (Exception e) {            e.printStackTrace();            LogUtils.debug("获取openid失败");        }        return map;

按照微信的提示,一步步拼接字符串,然后发送,返回值为json字符串,需要转为map取出。

{"session_key":"5R3z85tnz+iLS+GbdkjtEQ==","openid":"o2y8C5TK63lUNxgbEWn6o_aqM9E8"}

下面贴出第一个工具类

public class JsonUtil {    public static Map<String, Object> parseJSON2Map(JSONObject json) {        Map<String, Object> map = new HashMap<String, Object>();        // 最外层解析        for (Object k : json.keySet()) {            Object v = json.get(k);            // 如果内层还是数组的话,继续解析            if (v instanceof JSONArray) {                List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();                @SuppressWarnings("unchecked")                Iterator<JSONObject> it = ((JSONArray) v).iterator();                while (it.hasNext()) {                    JSONObject json2 = it.next();                    list.add(parseJSON2Map(json2));                }                map.put(k.toString(), list);            } else {                map.put(k.toString(), v);            }        }        return map;    }}

wx.getuserInfo

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: 小程序

带尺寸的图片: 小程序

居中的图片: 小程序

居中并且带尺寸的图片: 小程序

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted blockvar foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目Value
电脑$1600
手机$12
导管$1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPEASCIIHTML
Single backticks'Isn't this fun?'‘Isn’t this fun?’
Quotes"Isn't this fun?"“Isn’t this fun?”
Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to-HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。1

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ(n)=(n1)!nNGamma(n) = (n-1)!quadforallninmathbb N 是通过欧拉积分

Γ(z)=0tz1etdt&ThinSpace;.Gamma(z) = int_0^infty t^{z-1}e^{-t}dt,.

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎