java微信 扣扣登录_转载微信小程序实现微信登录(Java后台)
作者:Aoess丶
原文:https://blog.csdn.net/yan245294305/article/details/84993265
这两天在自己的小项目中加入了微信小程序的很多功能,今天来说一下关于微信授权登录的部分。
需要的材料
1:一个可以测试的微信小程序
2:此微信小程序的APPID和APPscret
流程
微信用户对应一个小程序都有一个唯一的openid,微信授权登录,微信授权登录的核心就是获取这个openid并存在数据库作为用户存在的唯一标识。微信授权登录的流程大体分为两步
1.微信小程序前端获取code并发送到后台
在微信小程序的前端调用wx.login()获取一个code,这个code就像是我们去微信后台服务器获取用户信息的一个钥匙,微信通过获取这个code的过程给用户一个选择是否授权的选择,如果用户选择了授权就会返回一个code。这个code是一次性的,也是有时限的,代码如下。
//请求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);
}
})
2.后台接收code并通过code拉取用户的openid
后台接受了code以后通过建立一个http请求去访问微信后台服务器拉取这个用户的openid,如果一切正常就会得到这个用户对应这个小程序的openid和用户个人的Access_token(和微信小程序的Access_Token不一样)。
请求的地址:
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
通过GET方式访问,其中的参数分别是:
appid:小程序的appid
secret:小程序的appsecret
js:小程序前端传来的code
grant_type:这个不用修改,表示授权的类型
!-- http请求工具包依赖 --
dependency
groupIdorg.apache.httpcomponents/groupId
artifactIdhttpclient/artifactId
version4.5.2/version
/dependency
//获取openid
public static MapString, Object getWxUserOpenid(String code, String APPID, String APPSecret) {
//拼接url
StringBuilder url = new StringBuilder("https://api.weixin.qq.com/sns/jscode2session?");
url.append("appid=");//appid设置
url.append(APPID);
url.append("&secret=");//secret设置
url.append(APPSecret);
url.append("&js_code=");//code设置
url.append(code);
url.append("&grant_type=authorization_code");
MapString, 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);
System.out.println(content);//打印返回的信息
JSONObject res = JSONObject.fromObject(content);//把信息封装为json
//把信息封装到map
map = MdzwUtils.parseJSON2Map(res);//这个小工具的代码在下面
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
//json转map,这个小工具是我从网上找的,谢谢作者
public static MapString, Object parseJSON2Map(JSONObject json) {
MapString, Object map = new HashMapString, Object();
// 最外层解析
for (Object k : json.keySet()) {
Object v = json.get(k);
// 如果内层还是数组的话,继续解析
if (v instanceof JSONArray) {
ListMapString, Object list = new ArrayListMapString, Object();
@SuppressWarnings("unchecked")
IteratorJSONObject 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;
}
返回的数据
通过上面的代码,我们就可以拿到返回的数据转为的Map返回了。之后的逻辑代码我就不贴了,每个人的都不同,我说一下我的思路。这里我只用到了openid,在业务代码中从map中获取openid,如果成功获取就通过这个openid查询数据库,如果没有找到相应的记录,就说明这个用户第一次登录,我就为他创建一个新账户,并把账户的userid和这个openi做一个关联存到另外一张表中,为什么不把openid也存到账户的信息表中呢?把openid和用户信息分开保存,以后如果项目做平台移植时更方便。存完表之后把这个openid对应的账户标记为登录状态,然后把相应的用户信息和sessionid(或者token,根据你具体的实现方式)返回。
这就是用户微信第一次授权,相当于是一个注册的过程。
如果从Map中得到的openid已经在数据库中有记录的话,说明此用户已经注册过了,这时就把openid对应的用户信息和sessionid返回并把这个用户标记为登录状态就ok了。
这时用户微信非第一次授权,相当于一个登录的过程。
此次授权是是登录还是注册,我通过一个建立一个标识位给前端判断,前端如果通过这个标识位判断这次是注册,就继续通过wx.getUserInfo()方法拉取用户头像昵称等信息,然后通过修改用户信息的接口传到后端进行一个修改的操作。建议不要每次获取code之后就调用getUserInfo方法拉取信息然后一次性把code和用户信息传到后端,一来是用户如果进行的登录操作,微信个人信息时没有用的,增加了获取数据时间和传输时间。二是我们如果每次获取到用户信息就给他设置个人信息,这样就会覆盖用户之前的操作(比如用户之前已经修改一次头像,这时微信头像和小程序内部头像是不同的,然后用户重新登录了一下,两者的头像又一样了,这样是错误的),如果不想得到这样的结果就得再进行一次判断,增加了代码耦合度。所以登录注册应该只传code,用户的信息设置应该用另外一个接口。
最后
微信官方这方面的文档写的比较详细,链接:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html,只是我在做的时候也踩了不少坑,这次把微信授权登录的流程做了详细的记录,希望大家看了之后能少踩一些坑。本文也有很多不足之处,大家如果有意见和建议都可以提出来,谢谢大家。
---------------------
作者:Aoess丶
来源:CSDN
原文:https://blog.csdn.net/yan245294305/article/details/84993265
版权声明:本文为博主原创文章,转载请附上博文链接!
java微信 扣扣登录_转载微信小程序实现微信登录(Java后台)相关推荐
- 微信网页开发:微信内h5使用wx-open-launch-weapp打开小程序,微信内h5使用wx-open-launch-app打开App的方案
需求场景: 当我们需要使用在微信客户端打开的h5页面,在页面上打开微信小程序或者唤起App时,我们需要使用微信js-sdk提供的开放标签能力.这其中:使用wx-open-launch-weapp标签打 ...
- 【微信小程序】微信小程序的接口调入 获取太阳码 根据返回值的类型进行接收,微信接口可能直接返回图片,也可能返回一个错误信息的json,同时兼容处理这两种情况
目录 事件起因 环境和工具 操作过程 解决办法 遇到的一点问题 结束语 事件起因 在开发一个关于微信小程序的过程中,有一个这样的需求,要求生成微信小程序的太阳码,然而这个东西的请求方式我们是这样的:我 ...
- 微信公众平台、微信公众平台.小程序、微信.开放平台三者关系及unionid
以下内容,仅限于根据自己开发以及阅读微信文档总结,错误之处敬请指出,共同进步! 一.微信公众平台.微信公众平台.小程序.微信.开放平台登录地址 项目 微信公众平台 微信公众平台.小程序 微信.开放平台 ...
- access突然需要登录_早知道早好,微信小程序登录开发需要注意的事项
最近公司要做一个企业微信的小程序,方便企业内的成员来登录,以便一些公司内的业务,只限于公司内的成员来操作,因为有微信小程序的开发经验,所以先当作微信小程序来开发了! 首先来讲一下这个企业微信小程序与微 ...
- 微信小程序点击按钮弹出弹窗_转载 | 广东大学生就业创业微信小程序操作流程详解(一)...
广东大学生就业创业微信小程序 操作流程详解(一) 转眼来到10月,炎炎夏日也阻挡不了青春的忙碌,同学萌走出校园,迈向社会. 在这段时间,同学们不仅要准备毕业论文,应对毕业答辩,还需要兼顾各种毕业手续的 ...
- Java微信运动步数排序设计_微信小程序仿微信运动步数排行(交互)
本文介绍了微信小程序仿微信运动步数排行(交互),分享给大家,也给自己留个笔记,废话不多说了,具体如下: 效果图如下: wxml: {{item.name}} {{item.steps}} wxss: ...
- 【程序源代码】微信小程序商城管理系统(Java后台+微信小程序)最新版
关键字:微信小程序 商城系统 02 - [技术框架] 微信小程序商城管理系统(Java后台+微信小程序) 基于Spring+Vue+Mysql+Redis主流技术开发框架集成开发的微信商场管理系统:其 ...
- 微信小程序支付,带java源码
先说下这个的背景吧... 本人是做java后端的,自认为还有很大的发展空间(嘻嘻,你懂的),看过一段时间的小程序可是没有支付成功...最近公司要做小程序项目,老大让我看下小程序,折腾了好几天,参照着h ...
- 微信小程序如何实现登录注册带源码
前几天没事随手写了个小程序端的登录注册,现在分享给大家 一.登录微信前端 这是效果图与wxml代码 这是wxss代码 input{height: 100rpx; text-align: center; ...
- 使用微信小程序扫码登录系统PC端web的功能
1.项目说明: 项目PC端(vue单页面应用,前后端分离).移动端(微信小程序)共用同一Java Springboot服务.小程序可以直接获取微信手机号登录,不需要密码,因为系统黙认密码是随机的,因此 ...
最新文章
- php global 作用,PHP关键字global在定义变量中的作用_PHP教程
- redhat 5.6下网卡冗余实验
- MySQL与MongoDB的区别
- id 重启event_windows 2003 R2 系统自动重启了. event ID 6008
- Unity超基础学习笔记(二)
- and/or(||)的理解
- My third homework
- 点菜单项在面板中打开并判断是否打开
- 解读《百度网页质量白皮书》潜台词
- 挖洞手记——软媒魔方可信任程序执行漏洞
- 23.1 智能DNS
- 秒级去重:ClickHouse在腾讯海量游戏营销活动分析中的应用
- 用一台笔记本跑ROVIO
- 80老翁谈人生(314):别了,亲爱的CSDN读者朋友们!
- Redis中雪崩、击穿、穿透详解
- Caffeine - Caches - Eviction
- UIResponder事件处理 _Lenny Kwok
- pcs增加mysql资源_pcs命令配置示例
- php人民币函数,php人民币小写转大写的函数,不限长度,精确到分(推荐)
- 前端学习笔记(this)
热门文章
- 薅羊毛利器——青龙面板+ndjdc搭建脚本运行环境
- python做表格计算公式_python吊打Excel?那是你不会用!附赠N个Excel公式
- 蚂蚁森林自动收能量的最新脚本
- Ec/Io Eb是什么?
- [源码和文档分享]基于WIN32 API界面编程实现的彩球滑梯小游戏
- 最全Python培训课程,基础班+高级就业班+课件(数据分析、深度学习、爬虫、人工智能等) 精品课程
- [LOJ#10132]异象石
- 【附源码】Python计算机毕业设计面向智慧课堂的教学过程管理系统
- 总结本人学习b站黑马前端课程,各部分案例汇总
- 联想ThinkPad怎么进入bios