diff --git a/flossom-common/flossom-common-hzMapper/src/main/java/com/flossom/hzMapper/mapper/WxUserMemberMapper.java b/flossom-common/flossom-common-hzMapper/src/main/java/com/flossom/hzMapper/mapper/WxUserMemberMapper.java index b25a8eb..76d6665 100644 --- a/flossom-common/flossom-common-hzMapper/src/main/java/com/flossom/hzMapper/mapper/WxUserMemberMapper.java +++ b/flossom-common/flossom-common-hzMapper/src/main/java/com/flossom/hzMapper/mapper/WxUserMemberMapper.java @@ -70,4 +70,6 @@ public interface WxUserMemberMapper { public void insertTouristUser(WxUserMember wxUserMember); WxUserMember selectWxUserMemberByOpenId(@Param("openid") String openid); + + void upgradeMember(@Param("phoneNumber") String phoneNumber, @Param("id") String id); } diff --git a/flossom-common/flossom-common-hzMapper/src/main/resources/mapper/hzMapper/WxUserMemberMapper.xml b/flossom-common/flossom-common-hzMapper/src/main/resources/mapper/hzMapper/WxUserMemberMapper.xml index 7918765..0a26f22 100644 --- a/flossom-common/flossom-common-hzMapper/src/main/resources/mapper/hzMapper/WxUserMemberMapper.xml +++ b/flossom-common/flossom-common-hzMapper/src/main/resources/mapper/hzMapper/WxUserMemberMapper.xml @@ -182,6 +182,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where id = #{id} + + UPDATE `wx_user_member` + SET `user_type` = 2, + `level` = 1, + `mobile` = #{phoneNumber}, + `login_time` = sysdate(), + `update_time` = sysdate() + WHERE + `id` = #{id}; + + delete from wx_user_member where id = #{id} diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/controller/UserMemberController.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/controller/UserMemberController.java index 2c136d1..34bb9c3 100644 --- a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/controller/UserMemberController.java +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/controller/UserMemberController.java @@ -34,5 +34,15 @@ public class UserMemberController extends BaseController { return AjaxResult.success(wxUserMemberService.login(code, rawData, signature)); } - + /** + * 添加手机号,升级会员 + * 1、不再需要提前调用 wx.login 进行登录 + * 2、getPhoneNumber 返回的 code 与 wx.login 返回的 code 作用是不一样的 + * + * @param code + * @return + */ + public AjaxResult upgradeMember(@RequestParam(value = "code") String code) throws Exception { + return wxUserMemberService.upgradeMember(code); + } } diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/domain/vo/PhoneInfo.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/domain/vo/PhoneInfo.java new file mode 100644 index 0000000..3179923 --- /dev/null +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/domain/vo/PhoneInfo.java @@ -0,0 +1,41 @@ +package com.flossom.miniProgram.domain.vo; + +public class PhoneInfo { + + private String phoneNumber; + private String purePhoneNumber; + private String countryCode; + + public PhoneInfo() { + } + + public PhoneInfo(String phoneNumber, String purePhoneNumber, String countryCode) { + this.phoneNumber = phoneNumber; + this.purePhoneNumber = purePhoneNumber; + this.countryCode = countryCode; + } + + public String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + public String getPurePhoneNumber() { + return purePhoneNumber; + } + + public void setPurePhoneNumber(String purePhoneNumber) { + this.purePhoneNumber = purePhoneNumber; + } + + public String getCountryCode() { + return countryCode; + } + + public void setCountryCode(String countryCode) { + this.countryCode = countryCode; + } +} diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/domain/vo/WxCode2PhoneRet.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/domain/vo/WxCode2PhoneRet.java new file mode 100644 index 0000000..1262412 --- /dev/null +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/domain/vo/WxCode2PhoneRet.java @@ -0,0 +1,44 @@ +package com.flossom.miniProgram.domain.vo; + +/** + * 登录响应结果 + */ +public class WxCode2PhoneRet { + + private PhoneInfo phoneInfo; + private Integer errcode; + private String errmsg; + + public WxCode2PhoneRet() { + } + + public WxCode2PhoneRet(PhoneInfo phoneInfo, Integer errcode, String errmsg) { + this.phoneInfo = phoneInfo; + this.errcode = errcode; + this.errmsg = errmsg; + } + + public PhoneInfo getPhoneInfo() { + return phoneInfo; + } + + public void setPhoneInfo(PhoneInfo phoneInfo) { + this.phoneInfo = phoneInfo; + } + + public Integer getErrcode() { + return errcode; + } + + public void setErrcode(Integer errcode) { + this.errcode = errcode; + } + + public String getErrmsg() { + return errmsg; + } + + public void setErrmsg(String errmsg) { + this.errmsg = errmsg; + } +} diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/IWxUserMemberService.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/IWxUserMemberService.java index 24c512b..d190647 100644 --- a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/IWxUserMemberService.java +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/IWxUserMemberService.java @@ -1,5 +1,6 @@ package com.flossom.miniProgram.service; +import com.flossom.common.core.web.domain.AjaxResult; import com.flossom.hzMapper.domain.WxUserMember; import com.flossom.miniProgram.domain.vo.LoginUserVo; @@ -8,4 +9,6 @@ public interface IWxUserMemberService { LoginUserVo obtainUserMemberInfo(Long userNo); LoginUserVo login(String code, String rawData, String signature) throws Exception; + + AjaxResult upgradeMember(String code) throws Exception; } diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/impl/WxUserMemberServiceImpl.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/impl/WxUserMemberServiceImpl.java index 7d38637..12b2e9e 100644 --- a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/impl/WxUserMemberServiceImpl.java +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/impl/WxUserMemberServiceImpl.java @@ -8,9 +8,11 @@ import com.flossom.common.core.domain.R; import com.flossom.common.core.exception.ServiceException; import com.flossom.common.core.web.domain.AjaxResult; import com.flossom.common.redis.service.RedisService; +import com.flossom.common.security.utils.SecurityUtils; import com.flossom.hzMapper.domain.WxUserMember; import com.flossom.hzMapper.mapper.WxUserMemberMapper; import com.flossom.miniProgram.domain.vo.LoginUserVo; +import com.flossom.miniProgram.domain.vo.WxCode2PhoneRet; import com.flossom.miniProgram.domain.vo.WxCode2SessionRet; import com.flossom.miniProgram.service.IWxUserMemberService; import com.flossom.miniProgram.utils.MiniProgramUtils; @@ -19,6 +21,7 @@ import com.flossom.system.api.RemoteUserService; import com.flossom.system.api.domain.LoginBody; import com.flossom.system.api.domain.RegisterBody; import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; @@ -85,7 +88,7 @@ public class WxUserMemberServiceImpl implements IWxUserMemberService { public LoginUserVo login(String code, String rawData, String signature) throws Exception { // 1、使用临时凭证 code 获取 appi + appsecret + code WxCode2SessionRet wxCode2SessionRet = JSON.parseObject(MiniProgramUtils.getSessionKeyAndOpenId(code), WxCode2SessionRet.class); - if (0 != wxCode2SessionRet.getErrcode()) { + if (200 != wxCode2SessionRet.getErrcode()) { logger.error(wxCode2SessionRet.getErrmsg()); return null; } @@ -152,5 +155,22 @@ public class WxUserMemberServiceImpl implements IWxUserMemberService { return loginUserVo; } + @Override + public AjaxResult upgradeMember(String code) throws Exception { + WxCode2PhoneRet wxCode2PhoneRet = JSON.parseObject(MiniProgramUtils.getPhone(code), WxCode2PhoneRet.class); + if (wxCode2PhoneRet.getErrcode() != 200) { + logger.error("用户手机号码获取失败"); + return AjaxResult.error("手机号获取失败"); + } + String username = SecurityUtils.getLoginUser().getUsername(); + if (StringUtils.isBlank(username)) { + logger.error("获取用户信息失败"); + return AjaxResult.error("获取用户信息失败"); + } + String id = username.replace(UserConstants.WX_SYSTEM_USER_USERNAME, ""); + wxUserMemberMapper.upgradeMember(wxCode2PhoneRet.getPhoneInfo().getPhoneNumber(), id); + return AjaxResult.success(); + } + } diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/utils/MiniProgramUtils.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/utils/MiniProgramUtils.java index d035032..cdd222d 100644 --- a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/utils/MiniProgramUtils.java +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/utils/MiniProgramUtils.java @@ -12,32 +12,33 @@ public class MiniProgramUtils { private static final String WX_SECRET = ""; private static final String loginUrl = "https://api.weixin.qq.com/sns/jscode2session"; + private static final String getPhoneUrl = "https://api.weixin.qq.com/wxa/business/getuserphonenumber"; public static String getSessionKeyAndOpenId(String jsCode) throws Exception { return getSessionKeyAndOpenId(WX_APPID, WX_SECRET, jsCode, "authorization_code"); } /** - * 通过 code 去微信服务器换取 openid 和 session_key + * 通过 code 去微信服务器换取 openid 和 session_key + * * @param appid * @param secret * @param jsCode * @param grant_type - * - * 响应结果: + * @return

