fix: 微信绑定账号

main
wx-jincw 3 weeks ago
parent 715920c256
commit ddf7b9fbc7

@ -90,6 +90,15 @@ export function getUserPhone(data){
return request.post('wechat/register/binding/phone',data,{noAuth : true});
}
/**
* 小程序微信绑定已有账号账号+密码
* 关闭强制获取手机号时使用将微信 openId 关联到已有账号
* @param {Object} data { account, password, key }
*/
export function bindRoutineAccount(data) {
return request.post('wechat/register/binding/account', data, { noAuth: true });
}
/**
* APP微信登录
* @param {Object} data

@ -38,5 +38,12 @@ module.exports = {
// 缓存时间 0 永久
EXPIRE:0,
//分页最多显示条数
LIMIT: 10
LIMIT: 10,
/**
* 小程序微信登录新用户是否强制获取手机号
* true=开启弹出微信手机号授权 register/binding/phone
* false=关闭跳转账号密码页 register/binding/account 绑定已有账号
* 可被后端 wechat/getLogo 返回的 routineLoginRequirePhone 覆盖
*/
MP_WECHAT_REQUIRE_PHONE: true
};

@ -2,8 +2,8 @@
"name" : "八方物业",
"appid" : "__UNI__B905528",
"description" : "八方物业",
"versionName" : "1.0.2",
"versionCode" : 1002,
"versionName" : "1.0.3",
"versionCode" : 1003,
"transformPx" : false,
/* 5+App */
"app-plus" : {

@ -162,6 +162,8 @@ public class Constants {
public static final String CONFIG_KEY_FRONT_API_URL = "front_api_url"; //移动商城接口地址
public static final String CONFIG_KEY_SITE_LOGO = "mobile_top_logo"; //logo地址
public static final String CONFIG_KEY_MOBILE_LOGIN_LOGO = "mobile_login_logo"; // 移动端登录 logo
/** 小程序微信登录是否强制获取手机号1=开启默认0=关闭(走账号密码绑定微信) */
public static final String CONFIG_KEY_ROUTINE_LOGIN_REQUIRE_PHONE = "routine_login_require_phone";
public static final String CONFIG_KEY_SITE_NAME = "site_name"; //网站名称
public static final String CONFIG_SITE_TENG_XUN_MAP_KEY = "tengxun_map_key"; //腾讯地图key
public static final String CONFIG_BANK_LIST = "user_extract_bank"; //可提现银行

@ -0,0 +1,40 @@
package com.zbkj.common.request;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.zbkj.common.constants.RegularConstants;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import java.io.Serializable;
/**
*
* openId
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value = "WxBindingAccountRequest", description = "小程序微信绑定已有账号请求对象")
public class WxBindingAccountRequest implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "账号(手机号)", required = true)
@NotBlank(message = "账号不能为空")
@Pattern(regexp = RegularConstants.PHONE_TWO, message = "请输入正确的手机号")
@JsonProperty("account")
private String account;
@ApiModelProperty(value = "密码", required = true)
@NotBlank(message = "密码不能为空")
private String password;
@ApiModelProperty(value = "微信授权 register 阶段返回的 key", required = true)
@NotBlank(message = "key不能为空")
private String key;
}

@ -3,6 +3,7 @@ package com.zbkj.front.controller;
import com.zbkj.common.model.wechat.TemplateMessage;
import com.zbkj.common.request.RegisterAppWxRequest;
import com.zbkj.common.request.RegisterThirdUserRequest;
import com.zbkj.common.request.WxBindingAccountRequest;
import com.zbkj.common.request.WxBindingPhoneRequest;
import com.zbkj.common.response.CommonResult;
import com.zbkj.common.response.LoginResponse;
@ -87,6 +88,16 @@ public class WeChatController {
return CommonResult.success(userCenterService.registerBindingPhone(request));
}
/**
* +
* routine_login_require_phone
*/
@ApiOperation(value = "小程序微信绑定已有账号")
@RequestMapping(value = "/register/binding/account", method = RequestMethod.POST)
public CommonResult<LoginResponse> registerBindingAccount(@RequestBody @Validated WxBindingAccountRequest request){
return CommonResult.success(userCenterService.registerBindingAccount(request));
}
/**
* js
*/
@ -105,6 +116,8 @@ public class WeChatController {
public CommonResult<Map<String, String>> getLogo(){
Map<String, String> map = new HashMap<>();
map.put("logoUrl", userCenterService.getLogo());
// 1=微信登录新用户强制获取手机号0=跳转账号密码绑定微信
map.put("routineLoginRequirePhone", userCenterService.getRoutineLoginRequirePhone());
return CommonResult.success(map);
}

@ -173,6 +173,19 @@ public interface UserCenterService extends IService<User> {
*/
LoginResponse registerBindingPhone(WxBindingPhoneRequest request);
/**
* +
* @param request
* @return
*/
LoginResponse registerBindingAccount(WxBindingAccountRequest request);
/**
*
* @return 1=0=
*/
String getRoutineLoginRequirePhone();
/**
*
* @param pageParamRequest

@ -489,6 +489,16 @@ public class UserCenterServiceImpl extends ServiceImpl<UserDao, User> implements
return systemConfigService.getValueByKey(Constants.CONFIG_KEY_MOBILE_LOGIN_LOGO);
}
/**
*
* routine_login_require_phone1=0=
*/
@Override
public String getRoutineLoginRequirePhone() {
String value = systemConfigService.getValueByKey(Constants.CONFIG_KEY_ROUTINE_LOGIN_REQUIRE_PHONE);
return StrUtil.isBlank(value) ? "1" : value;
}
/**
*
* @param code String code
@ -854,6 +864,79 @@ public class UserCenterServiceImpl extends ServiceImpl<UserDao, User> implements
return loginResponse;
}
/**
* +
*
*/
@Override
public LoginResponse registerBindingAccount(WxBindingAccountRequest request) {
Object cache = redisUtil.get(request.getKey());
if (ObjectUtil.isNull(cache)) {
throw new CrmebException("微信授权已过期,请重新点击微信登录");
}
RegisterThirdUserRequest registerThirdUserRequest = JSONObject.parseObject(cache.toString(), RegisterThirdUserRequest.class);
if (!Constants.USER_LOGIN_TYPE_PROGRAM.equals(registerThirdUserRequest.getType())) {
throw new CrmebException("仅支持小程序微信绑定");
}
User user = userService.getByPhone(request.getAccount());
if (ObjectUtil.isNull(user)) {
throw new CrmebException("此账号未注册");
}
if (!user.getStatus()) {
throw new CrmebException("此账号被禁用");
}
String encryptedPassword = CrmebUtil.encryptPassword(request.getPassword(), request.getAccount());
if (!user.getPwd().equals(encryptedPassword)) {
throw new CrmebException("密码错误");
}
UserToken boundByUser = userTokenService.getTokenByUserId(user.getUid(), Constants.THIRD_LOGIN_TOKEN_TYPE_PROGRAM);
if (ObjectUtil.isNotNull(boundByUser)) {
throw new CrmebException("该账号已绑定微信小程序");
}
UserToken boundByOpenId = userTokenService.getByOpenidAndType(
registerThirdUserRequest.getOpenId(), Constants.THIRD_LOGIN_TOKEN_TYPE_PROGRAM);
if (ObjectUtil.isNotNull(boundByOpenId)) {
throw new CrmebException("该微信已绑定其他账号");
}
User finalUser = user;
Boolean execute = transactionTemplate.execute(e -> {
userTokenService.bind(
registerThirdUserRequest.getOpenId(),
Constants.THIRD_LOGIN_TOKEN_TYPE_PROGRAM,
finalUser.getUid());
return Boolean.TRUE;
});
if (!execute) {
throw new CrmebException("绑定微信失败,请稍后重试");
}
if (ObjectUtil.isNotNull(registerThirdUserRequest.getSpreadPid()) && registerThirdUserRequest.getSpreadPid() > 0) {
loginService.bindSpread(user, registerThirdUserRequest.getSpreadPid());
}
user.setLastLoginTime(DateUtil.nowDateTime());
userService.updateById(user);
redisUtil.delete(request.getKey());
LoginResponse loginResponse = new LoginResponse();
try {
loginResponse.setToken(tokenComponent.createToken(user));
} catch (Exception e) {
logger.error(StrUtil.format("绑定微信账号后生成token失败uid={}", user.getUid()));
e.printStackTrace();
}
loginResponse.setType("login");
loginResponse.setUid(user.getUid());
loginResponse.setNikeName(user.getNickname());
loginResponse.setPhone(user.getPhone());
return loginResponse;
}
/**
*
* @param pageParamRequest

Loading…
Cancel
Save