SpringBoot集成阿里云短信验证码
在配好了短信模板的前提下,我们进入到短信服务的快速学习和测试这个面板(温馨提示,发送短信是要收费的,账户里面没资金也可能在后面会导致短信发送失败,可以先在账户里面充几角钱)
然后我们进入到测试界面
你可以跟着它的官方文档去完成,可以参考我的步骤,接下来我将分享我具体的操作
我就将它封装到了一个类里面,然后去改写了一些方法,让它按照我的逻辑来完成,其实官方给的注释也很详细,基本都能很轻易的读懂
@Service
public class Sample {
/**
* <b>description</b> :
* <p>使用AK&SK初始化账号Client</p>
* @return Client
*
* @throws Exception
*/
public static com.aliyun.teaopenapi.Client createClient() throws Exception {
// 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
// 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html。
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
.setAccessKeyId("你自己的accessKeyId")
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
.setAccessKeySecret("你自己的accessKeySecret");
// 当然这里建议你最好是读取配置文件里面的值(定义两个变量用@Value注解来注入进来)
// Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
config.endpoint = "dysmsapi.aliyuncs.com";
return new com.aliyun.teaopenapi.Client(config);
}
/**
* <b>description</b> :
* <p>API 相关</p>
*
*
* @return OpenApi.Params
*/
public static com.aliyun.teaopenapi.models.Params createApiInfo() throws Exception {
com.aliyun.teaopenapi.models.Params params = new com.aliyun.teaopenapi.models.Params()
// 接口名称
.setAction("SendSms")
// 接口版本
.setVersion("2017-05-25")
// 接口协议
.setProtocol("HTTPS")
// 接口 HTTP 方法
.setMethod("POST")
.setAuthType("AK")
.setStyle("RPC")
// 接口 PATH
.setPathname("/")
// 接口请求体内容格式
.setReqBodyType("json")
// 接口响应体内容格式
.setBodyType("json");
return params;
}
public Map<String,?> sendSms(String phone,String code,String SignName,String TemplateCode) throws Exception {
com.aliyun.teaopenapi.Client client = Sample.createClient();
com.aliyun.teaopenapi.models.Params params = Sample.createApiInfo();
java.util.Map<String, Object> queries = new java.util.HashMap<>();
// query params
queries.put("PhoneNumbers", phone);// 接收短信的手机号码
queries.put("SignName", SignName); // 短信签名名称
queries.put("TemplateCode", TemplateCode); // 短信模板CODE
queries.put("TemplateParam", "{\"code\":\"" + code + "\"}");// 短信模板变量对应的实际值
// runtime options
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
com.aliyun.teaopenapi.models.OpenApiRequest request = new com.aliyun.teaopenapi.models.OpenApiRequest()
.setQuery(com.aliyun.openapiutil.Client.query(queries));
// 复制代码运行请自行打印 API 的返回值
// 返回值实际为 Map 类型,可从 Map 中获得三类数据:响应体 body、响应头 headers、HTTP 返回的状态码 statusCode。
return client.callApi(params, request, runtime);
}
}
然后我在其他业务里面去调用它
@Service
@Slf4j
public class AliApiServiceImpl implements AliApiService {
private static final String STRING_NAME = "xxx的社区管理系统";
@Resource
private RedisService redisService;
@Value("${ali.api.sms}")
private String smsAppCode;
@Autowired
private Sample sample;
@Override
// 发送短信 修改密码
public ResponseEnum sendSms(String phone) throws Exception {
return sendSms(phone, null);
}
@Override
// 发送短信
public ResponseEnum sendSms(String phone, String code) throws Exception {
if (redisService.get(phone) == null) {
code = StrUtil.isBlank(code) ? Utils.getRandomSixStr() : code.substring(2);
//md5加密
boolean result = redisService.set(phone, MD5.create().digestHex(code), 60);
if (result) {
Map<String, ?> response = sample.sendSms(phone, code, STRING_NAME, smsAppCode);
String body = response.get("body").toString();
log.info("短信接口结果:" + body);
log.info("发送的短信内容:{}", code);
JsonParser jsonParser = new JsonParser();
JsonElement bodyJson = jsonParser.parse(body);
String Message = bodyJson.getAsJsonObject().get("Message").getAsString();
if (Message.equals("OK")) {
return ResponseEnum.SEND_SUCCESS;
} else {
return ResponseEnum.OTHER_ERROR;
}
} else {
return ResponseEnum.OTHER_ERROR;
}
} else {
return ResponseEnum.SEND_WAIT_ERROR;
}
}
最后得到的结果
所以我们的发送短信验证码功能也就成功了,赶紧打开手机看看接收到的验证码吧。