微信小程序及Java后台测试登录

文章目录

  • 微信小程序及Java后台测试登录
    • 一、使用的工具以及开发环境
    • 二、微信端登录代码。
      • 第一种方式,使用wx.getUserInfo直接获取微信头像,昵称。
      • 第二种方式:wx.login,
        • 详细的后台代码。
          • 注意
        • bcprov-jdk16.jar
        • weixin-java-miniapp.jar (建议使用 SpringBoot 开发)
          • SpringBoot 项目修改
          • 简单Web项目修改
          • 使用 过程中遇到的问题

一、使用的工具以及开发环境

  • 微信 · 客户端
  1. 微信开发者工具 v1.02.1901230
  2. 新建快捷项目
  • 后台 · 服务端
  1. SSM 框架 / SpringBoot +Mybatis
  2. JDK 1.8 、tomcat 9.0

二、微信端登录代码。

  • 查看快捷项目模板 app.js 文件中的有关登录的内容

第一种方式,使用wx.getUserInfo直接获取微信头像,昵称。

  • 小程序启动之后,在 app.js 定义的 App 实例的 onLaunch 回调会被执行。onLaunch 中的三个接口
  • wx.login 接口,第二种方法细讲。
  • wx.getSetting 接口

    也就是说,在调用这个接口的返回值是判断用户是否进行授权的。
    其中这个函数中有三个回调的方法。

    在回调方法中进行授权的判断
  • wx.getUserInfo 接口
    将获得以下的信息

第二种方式:wx.login,

  • 获取更多的信息的,如微信用户的openid。
  • 通过这种方式呢,首先要明确和第一种的区别,wx.login 是属于微信登录,而wx.getUserInfo属于获取用户的信息,前者方便后台处理逻辑,后者方便前台展示。

标准的登录步骤
1、小程序通过wx.login()接口从微信官方服务器获取用户code
注意:wx.login()接口是不会弹出授权窗口。
2、小程序把wx.login() 得到的code和AppId+AppSecret传给开发者服务器
注意:两种方式,2.1、微信端直接访问请求获取openid。2.2、后台访问请求获取openid
3、服务器经过一系列的处理,把seesion_key+open_id取出来,换成我们自定义的内容,譬如userid

  • 紧接着,确定我们后台要存储用户的那些信息,我是把用户的唯一主键与openid 结合起来使用的,这样减少一个字段,而且还能够确定登录用户的唯一性。
  • wx.login() 的两个属性值一个是code,一个是errMsg
  • AppId+AppSecret 需要登录微信公众平台的基本配置页显示,APPID是公开的,而开发者密码需要管理员手动操作。
