下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】java实现微信小程序登录态维护的方法
这篇文章主要介绍了java实现微信小程序登录态维护的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让在下带着大家一起了解一下。相信不少喜欢开发的朋友都已经知道微信小程序是个什么物种了,楼主也是从小程序内测期间就开始关注,并且也写过几个已经上线的微信小程序。但是基本上都是写的纯前端,最近楼主从后端到前端写一个完整的小程序项目,中间碰到了一些问题,楼主会找一些个人觉得有学习价值的点不定时的拿出来跟大家分享,希望对你有一些帮助。本次就从最基本的微信小程序登录态维护开始吧。小程序官方api文档里面有对登录态的一个完整的解释,并且有相关的代码。想看详情,可以出门右转:/debug/wxadoc/dev/api/api-login.html#wxloginobject我第一次看的时候没怎么看懂,并且代码没有提供java版本的,这让一个java程序员情何以堪,所以在努力研究了以后决定要做一个java版本的简单的demo放出来。作为服务端,如果想获得到使用微信小程序的会员信息,就需要小程序作为客户端把会员的基本信息传过来。类似于手机号,openId可以作为当前小程序中用户的唯一性标志。然而如果把会员的openId信息明文直接在服务端与小程序端来回传输的话,会有安全性的问题。万一被别人得到这个openId,就相当于得到会员的手机号一样,就可以做一些其他操作了,显然是不安全的。为了解决这一问题微信采用了相对安全的方式。//app.js
App({
onLaunch:
function()
{
wx.login({
success:
function(res)
{
if
(res.code)
{
//发起网络请求
wx.request({
url:
'/onLogin',
data:
{
code:
res.code
}
})
}
else
{
console.log('获取用户登录态失败!'
+
res.errMsg)
}
}
});
}
})微信小程序端会调用wx.login的api,然后会得到一个code,这个code对外人来讲是没有任何意义的,可以放心的传给服务端。服务端得到code以后,加上你申请小程序时的appId,appsecret,去调微信的接口/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code就可以得到以下参数:openid用户唯一标识session_key会话密钥unionid本字段在满足一定条件的情况下才返回其中openid就是会员的唯一性标记,此时服务端可以保存下来。session_key以后解密unionId(整个开放平台会员的唯一性标识)时有用。服务端得到openid以后,为了后边的交互,要保存下来。一般来讲有两种方式:一种是直接入数据库,一种是采用效率高一点的缓存。楼主采用的是后者,方式是redis。按照微信的建议此时需要生成一个不重复值作为openId的唯一性标识。这里采用的是java的uuid。然后把这个uuid值作为key,把openid以及后面会用到的session_key作为value,存进redis。并且把uuid值返回给小程序。这样小程序就可以直接拿uuid值跟服务端交互。也许会有人问,如果有人得到uuid值其实跟得到openid没什么区别啊,都相当于是会员的唯一性标志。所以这里要对这个uuid值进行一个处理。首先存入redis时要有时效性。session_key在微信服务器有效期是30天,建议服务端缓存session_key不超过30天。当小程序传过来的uuid值过期时,认为这是过期的uuid,则重新走wx.login步骤。为了方便redis中不仅会寸uuid与openid的对应关系。还会再存一条openid对应uuid的记录,目的是为了下一次重新wx.login步骤时根据openid找到之前老的uuid,如果存在的话就删掉,然后查询一条新的uuid值,并且把openid对应的这条记录也更新掉。这样redis服务器中就不会有多余的脏数据,减轻服务器的负担。以上就是我理解的整个登录态的过程,当然还有wx.checkSession这些没有讲到,其实就是发现session_key失效是再重新走一遍上述的流程就可以了。所以没有仔细说。不知道我有没有讲清楚。我会把整个流程的关键代码贴出来,供大家参考。@ActionKey("/loginByWeixin")
public
void
loginByWeixin()
throws
Exception
{
("Start
getSessionKey");
String
json
=
HttpKit.readData(getRequest());
JSONObject
reqJson
=
JSON.parseObject(json);
String
jsCode
=
reqJson.getString("code");
if
(jsCode
==
null
||
"".equals(jsCode))
{
("缺少必要参数");
renderJson(new
OutRoot().setCode("100").setMsg(SYS.PARAMETER_FAIL));
}
else
{
List<Record>
record
=
appInfoService.selectAppInfo();
String
appId
=
record.get(0).get("app_id");
String
appSecret
=
record.get(0).getStr("app_secret");
if
(appId
==
null
||
"".equals(appId)
||
appSecret
==
null
||
"".equals(appSecret))
{
("缺少必要参数");
renderJson(new
OutRoot().setCode("100").setMsg(SYS.PARAMETER_FAIL));
}
else
{
String
url
=
"/sns/jscode2session";
String
httpUrl
=
url
+
"?appid="
+
appId
+
"&secret="
+
appSecret
+
"&js_code="
+
jsCode
+
"&grant_type=authorization_code";
String
ret
=
HttpRequest.sendGetRequest(httpUrl);
("微信返回的结果
{}",
ret);
if
(ret
==
null
||
"".equals(ret))
{
("网络超时");
renderJson(new
OutRoot().setCode("101").setMsg(SYS.CONTACT_FAIL));
}
else
{
JSONObject
obj
=
JSONObject.parseObject(ret);
if
(obj.containsKey("errcode"))
{
String
errcode
=
obj.get("errcode").toString();
("微信返回的错误码{}",
errcode);
renderJson(new
OutRoot().setCode("101").setMsg(SYS.CONTACT_FAIL));
}
else
if
(obj.containsKey("session_key"))
{
("调微信成功");
//
开始处理userInfo
String
openId
=
obj.get("openid").toString();
Record
tbMember
=
new
Record();
tbMember.set("weixin_openid",
openId);
System.out.println("openId=="
+
openId);
//
先查询openId存在不存在,存在不入库,不存在就入库
List<Record>
memberList
=
tbMemberService.selectMember(tbMember);
if
(memberList
!=
null
&&
memberList.size()
>
0)
{
("openId已经存在,不需要插入");
}
else
{
JSONObject
rawDataJson
=
reqJson.getJSONObject("userInfo");
String
nickName
=
rawDataJson.getString("nickName");
String
avatarUrl
=
rawDataJson.getString("avatarUrl");
String
gender
=
rawDataJson.getString("gender");
String
province
=
rawDataJson.getString("province");
String
city
=
rawDataJson.getString("city");
String
country
=
rawDataJson.getString("country");
tbMember.set("gender",
gender);
tbMember.set("nick_name",
nickName);
tbMember.set("avatar_url",
avatarUrl);
Long
openId2
=
tbMemberService.addMember(tbMember);
("openId不存在,插入数据库");
}
//
(1)
获得sessionkey
String
sessionKey
=
obj.get("session_key").toString();
("sessionKey=="
+
sessionKey);
("openId=="
+
openId);
//
(2)
得到sessionkey以后存到缓存,key值采用不会重复的uuid
String
rsession
=
UUID.randomUUID().toString();
Cache
tokenCache
=
Redis.use("redis_00");
//
(3)
首先根据openId,取出来之前存的openId对应的sessionKey的值。
String
oldSeesionKey
=
tokenCache.getJedis().get(openId);
if
(oldSeesionKey
!=
null
&&
!"".equals(oldSeesionKey))
{
("oldSeesionKey=="
+
oldSeesionKey);
//
(4)
删除之前openId对应的缓存
tokenCache.getJedis().del(oldSeesionKey);
("老的openId删除以后=="
+
tokenCache.getJedis().get(oldSeesionKey));
}
//
(5)
开始缓存新的sessionKey:
key
-->
uuid,
value
-->
sessionObj
JSONObject
sessionObj
=
new
JSONObject();
sessionObj.put("openId",
openId);
sessionObj.put("sessionKey",
sessionKey);
tokenCache.getJedis().set(rsession,
sessionObj.toJSONString());
//
(6)
开始缓存新的o
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 刀具后角是指测试题
- 泥水平衡盾构机测试
- 药物与机体的对话-《药理学》智慧树知到答案2024年湖南中医药大学
- 安徽省安庆市桐城市实验中学办学集团校2024-2025学年七年级上学期9月月考数学试卷
- 合成材料中间体行业相关投资计划提议范本
- 浸酸剂相关项目投资计划书范本
- 医用中心吸引系统相关行业投资方案
- 仿真软件行业相关投资计划提议
- 专题12 易错易混集训:利用勾股定理求解易错压轴题四种模型全攻略(原卷版)
- 安徽省蚌埠市G5教育联盟2023-2024学年部编版八年级上学期12月份月考历史试卷
- 2024年房地产抵押借款合同参考模板(五篇)
- 辽宁省2024年中考数学试卷
- 1.2.3 相反数 课件 2024-2025学年七年级数学上册 (人教版2024)
- 《二十届三中全会》重要试题附答案
- 中国高血压防治指南(2024年修订版)核心要点解读
- Unit3Timeschange!Understandingideas教学设计2023-2024学年高二英语外研版(2019)选择性必修第二册
- 2024年【公路水运工程施工企业安全生产管理人员】考试试卷及答案
- 专业技术人员年度考核情况登记表
- 2024年汽车驾驶员(技师)考试题库附答案
- 数值分析知到章节答案智慧树2023年长安大学
- 《大学》完整拼音版
评论
0/150
提交评论