前言
- 在网站和移动应用中利用短信验证码进行信息确认是最常用的验证手段。随着短信验证码的技术更新,短信验证码的应用程序也非常多样,如交易确认、授权绑定、登录保护等。 本文用在微信小程序手机号登录
- 短信验证码对注册用户的管理更加方便,用户通过手机注册网站平台,手机号码+短信验证码的登录方式,操作非常简单,比起输入密码,用户可能更喜欢短信验证登录。短信验证码保证了用户注册时的质量与数量,它可以更好的校验用户真实身份,可以避免恶意注册,令企业更好的进行用户管理,减少运营维护的工作量。
一. 准备工作
- 没有阿里云账号先注册阿里云账户
- 短信功能是要收费的,所以乖乖充值吧!
- 完成短信签名和短信模板的申请(需要一点时间)
- 创建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);
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}$");
public static Boolean validatePhone(String phone) {
if (null == phone || "".equals(phone)) {
return false;
}
Matcher m = PHONE_PATTERN.matcher(phone);
return m.matches();
}
b. 组装请求
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存储,用于控制验证码两分钟失效
redisTemplate.opsForValue().set(phone, vCode, 120, TimeUnit.SECONDS);
总结
接口逻辑并不复杂,主要能看得懂接口文档和相关配置就行 有哪里有问题欢迎指正 下一篇:【微信小程序 - 工作实战分享】2.微信小程序相关信息获取并且登录
|