java語言下短信接入,淺談各種第三方

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 之類的 按自己申請的替換掉就行

    如果有人沒怎麼看懂,歡迎留言,我看到會詳細解答的。

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章