笔者最近刚开始玩微信小程序,对其中的一些原理还不是很清楚,欢迎各位批评指正。

在网络中传输明文会存在一定的风险,因此想要与后台数据库结合,笔者认为不能直接调用微信认证的接口,并且将用户信息传递到后台,而应该先调用微信的方法获取加密的encrypedData、iv、code等,在后台将用户数据进行解析,并存入数据库。

总体的思路时,当启动小程序的时候,从微信服务器请求到加密数据以及code等,并携带这些数据向服务器发请求(是自己的服务器,不是微信服务器),服务器先根据code获取用户的openid(一个唯一标识,如果不清楚可以参考笔者的另外一篇文章: java实现微信登录)从缓存中查询是否有此用户对应的信息(openid),如果有则直接从缓存中将数据返回,如果没有则调用微信授权的接口,获取用户信息存入数据库和缓存,并将用户信息返回给小程序。

该项目后台为springboot+mybatisplus,下面是核心代码:

一、小程序启动的js

//app.js
App({onLaunch: function () {// 展示本地存储能力var logs = wx.getStorageSync('logs') || []logs.unshift(Date.now())wx.setStorageSync('logs', logs)},denglu: function () {var that = this;// 登录wx.login({success: res => {// 发送 res.code 到后台换取 openId, sessionKey, unionIdwx.getUserInfo({success: result => {// 获取用户信息wx.request({url: '/user/start',method: 'GET',data: {code: res.code,encryptedData: result.encryptedData,iv: result.iv},success: function (e) {//console.log(e.data.data);that.globalData.userInfo = e.data.data;if (this.userInfoReadyCallback) {this.userInfoReadyCallback(e.data.data);                }}})}})}})},globalData: {userInfo: null}
})

二、Controller层

    @GetMapping("/start")public BabyResult startApp(@RequestParam("encryptedData") String encrypted_data,@RequestParam("iv") String iv,@RequestParam("code") String code) {try {BabyResult result =  userService.startApp(encrypted_data, iv, code);return result;} catch (Exception e) {e.printStackTrace();return BabyResult.build(500, "启动错误");}}

三、Service层

    @Overridepublic BabyResult startApp(String encrypted_data, String iv, String code) {try {//获取session_keyString accessJson = this.getSessionKey(code);if ("".equals(accessJson)) {return BabyResult.build(401, "获取session_key失败");}JsonObject accessJsonObject = new JsonParser().parse(accessJson).getAsJsonObject();String openid = accessJsonObject.get("openid").getAsString();if(!userMap.containsKey(openid)) {/*** 第一次授权*///解析用户微信信息String session_key = accessJsonObject.get("session_key").getAsString();;String userWxInfoJson = WxDataUtil.DecryptDataGetUserInfoJson(encrypted_data, session_key, iv);if (null == userWxInfoJson || "".equals(userWxInfoJson)) {logger.debug("获取用户微信信息失败");return BabyResult.build(401, "获取用户微信信息失败");}//保存用户信息User user = this.saveUserInfo(userWxInfoJson, openid);//将用户信息放入缓存userMap.put(openid, user);//将用户信息返回给客户端return BabyResult.ok(user);} else {/*** 开启小程序,之前已经授权*/User user = (User) userMap.get(openid);return BabyResult.ok(user);}} catch (Exception e) {e.printStackTrace();logger.debug("拉取登录信息失败");return BabyResult.build(500, "拉取登录信息失败");}}

四、解密微信数据

public static String DecryptDataGetUserInfoJson(String encryptedData,String sessionkey,String iv){// 被加密的数据byte[] dataByte = Base64.decode(encryptedData);// 加密秘钥byte[] keyByte = Base64.decode(sessionkey);// 偏移量byte[] ivByte = Base64.decode(iv);try {// 如果密钥不足16位,那么就补足.  这个if 中的内容很重要int base = 16;if (keyByte.length % base != 0) {int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);byte[] temp = new byte[groups * base];Arrays.fill(temp, (byte) 0);System.arraycopy(keyByte, 0, temp, 0, keyByte.length);keyByte = temp;}// 初始化Security.addProvider(new BouncyCastleProvider());Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding","BC");SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");parameters.init(new IvParameterSpec(ivByte));cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化byte[] resultByte = cipher.doFinal(dataByte);if (null != resultByte && resultByte.length > 0) {String result = new String(resultByte, "UTF-8");return result;}} catch (Exception e) {e.printStackTrace();} return null;}

五、总结

微信程序现在比较火,但是微信开发工具还是有很多的bug。而且大部分都是用php做后台服务,笔者也用过,确实php开发比较简单,因为小程序毕竟不会像传统应用那样具有特别复杂的逻辑;笔者主要是做java开发,因此用java写了一套服务。其实,在这个webservice的时代,大家都遵循Restful风格的API,即使不同的编程语言,也都可以相互调用。

java结合微信小程序实现微信登录相关推荐

  1. 微信小程序获取手机号登录流程(个人开发者账号不支持)

    微信小程序获取手机号登录流程 所需条件 1. 非个人开发者账号 2. AppID+AppSecret 流程思路 **注意:** 代码实现 常见问题 所需条件 1. 非个人开发者账号 获取手机号文档 这 ...

  2. 微信登录 后台 java_Java 后端 (Spring boot)+微信小程序的授权登录

    微信小程序的授权登录 第一.Java后端代码如下 登录的接口的参数是微信小程序前端必须要传的参数微信小程序登录.授权的用户基本信息 wx.getUserInfo 特别注意 appid 和secret. ...

  3. 微信小程序获取用户手机号码,Java后台servlet解密(微信小程序调用微信支付也是大致的流程)

    本篇记录说明 微信小程序获取用户手机号码,Java后台servlet解密(微信小程序调用微信支付也是大致的流程,详细内容可私信交流) (第一次写博客,写得不好的地方见谅,面向新手,大佬请无视,不喜勿喷 ...

  4. 微信小程序如何进行登录授权和获取用户信息

    微信小程序如何进行登录授权和获取用户信息

  5. 微信小程序之授权登录--项目需要

    1.由于项目需要,需要实现自己的微信小程序 用微信授权登录. 2.参考此项目https://blog.csdn.net/weidong_y/article/details/79636386 3.其中的 ...

  6. 微信小程token_微信小程序开发之登录换取token

    本文将带你了解微信小程序开发之登录换取token,希望本文对大家学微信有所帮助 前言:这次主要是介绍些业务逻辑,技术点倒是没有多少.不过在开发中,优秀的编程思路同样是非常值得学习的. 最近小程序可以说 ...

  7. 小程序登录本地服务器,微信小程序实现用户登录模块服务器搭建

    我选用的是node.js来搭建服务器,没有安装的小伙伴可以参考我的node.js其他博客. 服务器安装与配置 初始化项目,将会自动创建package.json配置文件. npm init -y 安装E ...

  8. 微信小程序获取手机号登录流程

    微信小程序获取手机号登录流程 首先前端使用wx.login 获取code wx.login({success(res) {if (res.code) {that.setData({code: res. ...

  9. 微信小程序的详细登录(上)

    前段时间发布了一个微信小程序的简单登录,那段时间我一直在忙着项目,有一天,我清闲下来准备进入小程序群里面看一下来着,刚好有人问问题了,我一看这哥们的问题好像是我写的东西啊,我感觉是时候秀一波了,是时候 ...

  10. 微信小程序的安全登录

    一.微信小程序的安全登录 让用户登录,标识用户和获取用户信息,以用户为核心提供服务,是大部分小程序都会做的事情.我们今天就来了解下在小程序中,如何做用户登录,以及如何去维护这个登录后的会话(Sessi ...

最新文章

  1. WCF后传系列(5):深入WCF寻址Part 5—逻辑地址和物理地址
  2. SQL Server学习之路(五):“增删改查”之“改”
  3. SAAS平台的基本元素
  4. CentOS7 安装Mysql5.6 后启动失败处理 The server quit without updating PID file
  5. 第 4 章 MybatisPlus 条件构造器
  6. fjnuoj 1004 游戏 (博弈论)
  7. qt超强精美绘图控件 - QCustomPlot一览
  8. 设计者模式之GOF23命令模式
  9. 海力士固态测试软件,ACPI SSD2G 256GB性能测试
  10. Java 高级工程师面试题总结-参考答案(已拿Offer)
  11. 2.4g和5g要不要合并_路由器2.4g和5g要不要合并?
  12. 80x86段寻址的原因
  13. 复联4里的钢铁侠原型是谁?(剧透警告慎入)
  14. 单片机的串口实验 串口介绍 串口原理
  15. 软件分享系列之【AE 下载安装】并持续分享中...
  16. 思念博山——砸鱼汤 ^_^
  17. Indie Maker 一个人的创业
  18. php对比.net,.NET_ASP.NET比拼PHP的测试环境,ASP.NET与PHP速度对比 PHPChina资 - phpStudy...
  19. 石家庄方言de偏旁部首
  20. 中国剩余定理与线性同余方程组求解

热门文章

  1. 你是否违反了散户赖以战胜庄家的25条原则
  2. 把握新经济历史机遇,畅捷通为小微企业赋能
  3. ASEMI整流桥DB207的导通时间与参数选择
  4. 宇视大屏出现不规则闪烁故障排查方法
  5. 产品设计体会(4003)竞争对手分析
  6. 在VS2019中配置Boost C++、NumCpp、Eigen 和opencv4.3.0库环境
  7. 链游玩家:《动森》风靡世界,区块链游戏如何见贤思齐
  8. 巴甫洛夫条件反射的matlab程序
  9. 什么是长尾关键词?浅谈长尾关键词的作用
  10. Linux 捯饬环境