1.閒談
學java的,初期是最苦逼的,和黑客根本就是兩碼事,不能入侵系統、也寫不了腳本外掛,甚至電腦上運行的桌面軟件都寫不出來,整天對着編輯器的黑框框,輸入輸出一些字符串,就算學到了web,也是給前端傳遞、接收json串,時間長了,感覺就是在搬磚,完全沒有以前認爲的程序員該有的樣子。
直到第三方接入的出現,才讓人感覺有點程序員的意思了,短信是我們經常接觸的東西,所以今天寫下短信的接入。
2.關於接入
發送短信,國內跑不了移動聯通電信三巨頭,但小公司直接對接這三家企業,先不說有沒有這個渠道,只算成本就沒得玩,費時費力。
還好各種互聯網巨頭,如阿里、騰訊、百度,都在自己家雲平臺上提供了對應的第三方短信接入的接口,省去了直接對接三巨頭的成本,小流量的企業,一年到頭幾百塊可能都用不完。
當然除了bat等巨頭,也有專門做短信接口的企業,如創藍、秒滴之類,不說質量怎麼樣,但足見接入第三方,比自己企業直接接入移動聯通電信要受歡迎的多,也是java程序員需要掌握的主流業務技術之一。
目前市面上,阿里雲的短信平臺已經成了主流,安全穩定、企業大、短時間沒有倒閉風險,加上許多中小企業的服務器都用的阿里雲,所以阿里雲的短信是企業的不二選擇。
不過今天我講的例子不是阿里雲,原因無他,相較於其他短信接入略爲複雜(也可能是我們公司之前寫的太亂了,我沒怎麼看,如果有誤,見諒),其實都是無病呻吟的業務包裝,無論短信,還是支付,亦或者推送,再或者微信公衆號的開發,在我眼裏沒有任何區別。
說白了就是拼接json串或者xml,向對應接口發送請求,然後獲取回執碼,看狀態。
權限校驗是拼接的json串或者xml裏面的參數之一,無非什麼appid、token之類。
支付也不過多了一層加密,把關鍵參數轉成RSA,多了個回調接口,看支付是否成功,成功增加對應貨幣數量,或者購買成功之類的。
上面的是核心,所有的第三方几乎都繞不過去,大部分幾乎都是http請求,簡直和前端調後臺接口沒什麼兩樣,無非角色轉變,是我們後臺發送請求罷了。
3.秒滴短信
爲什麼選擇秒滴短信,這裏無非是方便入門,新手友好,最關鍵的是,新人註冊有10塊錢本金,足夠上百條短信發送了,方便入門者的使用。
我這不是打廣告,各公司實際用什麼短信,還是由經理決定,程序員又沒有決定權,而且其他短信也大同小異,甚至別的第三方都逃不出上面紅字的範圍,所謂一門通、百門精,放在這裏說,最合適不過了。
一:首先,打開對應短信方的官網平臺,這用秒滴爲例。
無論什麼第三方平臺,我們第一眼要鎖定開發者字樣,比如下面的開發者中心,點進去。
我們會看到
這時候其他的東西對我們來說無所謂,接入指引的參數,讓經理申請好給你,就 ACCOUT SID 和 AUTH TOKEN,一般都是經理申請,自己用的話,根據指引來,這不是技術點,也沒有難度,無非點點點。
直接鎖定API字樣的選項,這裏就是HTTPS API,也就是接口文檔。
這裏提供了三種短信方式,其實都一樣,這裏我們選擇用的最多的短信驗證碼來做示範。
二:正式接入
點進驗證碼通知短信,右側會出現接口文檔,從上到下
請求地址 https://api.miaodiyun.com/20150822/industrySMS/sendSMS 這個是我們發送請求的地址,固定參數不變的
請求方式 POST 沒什麼說的
編碼格式 UTF-8 國內編碼跑不出 utf-8
響應格式 JSON,XML 一般說用json 除了微信支付這個nc設計,我還沒見過哪家用xml這種反人類設置的
請求包頭 Content-type:application/x-www-form-urlencoded 這個設置的沒什麼說的
請求參數說明
關鍵部分,就是這堆參數
1.是按流程申請的一個權限賬號id,用戶身份識別的,問經理要,或者自己按流程申請
2.則是按流程申請的模板,申請來的模板直接填進去就好
3.申請的模板的主鍵參數 沒什麼可說的 可填可不填
4.可選 在2只填寫模板的情況下 3放入替換變量的 值,比如說驗證碼,或者直接在2中放入所有數據
5.必選項 手機號 給那臺手機號發送短信 就填哪個
6.不填 沒意義
7.必選 放個對應格式的時間進去就行了 java格式時間還是很方便的
8.必選項 驗證身份的 就是把身份id token 和 時間戳 拼接起來 md5加密 對方同樣加密然後判斷是否相等 相等通過校驗
9.可選 加不加無所謂 反正默認返回json 加上免得出事故 json比較好用
請求實例
這裏驗證了我說的話 無非就是拼接一些參數 發送到對應接口 獲取數據 判斷是否成功,難點在於各個參數各種加密啦,獲取了罷了,第三方沒有什麼大不了的。
返回參數說明
這個看源文檔吧 就是返回的json帶的數據 判斷一下狀態碼 是什麼狀態
返回示例
同樣的 不貼了 看源文檔。
4.總結
還是那句話 , 無論什麼第三方,都是拼接他們要求的各種參數,然後發送到指定服務器接口也就是url,獲取回執信息,根據官方狀態碼,判斷是否成功。
難點在於各種文檔很亂 , 參數拿的不對,最nc還是微信支付,跨兩個平臺,參數要從兩個平臺取,簡直nc。
5.DEMO
按習慣放個demo
public void sendSms(String phone,String tplId,String params){
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String timestamp = sdf.format(new Date());
String sig = MD5Util.getMD5(Constants.MDSMS_ACCOUNT_SID +Constants.MDSMS_AUTH_TOKEN +timestamp);
String url = Constants.MDSMS_REST_URL +operation;
Map<String,String> map = new HashMap<>();
map.put("accountSid",Constants.MDSMS_ACCOUNT_SID);
map.put("to",phone);
map.put("templateid",tplId);
map.put("param",params);
map.put("timestamp",timestamp);
map.put("sig",sig);
map.put("respDataType","json");
String result = HttpUtil.post(url,map);
JSONObject jsonObject = JSON.parseObject(result);
if(!jsonObject.getString("respCode").equals("00000")){
log.error("fail to send sms to "+phone+":"+params+":"+result);
}
} catch (Exception e) {
log.error("fail to send sms to "+phone+":"+params);
}
}
上面的HttpUtil是請求發送工具, 參考我的這篇博文: https://blog.csdn.net/soulsda/article/details/86511465
json是fastjson的jar包處理,自行百度,國內不用fastjson的反而少見,我這裏不多講,
MD5Util 是md5加密算法,網上一大把,我也不多贅述,
Constants 是我一個工具類 就是放各種參數的 根據名字清晰看到是token 和 sid 之類的 按自己申請的替換掉就行
如果有人沒怎麼看懂,歡迎留言,我看到會詳細解答的。