微信小程序登录/绑定。

小弟用了一个星期的时候,陆陆续续才完全掌握从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配置和阿里云短信服务的使用在我另外的博客里有
阿里云短信服务,核销码!!!

redis的使用场景和配置环境

留着给未来的自己看看是怎么一步一步成长的。

2019.9.30今天发现一个问题,当有两个订单同时核销的时候,发的验证码虽然是随机4位数字,
但是也也可能会相同,如果相同了就会覆盖,其中一个订单就会和核销不到。
	公司大佬检查我的代码的时候及时和我指出并修改,小弟在此记录下流程,
以免事情太多不记得就尴尬了。

本人使用的WEIIT框架,
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/oyxm0/article/details/81874733
————————————————

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值