说了这么多,还是不知道客户端怎么写的看这里。onLoad: function () {var that = this;// 查看是否授权wx.getSetting({success: function (res) {if (res.authSetting['scope.userInfo']) {wx.getUserInfo({  // 获取用户的信息success: function (res) {var userInfo = res;// 用户已经授权过,不需要显示授权页面,所以不需要改变 isHide 的值wx.login({  // 用户登录success: res => {console.log("用户的code:" + res.code);// 传给后台,再经过解析获取用户的 openidwx.request({url: 'http://localhost:8080/wx/wx/addUser',method: 'GET',data: {code: res.code,encryptedData: userInfo.encryptedData,iv: userInfo.iv},header: {'content-type': 'application/json'},success: function (res) {// this.globalData.userInfo = JSON.parse(res.data);console.log('测试后台响应内容')console.log(res)// wx.setStorageSync('openId', res.data.openId);},fail: res => {console.log('访问后台授权失败')},complete: function (res) {console.log('请求后台测试登录完成')}})}});}});} else {// 用户没有授权// 改变 isHide 的值,显示授权页面that.setData({isHide: true});}}});}
  • 上面代码中,有一处需要注意的是 wx.request的url,官方是这样说明的:
  • 为了使测试代码正常进行,进行如下操作:

详细的后台代码。

  • 搭建后台代码,设计存储数据数据库(除去存储微信用户的数据表,还要有业务处理表)
  • 客户端授权处理:只有授权的用户,才可以进行数据存储,以及业务处理。
  1. 先导包。大家可以在仓库找到最新的版本。
<!-- 小程序解析用户的详细信息 -->
<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk16</artifactId><version>1.46</version>
</dependency>
<!-- 小程序解析用户的详细信息 -->
或者是
<dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-miniapp</artifactId><version>3.3.4.B</version>
</dependency>
注意

weixin-java-miniapp.jar 包中已经封装好了获取微信信息的方法,只需要传递相应的参数即可。而且后台会自动导入前一个 jar 包。所以我们这里简单的介绍一下第二个 Jar 包的使用,主要使用的是第一个 Jar 包。

bcprov-jdk16.jar

  • 获取用户的唯一标识 openid
  • 解析用户信息,获取更多的用户信息

步骤总结:
1.首先,根据的用户的登录凭证code,判断用户登录。
2.根据小程序的 appid与secret,获取用户的 openid 与 session_key
3.根据 encryptedData、iv 以及得到的 session_key 获取更多的用户信息。

weixin-java-miniapp.jar (建议使用 SpringBoot 开发)



这个可就简单了,如下:

  • 在上面的步骤中,我们仅仅使用了 WxMaService,通过 @Configuration 和@Bean注入到了Spring容器中,通过@Autowire 注入到Controller中,但是我们需要的Appid与Secret 是没有加入到 WxMaService 中的,所以需要对上述内容进行修改。
SpringBoot 项目修改
  • @ConfigurationProperties(prefix = “wechat.wx”) 读取配置文件中的信息
// 编写一个 WechatMpProperties 负责读取配置信息
@Data
@ConfigurationProperties(prefix = "wechat.wx")
public class WxMaProperties {private List<Config> configs;@Datapublic static class Config {/*** 设置微信小程序的appid*/private String appid;/*** 设置微信小程序的Secret*/private String secret;/*** 设置微信小程序消息服务器配置的token*/private String token;/*** 设置微信小程序消息服务器配置的EncodingAESKey*/private String aesKey;/*** 消息格式,XML或者JSON*/private String msgDataFormat;}
}
  • 接着编写 WechatMpConfiguration 配置类,WxMaService 等配置。
// 配置 WxMaService
// 配置 WxMaConfigStorage     配置将存储获取到的 WechatMpProperties  参数信息。
// 配置 WxMaMessageRouter  消息路由设置:分为模板、图片、文本、二维码。
@Component
public class WxMpServiceFactory {private static WxMaService wxMaService;private static WxMaInMemoryConfig wxMaConfigStorage;private static WxMaMessageRouter router = new WxMaMessageRouter(getInstance());private WxMpServiceFactory() {}// 产生WxmaService实例@Beanpublic static WxMaService getInstance() {if(wxMaConfigStorage == null){wxMaConfigStorage = new WxMaInMemoryConfig();wxMaConfigStorage.setAppid(WXMPConfig.APPID);wxMaConfigStorage.setSecret(WXMPConfig.APPSECRET);wxMaConfigStorage.setToken(WXMPConfig.TOKEN);wxMaConfigStorage.setAesKey(WXMPConfig.ENCODINGAESKEY);wxMaConfigStorage.setMsgDataFormat(WXMPConfig.MSGDATAFORMAT);}if (wxMaService == null) {wxMaService = new WxMaServiceImpl();wxMaService.setWxMaConfig(wxMaConfigStorage);}return wxMaService;}public static WxMaInMemoryConfig getWxMaConfigStorage() {return wxMaConfigStorage;}public static void setWxMaConfigStorage(WxMaInMemoryConfig wxMpConfigStorage) {WxMpServiceFactory.wxMaConfigStorage = wxMpConfigStorage;}public static void setInstance(WxMaService wxMaService) {WxMpServiceFactory.wxMaService = wxMaService;}public static WxMaMessageRouter getRouter() {return router;}public static void setRouter(WxMaMessageRouter router) {WxMpServiceFactory.router = router;}
}
  • @RequestBody 与 @ResponseBody 中返回的 JSON设置
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
/*** @author RobertChao*/
public class JsonUtils {private static final ObjectMapper JSON = new ObjectMapper();static {JSON.setSerializationInclusion(Include.NON_NULL);JSON.configure(SerializationFeature.INDENT_OUTPUT, Boolean.TRUE);}public static String toJson(Object obj) {try {return JSON.writeValueAsString(obj);} catch (JsonProcessingException e) {e.printStackTrace();}return null;}
}调用  : return JsonUtils.toJson(session);
简单Web项目修改
  1. 使用工厂的方式,将内容加到Spring的Bean 中。

  2. 直接使用工厂中的变量
使用 过程中遇到的问题
  • 问题一,工厂中加载 WxMaService 的属性内容的时候要求 httpclient 版本在 4.4 以上。
  • 报了一个错误为java.lang.NoClassDefFoundError: org/apache/http/ssl/TrustStrategy,
    TrustStrategy这个类找不到。
    经查看这个TrustStrategy位于org.apache.http.ssl.TrustStrategy包属于httpcore-4.4.jar包底下,或者更高版本底下,而4.4以下的版本并没有这个类,所以产生这个错误的原因就是项目底下引用了低版本的httpcore的jar包,而这个httpcore的jar包又是跟httpclient的jar包相关联的,所以httpclient的jar包也要用较高版本。
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpcore</artifactId><version>4.4.3</version>
</dependency>
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.1</version>
</dependency>
  • 问题二:wxMaService.getUserService().getUserInfo(sessionKey, encryptedData, iv);请求用户身份的详细资源的时,对 json 格式的要求比较严格。认真书写 Json 内容,对待每一处 格式要求。

  • 问题三:暂未解决,希望有大神看到能帮助。


    代码中会调用WxMpServiceImpl.initHttp()方法,IdleConnectionMonitorThread线程(IdleConnectionMonitorThread类)负责监控httpclient中的连接,进行清理操作。
    暂时没有解决日志出现这个的问题。

评论留下联系方式,发源码。

微信小程序及Java后台测试登录相关推荐

  1. 微信小程序与Java后台的通信

    一.写在前面 最近接触了小程序的开发,后端选择Java,因为小程序的代码运行在腾讯的服务器上,而我们自己编写的Java代码运行在我们自己部署的服务器上,所以一开始不是很明白小程序如何与后台进行通信的, ...

  2. Java小程序post如何传参,微信小程序向Java后台传输参数的方法实现

    微信小程序向Java后台传输参数的方法实现 首先,微信小程序我使用的是微信web开发者工具 想要向后台传输数据,需要在js中写 在微信小程序的官方文档中可以看到一个api叫wx.request它的作用 ...

  3. 《微信小程序》微信小程序用java后台连接数据库进行操作。

    微信小程序与Java后台的通信 一.写在前面 最近接触了小程序的开发,后端选择Java,因为小程序的代码运行在腾讯的服务器上,而我们自己编写的Java代码运行在我们自己部署的服务器上,所以一开始不是很 ...

  4. 微信小程序结合Java后端实现登录注册

    微信小程序登录 微信用户,授权信息,相关实体类 微信用户表 实体类 获取微信的token 常量抽取 httpClient工具,用于发送请求获取token nbplus pom 工具类 请求微信后台,获 ...

  5. 微信小程序在java后台获取用户unionid等敏感信息

    最近在弄小程序,阅读了微信官方文档,上面说可以在后台获取用户的openid和unionid这些敏感信息,当然网上也有不少帖子,有的是在前台获取的,不过这里不太建议把这些敏感信息放在前台,毕竟不太安全. ...

  6. 微信小程序和Java后台连接,进行数据交互

    小程序端和后台进行连接,并且向后台传递数据,同时接收后台传递回来的数据.基于idea.Java后台. 步骤一:创建一个Spring-boot项目: 步骤二:写Controller(后台,基于SSM): ...

  7. 微信小程序——利用java后台解析Excel文件的数据

    后台为java,ssm框架 1.在SpringMvc.xml文件中增加Spring文件上传的解析器 <bean id="multipartResolver"class=&qu ...

  8. 微信小程序商城 java后台

    微信小程序学习 最近工作正好有闲暇时间,根据公司安排先前期学习调研一下"微信小程序",以供后期解决相关的运营需求,而本篇文章就是我对此次学习的一次总结. 什么是小程序 ? 如何全面 ...

  9. 关于微信小程序与Java后台交互数据中中文乱码问题的讨论

    小程序端请求参数中含有中文 如果小程序端发起的请求参数中含有中文,直接发送到后台会显示乱码,需要在header中设置UTF-8编码 wx.request({url: app.globalData.se ...

最新文章

  1. Jquery获取选中行的某个数据
  2. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛 L-回旋星空
  3. 95 后大学生利用漏洞免费吃肯德基获刑
  4. ClassLoader.getSystemResourceAsStream()
  5. vue cli3.3 以上版本配置vue.config.js 及反向代理操作解决跨域操作
  6. UA MATH564 概率论VI 数理统计基础3 卡方分布中
  7. python codecs模块(用于执行编码转换之类的)
  8. 个人成长:2021年7月记
  9. Elasticsearch——分词器对String的作用
  10. 在Amazon EMR上运行Hadoop MapReduce作业
  11. SQL必知必会-联结
  12. 华为Mate40 Pro渲染图曝光:刘海和瀑布屏一起消失
  13. MFC函数——CWnd::OnCreate
  14. 光储直柔配电系统浅析
  15. MDC300上激光雷达的接入
  16. 前端 psd切片生成html.css,1个将PSD网页模板切片输出为DIV+CSS架构网页教程
  17. 64位计算机可以装32位的系统么,电脑是要装32位还是64位系统?
  18. activiti 获取审批人员_Activiti审批汇总流程
  19. DNS服务器解析问题
  20. 做shopify收款方式有哪些

热门文章

  1. eclipse代码规范检测插件
  2. Java春招面试题之Java语言基础类
  3. ChatGPT提示语编写指南
  4. 宝塔添加站点 端口不合法【解决】
  5. 5G下CDN技术与产业发展变化,将会如何引领时代发展?
  6. 设备管理器点击操作时只有帮助选项
  7. vue-loader/vue-cli/vuex
  8. 长时间待机的监控摄像机可以持续多久
  9. MathType添加向下、向上取整符号
  10. 视频编码单元的历史、一些玩法和思考