|
|
|
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<String, Object> columnMap = new HashMap<>();
|
|
|
|
columnMap.put("openId", openId);
|
|
|
|
List<MiniUser> 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<String, Object> columnMap = new HashMap<>();
|
|
|
|
columnMap.put("openId", openid);
|
|
|
|
List<MiniUser> miniUsers = miniUserMapper.selectByMap(columnMap);
|
|
|
|
MiniUser miniUser = miniUsers.get(0);
|
|
|
|
|
|
|
|
JSONObject jsonObject = new JSONObject();
|
|
|
|
|
|
|
|
if(null==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.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;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|