小弟用了一个星期的时候,陆陆续续才完全掌握从redis缓存运用,和阿里云短信服务结合的用法。在此写个日志。如有错误的地方,请大神多多指出。
以下是代码块,都已经写好注释了。
前端跳转到绑定页面 前端填写手机号码 发送验证码(区分核销场景、绑定场景 ) 绑定场景的时候 ,手机号 ,(redis ,key value ) “bind”+手机号码,“随机四位数字验证码” ,
//todo 绑定接口 手机号 验证码,小程序用户的wx_open_id
/**
* 小程序经销商登录,发送手机验证码
* <p>
* 随机四位六位数字 redis
* shop_phone
* 前端wx_open_id
*
* @return
*/
@RequestMapping("sendValiCode.json")
public String sendValiCode() {
//根据验证码并完成
FormMap formMap = getFormMap();
//判断shop_phone不能为空
if (formMap.get("shop_phone") == null) {
return toJsonAPI(ApiResponseCode.PARAM_ERROR);
}
//当手机不为空的时候,用ShopServiceImpl中的sendValicode方法。
return shopService.sendValicode(formMap);
}
/**
* 登录
* 经销商小程序登录
* wx_open_id
*/
@RequestMapping("malogin.json")
public String malogin() throws WxErrorException {
FormMap formMap = getShopFormMap();
//判断微信授权的时候是否有传进来code
if (StringUtils.isEmpty(formMap.getStr("code"))) {
return toJsonAPI("", "微信小程序登录时必须传递wx_open_id参数", "10001");
} else {
//获取用户信息
WxMaJscode2SessionResult result = weixinService.getMaLocalInstance().jsCode2SessionInfo(formMap.getStr("code"));
//todo 根据微信openid 查询经销商 是否绑定
formMap.put("wx_open_id", result.getOpenid());
E shopInfo = weixinService.selectShopByOpenId(formMap);
if (shopInfo != null) {
shopInfo.put("shopToken", JWTUtil.sign(shopInfo, 2L * 3600L * 1000L));
return toJsonAPI(shopInfo);
} else {
return toJsonAPI(result.getOpenid(), "请绑定经销商手机", "20001");
}
}
}
/**
* 绑定
* 经销商小程序绑定
*
*shop_phone
* wx_open_id
*/
@RequestMapping("mabind.json")
public String mabind() {
FormMap formMap = getShopFormMap();
//手机号码不为空
if (formMap.get("shop_phone") == null) {
return toJsonAPI(ApiResponseCode.PARAM_ERROR);
}
//将redis缓存中的验证码值取出来,并验证
Object validateCode = redisUtil.get("YZ" + formMap.getStr("validateCode").toUpperCase());
logger.info("shop_phone is validateCode");
//验证码不能为空。
if (validateCode == null) {
return toJsonAPI("", "绑定验证码错误,请重新输入!", "1002");
}
//通过shop_phone查询经销商所有信息并赋值给waInfo
E waInfo = shopService.selectShopByPhoneId(formMap);
if (waInfo == null) {
return toJsonAPI("", "绑定验证码已失效,请重新获取!", "1003");
}
//如果该shop_phone中有wx_open_id值,则返回该账户已绑定。
if (!org.apache.commons.lang.StringUtils.isEmpty(waInfo.getStr("wx_open_id"))){
return toJsonAPI("", "该账户已绑定!", "1003");
}
//定义一个Map,将微信传来的wx_open_id存进去。
FormMap insertMap = new FormMap();
insertMap.put("shop_phone",waInfo.get("shop_phone") );
insertMap.put("wx_open_id", formMap.getStr("wx_open_id"));
//绑定wx_open_id
shopService.editOpen(formMap);`在这里插入代码片`
//释放掉redis缓存中相应的数值
redisUtil.del("YZ"+formMap.getStr("validateCode"));
//返回数值绑定成功
return toJsonAPI(ApiResponseCode.SUCCESS);
}
shopServiceImpl
//小程序 发送经销商登录验证码
@Override
public String sendValicode(FormMap formMap) {
//防止验证码同时生成一样的,同时生成验证码
String code = createCode();
//记录code到日志文件中
logger.info("code is {}", code);
//短信服务code要传的数据类型
String[] msg = {"{\"code\":\"" + code + "\"}"};
//运用阿里云的jra,给予相应的手机号、短信模板、数据类型
boolean flag = WeiitUtil.sendMobileMessage(formMap.getStr("shop_phone"), "短信模板", msg);
if (flag) {
//将验证码存入redis缓存中
redisUtil.set("YZ" + code, formMap.getStr("shop_phone"), 100 * 60 * 60);
return toJsonAPI("", "验证码发送成功", "0");
} else {
return toJsonAPI("", "发送失败,请稍候重试", "1002");
}
}
//防止验证码同时生成一样的
public String createCode(){
String code = RandomStringUtils.randomNumeric(4);
if (redisUtil.exists("HX"+code)){
createCode();
}
return code;
}
redis配置和阿里云短信服务的使用在我另外的博客里有
阿里云短信服务,核销码!!!
留着给未来的自己看看是怎么一步一步成长的。
2019.9.30今天发现一个问题,当有两个订单同时核销的时候,发的验证码虽然是随机4位数字,
但是也也可能会相同,如果相同了就会覆盖,其中一个订单就会和核销不到。
公司大佬检查我的代码的时候及时和我指出并修改,小弟在此记录下流程,
以免事情太多不记得就尴尬了。
本人使用的WEIIT框架,
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/oyxm0/article/details/81874733
————————————————