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);
+ }
+
}