Commit 8f51bb00 by giaogiao

微信登陆相关.短信验证码

parent 25af0193
......@@ -20,6 +20,31 @@
<groupId>io.geekidea.springbootplus</groupId>
<artifactId>framework</artifactId>
</dependency>
<!-- fastbootWeixin的核心依赖 -->
<dependency>
<groupId>com.mxixm</groupId>
<artifactId>fastboot-weixin</artifactId>
<version>0.6.2</version>
</dependency>
<!-- SpringBoot的web项目,必须 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 暂时只能使用apache的http,后续可加入其它http支持 -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<!-- 友盟 start -->
<dependency>
......
......@@ -40,16 +40,16 @@ public class AppSmsController extends BaseController {
return appSmsService.registerOrLoginCode(phoneArea, phone);
}
// /**
// * 获取修改手机号的验证码
// */
// @GetMapping("/updatePhoneCode")
// @OperationLog(name = "获取修改手机号的验证码", type = OperationLogType.INFO)
// @ApiOperation(value = "获取修改手机号的验证码", response = Object.class, notes = "本地环境默认666666")
// public ApiResult<Object> updatePhoneCode() throws Exception {
//
// return appSmsService.updatePhoneCode();
// }
/**
* 获取修改手机号的验证码
*/
@GetMapping("/updatePhoneCode")
@OperationLog(name = "获取修改手机号的验证码", type = OperationLogType.INFO)
@ApiOperation(value = "获取修改手机号的验证码", response = Object.class, notes = "本地环境默认666666")
public ApiResult<Object> updatePhoneCode() throws Exception {
return appSmsService.updatePhoneCode();
}
}
package com.sien.common.controller;
import com.sien.common.service.AppUserService;
import com.sien.common.vo.AppUserQueryVo;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.controller.BaseController;
import io.geekidea.springbootplus.framework.log.annotation.Module;
import io.geekidea.springbootplus.framework.log.annotation.OperationLog;
import io.geekidea.springbootplus.framework.log.enums.OperationLogType;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* APP用户 控制器
*
* @author wei
* @since 2020-09-23
*/
@Slf4j
@RestController
@Module("api-app")
@Api(value = "微信登陆相关", tags = {"微信登陆相关"})
@RequestMapping("/wechatUser")
public class WechatUserController extends BaseController {
@Autowired
private AppUserService appUserService;
/**
* 根据微信重定向code查询用户是否绑定
*/
@GetMapping("/check/")
@OperationLog(name = "根据微信重定向code查询用户是否绑定", type = OperationLogType.INFO)
@ApiOperation(value = "根据微信重定向code查询用户是否绑定", response = AppUserQueryVo.class)
public ApiResult<AppUserQueryVo> getAppUser() throws Exception {
AppUserQueryVo appUserQueryVo = appUserService.getMyInfo();
return ApiResult.ok(appUserQueryVo);
}
}
package com.sien.common.controller;
import com.sien.common.sms.SignUtil;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
*微信服务器配置 验证api
*/
@Slf4j
@RestController
@RequestMapping("/wxapi")
public class WxConfigController {
/**
* @return
* @description 微信公众号服务器配置校验token
* @author: liyinlong
* @date 2019-05-09 9:38
*/
@ApiOperation("微信公众号服务器配置校验token")
@RequestMapping("/checkToken")
public void checkToken(HttpServletRequest request, HttpServletResponse response) {
//token验证代码段
try {
log.info("请求已到达,开始校验token");
if (StringUtils.isNotBlank(request.getParameter("signature"))) {
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
log.info("signature[{}], timestamp[{}], nonce[{}], echostr[{}]", signature, timestamp, nonce, echostr);
if (SignUtil.checkSignature(signature, timestamp, nonce)) {
log.info("数据源为微信后台,将echostr[{}]返回!", echostr);
response.getOutputStream().println(echostr);
}
}
} catch (IOException e) {
log.error("校验出错");
e.printStackTrace();
}
}
}
\ No newline at end of file
......@@ -12,7 +12,7 @@ public interface AppSmsService {
* 获取注册验证码
*/
ApiResult<Object> registerOrLoginCode(String phoneArea, String phone);
// ApiResult<Object> updatePhoneCode() throws Exception;
ApiResult<Object> updatePhoneCode() throws Exception;
/**
* 获取注册验证码
......
......@@ -3,9 +3,12 @@ package com.sien.common.service.impl;
import cn.hutool.core.util.RandomUtil;
import com.sien.common.service.AppSmsService;
import com.sien.common.service.AppUserService;
import com.sien.common.vo.AppUserQueryVo;
import com.sien.common.vo.SmsCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.shiro.jwt.JwtToken;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
......@@ -71,12 +74,12 @@ public class AppSmsServiceImpl implements AppSmsService {
return getSmsCodeApiResult(String.format(SMS_REGIEST, area, number), area, number);
}
// @Override
// public ApiResult<Object> updatePhoneCode() throws Exception {
// JwtToken jwtToken = (JwtToken) SecurityUtils.getSubject().getPrincipal();
// AppUserQueryVo appUserById = appUserService.getAppUserById(jwtToken.getUserId());
// return getSmsCodeApiResult(String.format(SMS_UPDATE, appUserById.getPhoneArea(), appUserById.getPhone()), appUserById.getPhoneArea(), appUserById.getPhone());
// }
@Override
public ApiResult<Object> updatePhoneCode() throws Exception {
JwtToken jwtToken = (JwtToken) SecurityUtils.getSubject().getPrincipal();
AppUserQueryVo appUserById = appUserService.getAppUserById(jwtToken.getUserId());
return getSmsCodeApiResult(String.format(SMS_UPDATE, appUserById.getPhoneArea(), appUserById.getPhone()), appUserById.getPhoneArea(), appUserById.getPhone());
}
/**
* 获取短信验证码
......
......@@ -2,13 +2,14 @@ package com.sien.common.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.sien.common.service.AppSmsService;
import com.sien.common.service.AppUserApiService;
import com.sien.common.entity.AppUser;
import com.sien.common.param.app.AppSmsRegisterParam;
import com.sien.common.param.app.AppUserInfoParam;
import com.sien.common.service.AppSmsService;
import com.sien.common.service.AppUserApiService;
import com.sien.common.service.AppUserService;
import com.sien.common.vo.AppUserQueryVo;
import com.sien.common.vo.app.LoginAppUserTokenVo;
import com.sien.common.entity.AppUser;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.shiro.jwt.JwtToken;
......@@ -31,36 +32,36 @@ public class AppUserApiServiceImpl implements AppUserApiService {
@Override
public ApiResult<Boolean> updatePhone(String phoneArea, String phone, String code) throws Exception {
// JwtToken jwtToken = (JwtToken) SecurityUtils.getSubject().getPrincipal();
//
// AppUserQueryVo appUserById = appUserService.getAppUserById(jwtToken.getUserId());
//
// // 校验验证码
// boolean equalsRegisterCode = appSmsService.equalsUpdatePhoneCode(appUserById.getPhoneArea(), appUserById.getPhone(), code);
// if (!equalsRegisterCode) {
// return ApiResult.fail(ApiCode.SMS_CODE_ERROR);
// }
// // 删除已使用的验证码
// appSmsService.deleteUpdatePhoneCode(appUserById.getPhoneArea(), appUserById.getPhone());
//
// // 判断手机号是否已经注册
// AppUser one = appUserService.getOne(new QueryWrapper<AppUser>().lambda()
// .eq(AppUser::getPhoneArea, phoneArea)
// .eq(AppUser::getPhone, phone));
// if (one != null) {
// return ApiResult.fail(ApiCode.BUSINESS_EXCEPTION);
// }
//
//
// AppUser appUser = new AppUser();
// appUser.setPhoneArea(phoneArea);
// appUser.setPhone(phone);
// appUser.setId(jwtToken.getUserId());
//
// boolean b = appUserService.updateById(appUser);
// if (b) {
// return ApiResult.ok();
// }
JwtToken jwtToken = (JwtToken) SecurityUtils.getSubject().getPrincipal();
AppUserQueryVo appUserById = appUserService.getAppUserById(jwtToken.getUserId());
// 校验验证码
boolean equalsRegisterCode = appSmsService.equalsUpdatePhoneCode(appUserById.getPhoneArea(), appUserById.getPhone(), code);
if (!equalsRegisterCode) {
return ApiResult.fail(ApiCode.SMS_CODE_ERROR);
}
// 删除已使用的验证码
appSmsService.deleteUpdatePhoneCode(appUserById.getPhoneArea(), appUserById.getPhone());
// 判断手机号是否已经注册
AppUser one = appUserService.getOne(new QueryWrapper<AppUser>().lambda()
.eq(AppUser::getPhoneArea, phoneArea)
.eq(AppUser::getPhone, phone));
if (one != null) {
return ApiResult.fail(ApiCode.BUSINESS_EXCEPTION);
}
AppUser appUser = new AppUser();
appUser.setPhoneArea(phoneArea);
appUser.setPhone(phone);
appUser.setId(jwtToken.getUserId());
boolean b = appUserService.updateById(appUser);
if (b) {
return ApiResult.ok();
}
return ApiResult.fail();
}
......
package com.sien.common.sms;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
public class SignUtil {
private static String token = "sDsdaSDADad";
/**
* 校验签名
* @param signature 签名
* @param timestamp 时间戳
* @param nonce 随机数
* @return 布尔值
*/
public static boolean checkSignature(String signature,String timestamp,String nonce){
String checktext = null;
if (null != signature) {
//对ToKen,timestamp,nonce 按字典排序
String[] paramArr = new String[]{token,timestamp,nonce};
Arrays.sort(paramArr);
//将排序后的结果拼成一个字符串
String content = paramArr[0].concat(paramArr[1]).concat(paramArr[2]);
try {
MessageDigest md = MessageDigest.getInstance("SHA-1");
//对接后的字符串进行sha1加密
byte[] digest = md.digest(content.toString().getBytes());
checktext = byteToStr(digest);
} catch (NoSuchAlgorithmException e){
e.printStackTrace();
}
}
//将加密后的字符串与signature进行对比
return checktext !=null ? checktext.equals(signature.toUpperCase()) : false;
}
/**
* 将字节数组转化我16进制字符串
* @param byteArrays 字符数组
* @return 字符串
*/
private static String byteToStr(byte[] byteArrays){
String str = "";
for (int i = 0; i < byteArrays.length; i++) {
str += byteToHexStr(byteArrays[i]);
}
return str;
}
/**
* 将字节转化为十六进制字符串
* @param myByte 字节
* @return 字符串
*/
private static String byteToHexStr(byte myByte) {
char[] Digit = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char[] tampArr = new char[2];
tampArr[0] = Digit[(myByte >>> 4) & 0X0F];
tampArr[1] = Digit[myByte & 0X0F];
String str = new String(tampArr);
return str;
}
}
package com.sien.common.sms;
import cn.wecloud.sdk.common.exception.WeCloudApiException;
import cn.wecloud.sdk.sms.client.WeCloudSmsClient;
import cn.wecloud.sdk.sms.data.WeCloudSmsSingleSendResult;
import cn.wecloud.sdk.sms.model.WeCloudSmsAbroadModel;
import cn.wecloud.sdk.sms.request.WeCloudSmsDomesticSingleSendRequest;
import cn.wecloud.sdk.sms.response.WeCloudSmsDomesticSingleSendResponse;
//@Slf4j
public class SmsUtil {
public static void main(String[] args) throws WeCloudApiException {
// 创建连接对象
final WeCloudSmsClient client = new WeCloudSmsClient("9XPgCY9rAb1GG2yg");
// 创建请求信息对象
final WeCloudSmsAbroadModel model = new WeCloudSmsAbroadModel("855", "081612642", "1323474417736716290", "888888");
// 创建请求对象
final WeCloudSmsDomesticSingleSendRequest request = new WeCloudSmsDomesticSingleSendRequest(model);
// 执行请求
final WeCloudSmsDomesticSingleSendResponse execute = client.execute(request);
// 判断是否请求成功
if (execute.isSuccess()) {
// 获取返回业务对象
final WeCloudSmsSingleSendResult result = execute.getData();
} else {
// 输出请求失败信息
// log.error(execute.getMsg());
}
}
public static void send(String areaCode, String phone, String verificationCode) throws WeCloudApiException {
// 创建连接对象
final WeCloudSmsClient client = new WeCloudSmsClient("9XPgCY9rAb1GG2yg");
// 创建请求信息对象
String templateId = "1323474417736716290";
final WeCloudSmsAbroadModel model = new WeCloudSmsAbroadModel(areaCode, phone, templateId, verificationCode);
// 创建请求对象
final WeCloudSmsDomesticSingleSendRequest request = new WeCloudSmsDomesticSingleSendRequest(model);
// 执行请求
final WeCloudSmsDomesticSingleSendResponse execute = client.execute(request);
// 判断是否请求成功
if (execute.isSuccess()) {
// 获取返回业务对象
final WeCloudSmsSingleSendResult result = execute.getData();
} else {
// 输出请求失败信息
// log.error(execute.getMsg());
}
}
}
......@@ -12,9 +12,18 @@ spring-boot-plus:
request-log-format: false
response-log-format: false
wx:
token: sDsdaSDADad
# 测试号的appid,测试号管理界面有
appid: wx7aac805012428dc5
# 测试号的appsecret,测试号管理界面有
appsecret:
# =服务调用的url地址,用于微信web的oauth2授权回调等,若没有可为空。
callback-url: wx7aac805012428dc5
spring:
datasource:
url: jdbc:mysql://47.99.47.225:3306/SiEn?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
url: jdbc:mysql://47.99.47.225:3306/sien?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: temple123456
......
......@@ -2,7 +2,7 @@
############################# 访问路径、端口tomcat start #############################
server:
port: 8889
port: 80
servlet:
context-path: /api
tomcat:
......@@ -185,6 +185,8 @@ spring-boot-plus:
# 排除登录 注册 登出
- /user/registerOrLogin,/user/login
- /sms/registerOrLoginCode
- /wechatUser/check
- /wxapi/checkToken
# 排除静态资源
- /static/**,/templates/**
# 排除Swagger
......@@ -303,7 +305,7 @@ spring-boot-plus:
enable: true
base:
# 扫描的包,多个包使用逗号隔开
package: io.geekidea.springbootplus,com.sien
package: io.geekidea.springbootplus,com.sien.com.sien.common
contact:
email: sien
name: sien
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment