You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

169 lines
7.1 KiB
Java

6 years ago
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;
6 years ago
import org.springframework.transaction.annotation.Transactional;
6 years ago
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@Service
6 years ago
@Transactional
6 years ago
public class MiniAppService {
final WxMaService wxService = WxMaConfiguration.getMaService("wxb3f8c04dd0f5922f");
@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(LocalDateTime.now());
// 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;
}
}