目錄
SMS
環境調試
從阿里云云市場中購買第三方短信服務
調試短信驗證碼功能
實戰開發?
封裝組件
對外接口
調用演示
SMS
環境調試
從阿里云云市場中購買第三方短信服務
a)進入阿里云首頁,然后從云市場中找到 “短信”?(一定要從 云市場 去找短信服務,否則需要企業證明,備案)?
?阿里云-計算,為了無法計算的價值阿里云——阿里巴巴集團旗下公司,是全球領先的云計算及人工智能科技公司之一。提供免費試用、云服務器、云數據庫、云安全、云企業應用等云計算服務,以及大數據、人工智能服務、精準定制基于場景的行業解決方案。免費備案,7x24小時售后支持,助企業無憂上云。https://www.aliyun.com/
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 83359fd73fe94948385f570e3c139105headers.put("Authorization", "APPCODE " + appcode);//根據API的要求,定義相對應的Content-Typeheaders.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:對于驗證碼接口防刷,這里可以根據不同需求,做得很復雜
調用演示
調用后,手就可以收到以下短信.
關于短信的模板,可以去聯系客服進行申請.