前言
- 在网站和移动应用中利用短信验证码进行信息确认是最常用的验证手段。随着短信验证码的技术更新,短信验证码的应用程序也非常多样,如交易确认、授权绑定、登录保护等。 本文用在微信小程序手机号登录
- 短信验证码对注册用户的管理更加方便,用户通过手机注册网站平台,手机号码+短信验证码的登录方式,操作非常简单,比起输入密码,用户可能更喜欢短信验证登录。短信验证码保证了用户注册时的质量与数量,它可以更好的校验用户真实身份,可以避免恶意注册,令企业更好的进行用户管理,减少运营维护的工作量。
一. 准备工作
- 没有阿里云账号先注册阿里云账户
- 短信功能是要收费的,所以乖乖充值吧!
- 完成短信签名和短信模板的申请(需要一点时间)
- 创建access key(后面需要使用)
二. 配置
- 依赖
<dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.4.6</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-ecs</artifactId> <version>4.17.6</version> </dependency>
- 配置阿里云短信(这里***是自己要配的,来源于阿里云短信服务)
aliyun: accessKey: *** accessSecret: *** sms: domain: *** SignName: *** TemplateCode: ***
- java中引入
@Value("${aliyun.accessKey}") private String accessKey; @Value("${aliyun.accessSecret}") private String accessSecret; @Value("${aliyun.sms.domain}") private String domain; @Value("${aliyun.sms.SignName}") private String signName; @Value("${aliyun.sms.TemplateCode}") private String templateCode; @Value("${water.charge.maintenanceCode}") private String maintenanceCode;
三. 实战代码(仅仅是后台代码,前端传入手机号)
- Controller
@Autowired private CustomerAppLoginService customerAppLoginService; @ApiOperation("发送手机短信") @GetMapping("phone/send_code") public JsonData phoneSendCode(@RequestParam("phone") String phone) { return customerAppLoginService.phoneSendCode(phone); }
- service
@Override public JsonData phoneSendCode(String phone) { // 手机号三重校验 JsonData jsonData = tripleCheck(phone); if (jsonData.getCode() != 0) { return jsonData; } // 自定义验证码 String vCode = RevenueUtil.getVCode(); DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKey, accessSecret); IAcsClient client = new DefaultAcsClient(profile); // 组装请求 CommonRequest request = buildRequest(phone, vCode); try { CommonResponse response = client.getCommonResponse(request); JSONObject smsRes = JSONObject.parseObject(response.getData()); String ok = "OK"; String code = "Code"; if (smsRes.get(code).equals(CODE_ERROR)) { return JsonData.buildResult(BizCodeEnum.REVENUE_MSG_SEND_NUM_OUT); } if (ok.equals(smsRes.get(code))) { log.info("send sms success: " + vCode); // 放入缓存,登录时校验,过期时间2分钟 redisTemplate.opsForValue().set(phone, vCode, 120, TimeUnit.SECONDS); } else { log.error("send sms failed: " + smsRes.get("Message")); return JsonData.buildResult(BizCodeEnum.REVENUE_MSG_SEND_FAIL); } } catch (Exception e) { return JsonData.buildResult(BizCodeEnum.REVENUE_MSG_SEND_FAIL); } return JsonData.buildSuccess(); }
- 用到的方法
a. 校验手机号
/** * 手机号正则 */ private static final Pattern PHONE_PATTERN = Pattern.compile("^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\\d{8}$"); /** * 手机号格式校验 * * @return */ public static Boolean validatePhone(String phone) { if (null == phone || "".equals(phone)) { return false; } Matcher m = PHONE_PATTERN.matcher(phone); return m.matches(); }
b. 组装请求
/** * 构建 CommonRequest * * @param phone * @param vCode * @return */ private CommonRequest buildRequest(String phone, String vCode) { CommonRequest request = new CommonRequest(); request.setSysMethod(MethodType.POST); request.setSysDomain(domain); request.setSysVersion("2017-05-25"); request.setSysAction("SendSms"); request.putQueryParameter("RegionId", "cn-hangzhou"); request.putQueryParameter("PhoneNumbers", phone); request.putQueryParameter("SignName", signName); request.putQueryParameter("TemplateCode", templateCode); request.putQueryParameter("TemplateParam", "{\"code\":" + vCode + "}"); return request; }
- 附加
代码中使用到Redis存储,用于控制验证码两分钟失效
// 放入缓存,登录时校验,过期时间2分钟 redisTemplate.opsForValue().set(phone, vCode, 120, TimeUnit.SECONDS);
总结
接口逻辑并不复杂,主要能看得懂接口文档和相关配置就行
有哪里有问题欢迎指正
下一篇:【微信小程序 - 工作实战分享】2.微信小程序相关信息获取并且登录