新增 微信第三方平台 微信一键登录接口

This commit is contained in:
Lemon
2023-08-03 16:45:50 +08:00
parent 9bd72a58d0
commit 8f8fe6694a
4 changed files with 129 additions and 7 deletions

View File

@@ -1,11 +1,13 @@
package com.jsowell.api.uniapp;
import com.alibaba.fastjson2.JSONObject;
import com.google.common.collect.ImmutableMap;
import com.jsowell.common.annotation.Anonymous;
import com.jsowell.common.core.controller.BaseController;
import com.jsowell.common.response.RestApiResponse;
import com.jsowell.pile.domain.AuthorizationEventResult;
import com.jsowell.pile.domain.agentDev.CategoryInfo;
import com.jsowell.pile.dto.WechatLoginDTO;
import com.jsowell.pile.dto.agentDev.*;
import com.jsowell.pile.vo.agentDev.AuthInfoVO;
import com.jsowell.service.AgentDevService;
@@ -298,4 +300,23 @@ public class AgentDevController extends BaseController {
return response;
}
/**
* 微信一键登录
* @param dto
* @return
*/
@PostMapping("/wechatLogin")
public RestApiResponse<?> wechatLogin(@RequestBody AgentWechatLoginDTO dto) {
logger.info("第三方平台微信一键登录 params:{}", JSONObject.toJSONString(dto));
RestApiResponse<?> response = null;
try {
String memberToken = agentDevService.wechatLogin(dto);
response = new RestApiResponse<>(ImmutableMap.of("memberToken", memberToken));
} catch (Exception e) {
logger.error("第三方平台微信一键登录 error, ", e);
response = new RestApiResponse<>(e);
}
logger.info("第三方平台微信一键登录 result:{}", response);
return response;
}
}

View File

@@ -14,7 +14,9 @@ import com.jsowell.common.util.wxplatform.WXXmlToMapUtil;
import com.jsowell.pile.domain.agentDev.AuditItem;
import com.jsowell.pile.domain.agentDev.CategoryInfo;
import com.jsowell.pile.domain.agentDev.UserInfoSetting;
import com.jsowell.pile.dto.WechatLoginDTO;
import com.jsowell.pile.dto.agentDev.*;
import com.jsowell.pile.service.IPileMerchantInfoService;
import com.jsowell.pile.vo.agentDev.AuthInfoVO;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
@@ -40,9 +42,15 @@ import java.util.concurrent.TimeUnit;
public class AgentDevService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private MemberService memberService;
@Autowired
private RedisCache redisCache;
@Autowired
private IPileMerchantInfoService pileMerchantInfoService;
/**
* 第三方平台 appid
*/
@@ -572,11 +580,11 @@ public class AgentDevService {
String authorizerAppid = authInfo.getAuthorizerAppid();
// 先查询 redis 看有没有
String redisKey = CacheConstants.COMPONENT_AUTHORIZATION_CODE + authorizerAppid;
String redisAuthCode = redisCache.getCacheObject(redisKey);
if (StringUtils.isNotBlank(redisAuthCode)) {
// 有,先删除
redisCache.deleteObject(redisKey);
}
// String redisAuthCode = redisCache.getCacheObject(redisKey);
// if (StringUtils.isNotBlank(redisAuthCode)) {
// // 有,先删除
// redisCache.deleteObject(redisKey);
// }
// 删除预缓存码
String preAuthCodeKey = CacheConstants.PLATFORM_PRE_AUTH_CODE + authorizerAppid;
redisCache.deleteObject(preAuthCodeKey);
@@ -611,4 +619,66 @@ public class AgentDevService {
return resultJson.getString("errmsg");
}
/**
* 微信一键登录
* @param dto
*/
public String wechatLogin(AgentWechatLoginDTO dto) {
String appId = dto.getAppId();
// 获取用户接口调用令牌
String authAccessToken = getAuthAccessToken(appId);
// 获取手机号
String phoneNumber = getPhoneNumberByCode(dto.getPhoneNumberCode(), authAccessToken);
// 获取openId
String openId = getOpenIdByCode(dto.getOpenIdCode(), appId);
// 通过 appid 查询 merchantId
String merchantId = pileMerchantInfoService.getMerchantIdByAppId(appId);
logger.info("微信一键登录 获取merchantId:{}", merchantId);
// 下面方法有判断 merchantId 是否为空,因此可直接传值
return memberService.memberRegisterAndLogin(phoneNumber, merchantId, openId);
}
/**
* 根据 code 获取登录用户手机号
* @param code
* @param authAccessToken
* @return
*/
private String getPhoneNumberByCode(String code, String authAccessToken) {
String url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + authAccessToken;
JSONObject jsonObject = new JSONObject();
jsonObject.put("code", code);
String result = HttpUtils.sendPost(url, JSONObject.toJSONString(jsonObject));
// 将返回值转成 json 对象
JSONObject resultJson = JSONObject.parseObject(result);
Integer errCode = resultJson.getInteger("errcode");
if (errCode == Constants.zero) {
return JSONObject.parseObject(resultJson.getString("phone_info")).getString("phoneNumber");
}
return resultJson.getString("errmsg");
}
/**
* 通过 code 获取 openid
* @param openIdCode
* @param appId
* @return
*/
private String getOpenIdByCode(String openIdCode, String appId) {
GetComponentTokenDTO dto = GetComponentTokenDTO.builder()
.appId(PLATFORM_APP_ID)
.appSecret(PLATFORM_APP_SECRET)
.build();
String componentToken = getComponentToken(dto);
String url = "https://api.weixin.qq.com/sns/component/jscode2session?appid=" + appId
+ "&js_code=" + openIdCode + "&grant_type=authorization_code&component_appid=" + PLATFORM_APP_ID + "&component_access_token=" + componentToken;
String result = HttpUtils.sendGet(url);
JSONObject resultJson = JSONObject.parseObject(result);
return resultJson.getString("openid");
}
}

View File

@@ -129,7 +129,7 @@ public class MemberService {
* @param merchantId 商户id
* @return token返给前端
*/
private String memberRegisterAndLogin(String phoneNumber, String merchantId, String openId) {
protected String memberRegisterAndLogin(String phoneNumber, String merchantId, String openId) {
if (StringUtils.isBlank(phoneNumber)) {
throw new BusinessException(ReturnCodeEnum.CODE_GET_MOBILE_NUMBER_BY_CODE_ERROR);
}
@@ -146,7 +146,9 @@ public class MemberService {
memberBasicInfo.setMemberId(memberId);
memberBasicInfo.setNickName("会员" + memberId);
memberBasicInfo.setMobileNumber(phoneNumber);
// memberBasicInfo.setMerchantId(Long.valueOf(merchantId));
if (StringUtils.isNotBlank(merchantId)) {
memberBasicInfo.setMerchantId(Long.valueOf(merchantId));
}
memberBasicInfo.setOpenId(openId);
// 首次新建会员,同时新建会员钱包