* { - * "openid":"xxxxxx", 用户唯一标识 - * "session_key":"xxxxx", 会话密钥 - * "unionid":"xxxxx", - * "errcode":0, 错误码 - * "errmsg":"xxxxx" + * "openid":"xxxxxx", 用户唯一标识 + * "session_key":"xxxxx", 会话密钥 + * "unionid":"xxxxx", + * "errcode":0, 错误码 + * "errmsg":"xxxxx" * } - * + *

* errcode : - * 40029 code 无效 js_code 无效 - * 45011 api minute-quota reach limit mustslower retry next minute API 调用太频繁,请稍候再试 - * 40226 code blocked 高风险等级用户,小程序登录拦截 。风险等级详见用户安全解方案 - * -1 system error 系统繁忙,此时请开发者稍候再试 + * 40029 code 无效 js_code 无效 + * 45011 api minute-quota reach limit mustslower retry next minute API 调用太频繁,请稍候再试 + * 40226 code blocked 高风险等级用户,小程序登录拦截 。风险等级详见用户安全解方案 + * -1 system error 系统繁忙,此时请开发者稍候再试 */ public static String getSessionKeyAndOpenId(String appid, String secret, String jsCode, String grant_type) throws Exception { Map params = new HashMap<>(); @@ -48,5 +49,22 @@ public class MiniProgramUtils { return HttpClientUtils.getParameters(loginUrl, params); } + /** + * @param code + * @return

+ * errcode number 错误码 + * errmsg string 错误信息 + * phone_info object 用户手机号信息 + * 属性 类型 说明 + * phoneNumber string 用户绑定的手机号(国外手机号会有区号) + * purePhoneNumber string 没有区号的手机号 + * countryCode string 区号 + */ + public static String getPhone(String code) throws Exception { + Map params = new HashMap(); + params.put("code", code); + return HttpClientUtils.postParameters(getPhoneUrl, params); + } + }