流程
- 去阿里云上找第三方短信服务api
- 拿到购买的短息服务的
appcode
- 其他参数看你需求,这里就不提供显示了,很简单
- 找到api接口 提供的sdk代码
- 导入maven和相关的java代码
大概就是下面的样式,具体代码看你买的api提供商
- appcode,模板这些参数必须要。服务商提供
- phone 你传入的参数
- code是验证码,随机生成6位
功能:
- 先去redis中查验证码
- 没有则继续发送 ,发送成功则存入redis中
- redis中则直接返回,我这里直接抛异常
注意:这里不需要用
@Cacaheable
这个注解是配合数据库使用,这里只是做验证码获取,即业务是注册之类的业务,用StringRedisTemplate
来设置key-value和过期时间
@Service
public class ShortServiceImp implements ShortServie {
@Value("${short.appcode}")
private String appcode;
@Value("${short.smsSignId}")
private String smsSignId;
@Value("${short.templateId}")
private String templateId;
@Autowired
private StringRedisTemplate stringRedisTemplate;
private String shortMessageKey = ConstantProperties.SHORTMESSAGEKEY;
//发送短信,发送成功返回code验证码存到redis中
@Override
public R sendShortMessage(String phone) {
//防止用户多次点击
String value = stringRedisTemplate.opsForValue().get(shortMessageKey);
if(value != null ){
throw new MyOnlineException(20001,"您的操作太快了,请稍后再试试");
}
String host = "https://gyytz.market.alicloudapi.com";
String path = "/sms/smsSend";
String method = "POST";
Map<String, String> headers = new HashMap<String, String>();
//最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105
headers.put("Authorization", "APPCODE " + appcode);
Map<String, String> querys = new HashMap<String, String>();
querys.put("mobile", phone);
//获取随机6位
String code = RandomUtil.getSixBitRandom();
querys.put("param", "**code**:"+code+",**minute**:5");
querys.put("smsSignId", smsSignId);
querys.put("templateId", templateId);
Map<String, String> bodys = new HashMap<String, String>();
try {
/**
* 重要提示如下:
* HttpUtils请从
* https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java
* 下载
*{
* "code": "0",
* "msg": "成功"
* }
* {
* "code":"XXXX",
* "msg":"错误提示内容",
* "ILLEGAL_WORDS":["XX","XX"] // 如有则显示
* // 1、http响应状态码对照表请参考:https://help.aliyun.com/document_detail/43906.html;
* // 2、如果次数用完会返回 403,Quota Exhausted,此时继续购买就可以;
* // 3、如果appCode输入不正确会返回 403,Unauthorized;
* }
* 1204
* 签名未报备
* 请联系客服申请。
* 1205
* 签名不可用
* 签名一般为:公司名简称、产品名、商城名称、网站名称、APP名称、系统名称、公众号、小程序名称等等。不可以是纯数字、电话号码或者无意义的签名,如:【温馨提示】【测试】【你好】等;
* 1302
* 短信内容包含敏感词
* 短信内容包含敏感词
* 1304
* 短信内容过长
* 短信内容实际长度=短信签名+短信内容。(短信计费方式:70字内按1条计费,超出按67字每条计费;一个汉字、数字、字母、符号都算一个字;带变量短信按实际替换后的长度计费)
* 1320
* 模板ID不存在
* 请联系客服申请。
* 1403
* 手机号码不正确
* 手机号码不正确
* 1905
* 验证未通过
* 验证未通过
* 相应的依赖请参照
* https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
*/
HttpResponse response = HttpUtils.doPost(host, path, method, headers, querys, bodys);
// System.out.println(response.toString());
//获取response的body
int statusCode = response.getStatusLine().getStatusCode();
//System.out.println(EntityUtils.toString(response.getEntity()));
String reasonPhrase = response.getStatusLine().getReasonPhrase();
//发送成功后,设置过期时间60后,重新发送验证码才有效
stringRedisTemplate.opsForValue().set("short::messagecode", code, 60L, TimeUnit.SECONDS);
return R.ok().data("statusCode",statusCode).data("reasonPhrase",reasonPhrase);
} catch (Exception e) {
e.printStackTrace();
throw new MyOnlineException(20001,e.getMessage());
}
}
}