package com.gszc.service; import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; import cn.binarywang.wx.miniapp.bean.WxMaUserInfo; import com.alibaba.fastjson.JSONObject; import com.gszc.conf.WxMaConfiguration; import com.gszc.entity.MiniUser; import com.gszc.mapper.MiniUserMapper; import me.chanjar.weixin.common.error.WxErrorException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.*; @Service @Transactional public class MiniAppService { final WxMaService wxService = WxMaConfiguration.getMaService("wxb39f114716ec3157"); @Autowired MiniUserMapper miniUserMapper; public MiniUser decryptUserInfo(String userId, String encryptedData, String iv, String signature, String rawData) { //todo sessionKeyId 查出 sessionKey String sessionKey = getSessionKey(userId); // if (!wxService.getUserService().checkUserInfo(sessionKey, rawData, signature)) { // throw new RuntimeException("用户信息校验不通过"); // } // 解密用户信息 WxMaUserInfo userInfo = wxService.getUserService().getUserInfo(sessionKey, encryptedData, iv); //todo 数据库insert or update String openId = userInfo.getOpenId(); // Example userExample = new Example(MiniUser.class); // Example.Criteria userExampleCriteria = userExample.createCriteria(); // userExampleCriteria.andEqualTo("openId",openId); Map columnMap = new HashMap<>(); columnMap.put("open_id", openId); List miniUsers = miniUserMapper.selectByMap(columnMap); MiniUser miniUser = miniUsers.get(0); miniUser.setSex(userInfo.getGender()); miniUser.setHeadImg(userInfo.getAvatarUrl()); miniUserMapper.updateById(miniUser); // oceanUser.setNickName(userInfo.getNickName()); // oceanUser.setSex(userInfo.getGender()); // oceanUser.setCity(userInfo.getCity()); // oceanUser.setProvince(userInfo.getProvince()); // oceanUser.setCountry(userInfo.getCountry()); // oceanUser.setImg(userInfo.getAvatarUrl()); // oceanUser.setUnionId(userInfo.getUnionId()); // oceanUserMapper.updateByExampleSelective(oceanUser,userExample); //openId = "oSlgh5f2gox-Pc0fgXNdtKhODdCU" //nickName = "白白白洺洺洺豪豪豪" //gender = "1" //language = "zh_CN" //city = "Baoshan" //province = "Shanghai" //country = "China" //avatarUrl = "https://wx.qlogo.cn/mmopen/vi_32/iaOkCNibLPS4fSh0N2Bc8yCfuMn3UicjUfT45SVNNCavjwB43JkF7bAEXq7vJJyOJcXPddeECjt1icFHzfC6boHt9g/132" //unionId = null miniUser.setSessionKey(null); miniUser.setOpenId(null); return miniUser; //todo 返回完整的user对象 里面的sessionKey和openid字段要remove掉再给前端 } public JSONObject isNewUser(String code) { WxMaJscode2SessionResult sessionInfo = null; try { sessionInfo = wxService.getUserService().getSessionInfo(code); } catch (WxErrorException e) { throw new RuntimeException("获取openid失败", e); } String sessionKey = sessionInfo.getSessionKey(); String openid = sessionInfo.getOpenid(); String unionid = sessionInfo.getUnionid(); //todo 根据openid去数据库查 该用户 存在 更新一下sessionkey字段 isNew=false sessionkeyid=xx 不存在放并把以上3个字段新建一个用户(外加生成sessionkeyid) 返回结果 isNew=true sessionkeyid=xx // Example userExample = new Example(OceanUser.class); // Example.Criteria userExampleCriteria = userExample.createCriteria(); // userExampleCriteria.andEqualTo("openId",openid); // // OceanUser oceanUser = oceanUserMapper.selectOneByExample(userExample); Map columnMap = new HashMap<>(); columnMap.put("open_id", openid); List miniUsers = miniUserMapper.selectByMap(columnMap); // MiniUser miniUser = miniUsers.get(0); JSONObject jsonObject = new JSONObject(); if(miniUsers.size()==0){ MiniUser miniUser = new MiniUser(); String id = UUID.randomUUID().toString(); miniUser.setId(id); miniUser.setSessionKey(sessionKey); miniUser.setOpenId(openid); miniUser.setCreateDate(new Date()); // oceanUser.setSessionKey(sessionKey); // oceanUser.setOpenId(openid); // oceanUser.setUnionId(unionid); // oceanUser.setSessionKeyId(id); miniUserMapper.insert(miniUser); jsonObject.put("isNew",true); jsonObject.put("userId",id); jsonObject.put("openId",openid); }else { MiniUser miniUser = miniUsers.get(0); miniUser.setSessionKey(sessionKey); // oceanUser.setSessionKey(sessionKey); miniUserMapper.updateById(miniUser);//是否是更新一个字段 // oceanUserMapper.updateByExampleSelective(oceanUser,userExample); jsonObject.put("isNew",false); jsonObject.put("userId",miniUser.getId()); jsonObject.put("openId",openid); } return jsonObject; } public MiniUser decryptPhoneNumber(String userId, String signature, String rawData, String encryptedData, String iv) { //todo sessionKeyId 查出 sessionKey String sessionKey = getSessionKey(userId); // 用户信息校验 if (!wxService.getUserService().checkUserInfo(sessionKey, rawData, signature)) { throw new RuntimeException("用户信息校验不通过"); } // 解密 WxMaPhoneNumberInfo phoneNoInfo = wxService.getUserService().getPhoneNoInfo(sessionKey, encryptedData, iv); //区号 String countryCode = phoneNoInfo.getCountryCode(); //不带区号的手机号 String purePhoneNumber = phoneNoInfo.getPurePhoneNumber(); //todo 根据sessionKeyId 去update补全用户的手机号 然后返回user对象 sessionKey remove掉 // Example userExample = new Example(OceanUser.class); // Example.Criteria userExampleCriteria = userExample.createCriteria(); // userExampleCriteria.andEqualTo("id",userId); // OceanUser oceanUser = oceanUserMapper.selectOneByExample(userExample); MiniUser miniUser = miniUserMapper.selectById(userId); miniUser.setAreaCode(countryCode); miniUser.setTelephone(purePhoneNumber); miniUserMapper.updateById(miniUser); // oceanUserMapper.updateByExampleSelective(oceanUser,userExample); miniUser.setSessionKey(null); miniUser.setOpenId(null); return miniUser; } private String getSessionKey(String userId){ MiniUser miniUser = miniUserMapper.selectById(userId); String sessionKey = miniUser.getSessionKey(); return sessionKey; } }