目录
SMS
环境调试
从阿里云云市场中购买第三方短信服务
a)进入阿里云首页,然后从云市场中找到 “短信” (一定要从 云市场 去找短信服务,否则需要企业证明,备案)
b)然后任意挑选一个合适的短信服务(这里以一个为例)
c)点击购买更多
d)然后按照自己的需求购买(还是有很多可以白嫖的)
这样就购买成功了.
e)之后你就可以在控制台里搜索 “云市场”,找到你购买的服务
Ps:将来使用短信服务给手机发送验证码时,就需要指定上面个的 AppCode(千万不可泄漏,防止别人乱刷)
调试短信验证码功能
a)进入你购买的服务后,找到 API 接口,点击 “去调试”
b) 如下界面(用到的参数都可以参照 “商品介绍” 中的描述)
c)调整参数,点击发送请求,随后返回响应,显示 "ok",说明调试成功(此时你就可以看到发送到你手机上的验证码了).
实战开发
封装组件
a)复制请求示例中的所有代码,粘贴到你的项目中
b)按照注释中的内容去引入对应的依赖和工具类
c)建议将短信服务专门到一个微服务中(专门用例处理调用第三方服务的接口),将来其他服务需要使用时,进行远程调用接口,解耦合(不要跟我张口闭口性能优化...).
import org.apache.http.HttpResponse;
import org.cyk.gulimall.third.infra.HttpUtils;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component
public class SmsComponent {
/**
* 这里的 host、pat、method、appcode 可以配置到配置文件中,但是没必要
* 因为将来如果真要换另一个企业的短信服务,接口的需要的参数变化都还是挺大的,所以基本没有复用的必要
* code: 验证码
* phone: 手机号
*/
public void sendMsg(String code, String phone) {
String host = "https://dfsns.market.alicloudapi.com";
String path = "/data/send_sms";
String method = "POST";
String appcode = "91dasjhfk75e0574afdajsf82g3r3bf923r";
Map<String, String> headers = new HashMap<>();
//最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105
headers.put("Authorization", "APPCODE " + appcode);
//根据API的要求,定义相对应的Content-Type
headers.put("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
Map<String, String> querys = new HashMap<>();
Map<String, String> bodys = new HashMap<>();
bodys.put("content", "code:" + code);
bodys.put("template_id", "CST_ptdie100"); //注意,CST_ptdie100该模板ID仅为调试使用,调试结果为"status": "OK" ,即表示接口调用成功,然后联系客服报备自己的专属签名模板ID,以保证短信稳定下发
bodys.put("phone_number", phone);
try {
HttpResponse response = HttpUtils.doPost(host, path, method, headers, querys, bodys);
System.out.println(response.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
对外接口
@RestController
@RequestMapping("/auth/sms")
class SmsApi(
val thirdSmsRpcService: ThirdSmsRpcService,
val redisTemplate: StringRedisTemplate,
) {
@GetMapping("/send_code/{phone}")
fun sendCode(
@PathVariable("phone") phone: String, //此处省略格式校验
): ApiResp<Int> {
//1.验证码防刷
val rCode = redisTemplate.opsForValue().get(SmsRedisKey.getSMSKey(phone))
rCode?.let { throw AppException(ApiStatus.CODE_GET_FAST, "验证码获取过于频繁!") }
//2.生成验证码
//1) 生成 6 位随机数字
val code = (1..6).joinToString("") { Random().nextInt(0, 10).toString() }
//2) 保存到 Redis 上
redisTemplate.opsForValue().set(SmsRedisKey.getSMSKey(phone), code, 1, TimeUnit.MINUTES)
//3.向手机发送验证码
thirdSmsRpcService.sendMsg(code, phone)
return ApiResp.ok(1)
}
}
Ps:对于验证码接口防刷,这里可以根据不同需求,做得很复杂
调用演示
调用后,手就可以收到以下短信.
关于短信的模板,可以去联系客服进行申请.
标签:code,短信,String,phone,SMS,验证码,手机短信,服务 From: https://blog.csdn.net/CYK_byte/article/details/139529823