前期准备
注意:⚠️个人用户暂时无法开通短信功能
1. 注册账号并进行实名认证
2. 注册成功后会赠送100+10条短信服务
3. 进入工作台,进行签名创建
根据个人需求创建签名,签名创建成功后提交系统审核,审核成功就可以开始使用啦😄
审核周期:提交签名之日起,两个工作日内。工作时间:周一到周五09:00-11:30,13:00-18:00(法定节假日顺延),建议您尽量在工作日18:00前提交申请。
注意:对于已经审核通过的内容模板,不表示一定会下发成功(运营商侧也会不定期更新审核机制),如遇到短信发送失败,可咨询极光客服详细沟通
4. 创建短信模版
这里我用的是系统自带的短信模版
代码接入
极光官方文档:https://docs.jiguang.cn/
以下下内容为为CSDN博主「代码匪徒」的原创文章:
原文链接:https://blog.csdn.net/munangs/article/details/126801411
依赖引入
<!--Hutool-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.16</version>
</dependency>
yaml配置:
#极光
jiguang:
jpush:
#极光开发APP KEY
app-key: ""
#极光开发MASTER SECRET
master-secret: ""
#极光短信签名ID
message-sign-id: ""
#极光验证码短信ID
captcha-template-id: ""
发送短信验证码:
/**
* 发送手机号验证码
*
* @param phoneNumber 解密后的手机号
* @return 是否成功
*/
@Override
public CommonResult<Boolean> sendCaptcha(String phoneNumber) {
//判断今天短信验证发送次数是否合规
if (!captchaInfoService.isCaptchaRequestAvailable(phoneNumber)) {
return new CommonResult<>(HttpCode.WRONG_PARAM, "今日发送数量过多", false);
}
//发送短信验证码
String msgId = sendCaptchaNetworkHandler(phoneNumber);
if (msgId != null) {
//设置Redis中对于手机号和msgId的记录
setRedisRecord(phoneNumber, msgId);
return new CommonResult<>(HttpCode.SUCCESS, "发送成功", true);
} else {
return new CommonResult<>(HttpCode.INTERNAL_ERROR, "发送失败", false);
}
}
/**
* 发送手机号验证码
* 参考文档:https://docs.jiguang.cn/jsms/server/rest_api_jsms#功能说明
*/
private String sendCaptchaNetworkHandler(String phoneNumber) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("mobile", phoneNumber);
jsonObject.put("sign_id", JPUSH_MESSAGE_SIGN_ID);
jsonObject.put("temp_id", JPUSH_CAPTCHA_TEMPLATE_ID);
//返回msg_id
String result = HttpRequest.post("https://api.sms.jpush.cn/v1/codes")
.basicAuth(JPUSH_APP_KEY, JPUSH_MASTER_SECRET)
.body(jsonObject.toString())
.timeout(20000)
.execute().body();
JSONObject resultJson = JSONObject.parseObject(result);
if (resultJson.containsKey(MESSAGE_ID_KEY)) {
return resultJson.getString(MESSAGE_ID_KEY);
} else {
return null;
}
}
短信验证码验证(极光提供了短信验证码验证功能,但是也可以再加一层redis验证,即发送验证码的时候就在redis中存储,登录时比对一下)
/**
* 获取对应手机号在Redis中的key
* 举例:CAPTCHA:19825031998:VALUE
*
* @return 手机号在Redis中的key
*/
String getRecordKey(String phone) {
return CAPTCHA_RECORD_KEY_PREFIX + phone + CAPTCHA_RECORD_KEY_SUFFIX;
}
/**
* 判断验证码和手机号是否匹配
* 参考文档: https://docs.jiguang.cn/jsms/server/rest_api_jsms#请求示例-2
*
* 因为极光提供了验证码验证api
* 所以可以不用再在redis中添加对应的phoneNumber和captcha对,
* 当然也可以写入redis并设置过期时间
*
* 如果写入redis则当做判断时可以判断两次,
* 1.调用极光验证码验证api
* 2.自己redis中是否有对应的captcha
*
* @param captcha 验证码
* @param phoneNumber 手机号
* @return 是否正确
*/
@Override
public CommonResult<Boolean> checkCaptcha(int captcha, String phoneNumber) {
//获取Key
String recordKey = getRecordKey(phoneNumber);
//查询手机号对应的验证码ID
Object queryResult = redisTemplate.opsForValue().get(recordKey);
//如果为空,说明没有记录,直接返回
if (queryResult == null) {
return new CommonResult<>(HttpCode.WRONG_PARAM, "无发送记录", null);
}
//获取msgId的值(注:msg_id 为调用发送验证码 API 的返回值)
String msgId = String.valueOf(queryResult);
JSONObject jsonObject = new JSONObject();
jsonObject.put("code", captcha);
String result = HttpRequest.post("https://api.sms.jpush.cn/v1/codes/" + msgId + "/valid")
.basicAuth(JPUSH_APP_KEY, JPUSH_MASTER_SECRET)
.body(jsonObject.toString())
.timeout(20000)
.execute().body();
JSONObject resultJson = JSONObject.parseObject(result);
if (resultJson.containsKey(MESSAGE_IS_VALID_KEY)) {
return new CommonResult<>(HttpCode.SUCCESS, "成功", resultJson.getBoolean(MESSAGE_IS_VALID_KEY));
} else {
return new CommonResult<>(HttpCode.INTERNAL_ERROR, "内部错误", null);
}
}
@Override
public Boolean isCaptchaRequestAvailable(String phoneNumber) {
//获得每日发送的次数的Redis Key
Object countQueryObject = redisTemplate.opsForHash().get(CAPTCHA_COUNT_MAP_KEY, phoneNumber);
//如果是NULL,说明数据库里还没有这个数据,就允许发送
if (countQueryObject == null) {
return true;
} else {
//查询当前已经发送的次数
int count = Integer.parseInt(String.valueOf(countQueryObject));
//判断是否查出了最大次数
return count <= CAPTCHA_MAX_REQUEST_PER_DAY;
}
}
此致感谢博主:代码匪徒的博客文章,让我收获颇丰,希望能够熟练运用。