微信小程序_Java后端登录(一)

微信小程序-Java后端做登录

  • 登录流程时序
    • 微信用户表设计
    • 登录态
      • 其他代码
      • maven版本
      • 总结

登录流程时序

微信小程序_Java后端登录(一)_第1张图片
微信小程序官方链接
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html

微信用户表设计

因为设计问题,现在只需要插入微信用户的信息即可。 userId和userLevel 可以后期手动插入,或者先解析用户信息,判断是哪个用户再插入你需要的userId和userLevel。
在这里插入图片描述

登录态

初步尝试使用业务用户和微信用户使用手动绑定方式。
第一次登录使用只插入微信id (openId),只有userId有的情况才会登录

@RequestMapping(value = "/login", produces = "application/json;charset=UTF-8")
	public Result login(HttpServletRequest request, HttpServletResponse response,@RequestBody WxUserInfo wxUserInfo) throws WxErrorException {
		Result result = null;
		if(StringUtils.isEmpty(wxUserInfo.getCode())) {
			result = ResultUtil.success("无效的code");
			return result;
		}else {
			final WxMaService wxService = getWxMaService();
			System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2,SSLv3");
			//存在有效的 code
			System.out.println("这里请求了一次code=" + wxUserInfo.getCode());
			//解析code获取用户基础信息
			WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(wxUserInfo.getCode());
			//获取openId和sessionKey
			String openId=session.getOpenid();
			String sessionKey = session.getSessionKey();
			System.out.println(openId);
			System.out.println(sessionKey);
			
			 //判断用户是否存在,不存在就插入微信id后对微信用户和业务用户进行绑定
	        UserWx userWx = userwxService.getWxId(openId);
	        if(userWx==null) {
	        	WxMaUserInfo userInfo=wxUserInfo.getUserInfo();
	        	String nickName=userInfo.getNickName();
	        	
	        	//以下有种其他方式自动绑定1.获取手机私密信息进行绑定用户。2.使用私密用户信息进行绑定用户
        		//解析电话信息(需授权)
		        //WxMaPhoneNumberInfo phoneNumberInfo=wxService.getUserService().getPhoneNoInfo(sessionKey, wxUserInfo.getPhoneEncryptedData(),wxUserInfo.getPhoneIv());
		        //String phoneNumber=phoneNumberInfo.getPurePhoneNumber();
        		
        		//解析用户信息(需授权)
			    //WxMaUserInfo userInfo =wxService.getUserService().getUserInfo(sessionKey, wxUserInfo.getEncryptedData(),wxUserInfo.getIv());
        		//String nickName=userInfo.getNickName();
		        
		        UserWx userWxEntity = new UserWx();		   
				userWxEntity.setUid(IdGenerator.uuid());
				userWxEntity.setWxId(openId);				
				userWxEntity.setWxNickName(nickName);				
				userWxEntity.setIsNewRecord(true);
				userwxService.save(userWxEntity);
				result = ResultUtil.success("请绑定用户");
	        }else {
	        	if(userWx.getUserId()!=null) {
	        		result = ResultUtil.success(userWx);
		        	System.out.println("登录成功");
	        	}else {
	        		result = ResultUtil.success("请绑定用户");
	        	}   	
	        }
	        //做自定义登录态(redis)
			//通过openId sessionKey 生成3rd session 返回给客户端小程序(微信有自己accessToken)此处可以自定义登录,因为设计问题,直接把用户信息传给前端做权限设计。
			//String accessToken = UUID.randomUUID().toString();
			//redisUtil.set(accessToken, userWx, 7000L);
	        return result;
	   }
	   
}

然后想用一下方式注入WxMaService ,发现注入失败(没解决,后期处理)

	@Autowired
	private WxMaService wxService;

以上方式失败,改为以下方式处理。

final WxMaService wxService = getWxMaService();

在login接口同类里面键以下代码,星号 * 省略的是小程序的appIdSecret 清自行获取!优先写在配置文件中。此处错误示范。

private WxMaService getWxMaService() {

		WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
		config.setAppid("wxb************94");
		config.setSecret("62b9*******************5bf");
		config.setMsgDataFormat("JSON");
		WxMaService wxMaService = new WxMaServiceImpl();
		wxMaService.setWxMaConfig(config);
		return wxMaService;
	}

其他代码

WxUserInfo实体类, WxMaUserInfo是wx自带的jar包,请在下方自行导入。

	private String code;
	
	private String signature;
	
	private String rawData;
	
	private String encryptedData;
	
	private String iv;

	private WxMaUserInfo userInfo;

Result 自己封装的输出格式 ,可以换成自己的。

maven版本

		<dependency>
			<groupId>com.github.binarywang</groupId>
			<artifactId>weixin-java-pay</artifactId>
			<version>3.6.0</version>
		</dependency>
		<dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-miniapp</artifactId>
            <version>3.6.0</version>
        </dependency>

总结

因为是第一次尝试,技术太水,全是坑! 前端的wx.login连点可能会造成session_key错位从而出现解析私密信息错误,json格式错误等。
记录下没搞清楚的问题:
1.SSL peer shut down incorrectly

SSL peer shut down incorrectly

在login接口中使用一下代码时候,就可以使用了。

System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2,SSLv3");

2.解析用户信息的时候出现一下问题。初步判断可能是session_key错位导致,解析出json数据是错的。因为某些原因没有深究。

expected BEGIN_OBJECT but was STRING at line 1 column 1 path $

你可能感兴趣的:(微信小程序,小程序,java)