1. 程式人生 > >Java使用阿里大於傳送簡訊通知和簡訊驗證碼

Java使用阿里大於傳送簡訊通知和簡訊驗證碼

說明:

1.該案例是實際開發中運用用於使用者註冊傳送驗證碼和實際場景中商品價格變動,訂單下發傳送簡訊通知

2.Java專案中需要的jar

需要的jar包:

fastjson-1.1.24.jar

taobao-sdk-java-auto_1455552377940-20160908.jar

maven環境中需要的jar:

  1. <!-- 阿里大於簡訊通知jar -->
  2. lt;dependency>
  3.       <groupId>com.ganshane.specs</groupId>
  4.       <artifactId>taobao-sdk-java-auto-20160607
    </artifactId>
  5.       <version>1.0.0</version>
  6. lt;/dependency>
該版本是我自己從阿里大於官網下載的jar然後安裝到本地倉庫中,具體操作請點選:

3.測試工程結構:


簡訊通知模板常量類:

  1. package com.qianjiang.util.sms;  
  2. /** 
  3.  * @class:SMSConstants 
  4.  * @descript:java 使用阿里大於簡訊通知驗證碼模板常量類 
  5.  * 參考:https://api.alidayu.com/docs/api.htm?apiId=25450 
  6.  * @date:2017年3月7日 上午10:53:12
     
  7.  * @author sang 
  8.  */
  9. publicclass SMSConstants {  
  10.     //公共引數:正式環境請求地址http格式
  11.     publicstatic String URL="http://gw.api.taobao.com/router/rest";  
  12.     //公共引數:正式環境請求地址https格式  
  13.     //public static String URL2 = "https://eco.taobao.com/router/rest"; 
  14.     //TOP分配給應用的AppKey,即阿里大於賬戶建立的應用
  15.     publicstatic String APP_KEY="23669622"
    ;  
  16.     //公共引數:簽名的摘要演算法,可選值為:hmac,md5。
  17.     publicstatic String SIGN_METHOD_MD5="md5";  
  18.     //公共引數:簽名的摘要演算法,可選值為:hmac,md5。
  19.     publicstatic String SIGN_METHOD_HMAC="hmac";  
  20.     //請求引數:簡訊簽名,傳入的簡訊簽名必須是在阿里大於“管理中心-簡訊簽名管理”中的可用簽名
  21.     publicstatic String SMS_SIGN="千匠";  
  22.     //請求引數:公共回傳引數
  23.     publicstatic String EXTEND="123456";  
  24.     //請求引數:簡訊型別,傳入值請填寫normal 
  25.     publicstatic String SMS_TYPE="normal";  
  26.     //請求引數:簡訊模板ID,傳入的模板必須是在阿里大於“管理中心-簡訊模板管理”中的可用模板。示例:SMS_585014
  27.     publicstatic String SMS_TEMPLATE_CODE="SMS_53300064";  
  28.     //請求引數:簽名的App Secret值
  29.     publicstatic String SECRET = "77c99b227ff054dc44fab8b9d41f975a";    
  30.     //返回資訊編碼為utf-8
  31.     publicstatic String CHARSET_UTF8="utf-8";  
  32.     //簡訊通知模板型別:1驗證碼類2通知類
  33.     //千匠使用者註冊傳送簡訊驗證碼
  34.     publicstaticfinal String SMS_MODEL_TYPE1="1";  
  35.     //千匠使用者下發訂單傳送訂單通知
  36.     publicstaticfinal String SMS_MODEL_TYPE2="2";  
  37.     //千匠使用者商品價格變動通知1
  38.     publicstaticfinal String SMS_MODEL_TYPE21="21";  
  39.     //千匠使用者商品價格變動通知2
  40.     publicstaticfinal String SMS_MODEL_TYPE211="211";  
  41.     //千匠使用者商品到貨通知1
  42.     publicstaticfinal String SMS_MODEL_TYPE212="212";  
  43.     //千匠使用者商品到貨通知2
  44.     publicstaticfinal String SMS_MODEL_TYPE213="213";     
  45. }  
簡訊通知模板變數類:
  1. package com.qianjiang.util.sms;  
  2. /** 
  3.  * @class:SmsParam 
  4.  * @descript:java 使用阿里大於簡訊通知驗證碼模板變數  
  5.  * 簡訊模板變數,傳參規則{"key":"value"},key的名稱須和申請模板中的變數名一致,多個變數之間以逗號隔開。 
  6.  * 示例:針對模板“驗證碼${code},您正在進行${product}身份驗證,打死不要告訴別人哦!”, 
  7.  * 傳參時需傳入{"code":"1234","product":"alidayu"}  
  8.  * 備註: 
  9.  * 模板變數首先要選擇是驗證碼型別還是通知型別,然後新增模板如: 
  10.  * 例如新增驗證碼模板:點選配置管理--驗證碼--配置簡訊模板,變數為模板內容中的自定義變數 
  11.  * 例如新增簡訊通知模板:點選配置管理--簡訊通知--配置簡訊模板,變數為模板中的自定義變數 
  12.  * @date:2017年3月7日 下午2:43:41 
  13.  * @author sang 
  14.  */
  15. publicclass SmsParam {  
  16.     //簡訊模板變數:模板內容中的變數${product}
  17.     private String product;  
  18.     //簡訊模板變數:模板內容中的變數${number},手機驗證碼
  19.     private String number;    
  20.     //簡訊模板變數:模板內容中的變數${ordernumber},訂單號
  21.     private String ordernumber;  
  22.     //簡訊模板變數:模板內容中的變數${disname},關注商品地區
  23.     private String disname;  
  24.     //簡訊模板變數:模板內容中的變數${goodsinfoname},貨品名稱
  25.     private String goodsinfoname;  
  26.     //簡訊模板變數:模板內容中的變數${ofollowprice},關注商品收藏的價格
  27.     private String ofollowprice;  
  28.     //簡訊模板變數:模板內容中的變數${nfollowprice},降低以後的新價格
  29.     private String nfollowprice;  
  30.     //簡訊模板變數:模板內容中的變數${bsetname},站點名稱
  31.     private String bsetname;  
  32.     public SmsParam() {  
  33.         super();  
  34.     }  
  35.     public String getNumber() {  
  36.         return number;  
  37.     }  
  38.     publicvoid setNumber(String number) {  
  39.         this.number = number;  
  40.     }  
  41.     public String getProduct() {  
  42.         return product;  
  43.     }  
  44.     publicvoid setProduct(String product) {  
  45.         this.product = product;  
  46.     }  
  47.     public String getOrdernumber() {  
  48.         return ordernumber;  
  49.     }  
  50.     publicvoid setOrdernumber(String ordernumber) {  
  51.         this.ordernumber = ordernumber;  
  52.     }  
  53.     public String getDisname() {  
  54.         return disname;  
  55.     }  
  56.     publicvoid setDisname(String disname) {  
  57.         this.disname = disname;  
  58.     }  
  59.     public String getGoodsinfoname() {  
  60.         return goodsinfoname;  
  61.     }  
  62.     publicvoid setGoodsinfoname(String goodsinfoname) {  
  63.         this.goodsinfoname = goodsinfoname;  
  64.     }  
  65.     public String getOfollowprice() {  
  66.         return ofollowprice;  
  67.     }  
  68.     publicvoid setOfollowprice(String ofollowprice) {  
  69.         this.ofollowprice = ofollowprice;  
  70.     }  
  71.     public String getNfollowprice() {  
  72.         return nfollowprice;  
  73.     }  
  74.     publicvoid setNfollowprice(String nfollowprice) {  
  75.         this.nfollowprice = nfollowprice;  
  76.     }  
  77.     public String getBsetname() {  
  78.         return bsetname;  
  79.     }  
  80.     publicvoid setBsetname(String bsetname) {  
  81.         this.bsetname = bsetname;  
  82.     }  
  83. }  

簡訊通知工具類:
  1. package com.qianjiang.util.sms;  
  2. import com.alibaba.fastjson.JSON;    
  3. import com.alibaba.fastjson.JSONObject;    
  4. import com.taobao.api.DefaultTaobaoClient;    
  5. import com.taobao.api.TaobaoClient;    
  6. import com.taobao.api.request.AlibabaAliqinFcSmsNumSendRequest;    
  7. import com.taobao.api.response.AlibabaAliqinFcSmsNumSendResponse;   
  8. /** 
  9.  * @class:SmsUtil 
  10.  * @descript:java 使用阿里大於簡訊通知工具類  
  11.  * @date:2017年3月7日 下午2:47:38 
  12.  * @author sang 
  13.  */
  14. publicclass SmsUtil {  
  15.     //請求地址  
  16.     privatestatic String URL = SMSConstants.URL;    
  17.     //TOP分配給應用的AppKey  
  18.     privatestatic String APP_KEY = SMSConstants.APP_KEY;    
  19.     //簡訊簽名AppKey對應的secret值
  20.     privatestatic String SECRET = SMSConstants.SECRET;    
  21.     //簡訊型別,傳入值請填寫normal   
  22.     privatestatic String SMS_TYPE = SMSConstants.SMS_TYPE;    
  23.     //阿里大於賬戶配置的簡訊簽名  
  24.     privatestatic String SMS_SIGN = SMSConstants.SMS_SIGN;    
  25.     //阿里大於賬戶配置的簡訊模板ID  
  26.     privatestatic String SMS_TEMPLATE_CODE = SMSConstants.SMS_TEMPLATE_CODE;   
  27.     /** 
  28.      * @param phone 必填引數,手機號碼 
  29.      * @return 
  30.      * @throws Exception 
  31.      */
  32.     public String sendMsgCode(String phone) throws Exception {    
  33.          //隨機生成6位數字作為驗證碼
  34.         String code = getCode();    
  35.         //System.out.println("驗證碼code:"+code);  
  36.         //獲得第三方阿里雲簡訊通知介面
  37.         TaobaoClient client = new DefaultTaobaoClient(URL, APP_KEY, SECRET);  
  38.         //獲得簡訊通知請求頭
  39.         AlibabaAliqinFcSmsNumSendRequest req = new AlibabaAliqinFcSmsNumSendRequest();  
  40.         //簡訊通知型別
  41.         req.setSmsType(SMS_TYPE);  
  42.         //簡訊通知簽名
  43.         req.setSmsFreeSignName(SMS_SIGN);  
  44.         //簡訊接收號碼:傳入號碼為11位手機號碼不能加0或+86,最多傳入200個號碼,多個號碼以逗號分隔
  45.         req.setRecNum(phone);  
  46.         //簡訊通知引數json格式
  47.         SmsParam smsParamVo = new SmsParam();  
  48.         smsParamVo.setNumber(code);   
  49.         smsParamVo.setProduct(SMS_SIGN);  
  50.         String smsParam = JSONObject.toJSONString(smsParamVo);  
  51.         System.out.println("簡訊通知引數smsParam:"+smsParam);  
  52.         //簡訊模板變數,傳參規則{"key":"value"},key的名字須和申請模板中的變數名一致,多個變數之間以逗號隔開  
  53.         req.setSmsParamString(smsParam);  
  54.         //簡訊模板ID  
  55.         req.setSmsTemplateCode(SMS_TEMPLATE_CODE);    
  56.         AlibabaAliqinFcSmsNumSendResponse rsp = client.execute(req);  
  57.         JSONObject json = JSON.parseObject(rsp.getBody());    
  58.         String jsonStr = json.getString("alibaba_aliqin_fc_sms_num_send_response");    
  59.         if (jsonStr!=null&&!jsonStr.isEmpty() ) {    
  60.             json = JSON.parseObject(jsonStr);    
  61.             String result = json.getString("result");    
  62.             if (result!=null && !result.isEmpty()) {    
  63.                 json = JSON.parseObject(result);    
  64.                 System.out.println("json:"+json);  
  65.                 String errorCode = json.getString("err_code");    
  66.                 if ("0".equals(errorCode)) {  
  67.                     //傳送成功  
  68.                     return code;  
  69.                 } else {  
  70.                     //傳送失敗
  71.                     returnnull;  
  72.                 }    
  73.             }    
  74.         }  
  75.         //傳送失敗
  76.         returnnull;  
  77.     }  
  78.     /** 
  79.      *  
  80.      * @param phone   使用者手機號碼 
  81.      * @param smsUrl  oss請求url 
  82.      * @param smsAppKey  oss應用App key 
  83.      * @param smsSerect  oss應用Serect 
  84.      * @param smsSign      oss應用名 
  85.      * @param smsModelType oss模板型別1表示驗證碼類2表示通知型別 
  86.      * @param smsModelId     oss模板id 
  87.      * @param code     驗證碼或者訂單號 
  88.      * @return 
  89.      * @throws Exception 
  90.      */
  91.     publicboolean sendMsgCode(String phone,String smsUrl,String smsAppKey,String smsSerect,String smsSign,String smsModelType,String smsModelId,JSONObject modelParam) throws Exception {    
  92.         //獲得第三方阿里雲簡訊通知介面
  93.         TaobaoClient client = new DefaultTaobaoClient(smsUrl, smsAppKey, smsSerect);  
  94.         //獲得簡訊通知請求頭
  95.         AlibabaAliqinFcSmsNumSendRequest req = new AlibabaAliqinFcSmsNumSendRequest();  
  96.         //簡訊通知型別
  97.         req.setSmsType(SMS_TYPE);  
  98.         //簡訊通知簽名
  99.         req.setSmsFreeSignName(smsSign);  
  100.         //簡訊接收號碼:傳入號碼為11位手機號碼不能加0或+86,最多傳入200個號碼,多個號碼以逗號分隔
  101.         req.setRecNum(phone);  
  102.         //簡訊通知引數json格式
  103.         SmsParam smsParamVo = new SmsParam();  
  104.         if("1".equals(smsModelType)){  
  105.             //簡訊驗證碼中的變數${number}
  106.             smsParamVo.setNumber(modelParam.getString("code"));  
  107.         }elseif("2".equals(smsModelType)){  
  108.             //簡訊通知中訂單號變數${ordernumber}
  109.             smsParamVo.setOrdernumber(modelParam.getString("code"));  
  110.         }elseif("21".equals(smsModelType)){  
  111.             smsParamVo.setDisname(modelParam.getString("disname"));  
  112.             smsParamVo.setGoodsinfoname(modelParam.getString("goodsinfoname"));  
  113.             smsParamVo.setOfollowprice(modelParam.getString("ofollowprice"));  
  114.             smsParamVo.setNfollowprice(modelParam.getString("nfollowprice"));  
  115.         }elseif("211".equals(smsModelType)){  
  116.             smsParamVo.setBsetname(modelParam.getString("bsetname"));  
  117.             smsParamVo.setGoodsinfoname(modelParam.getString("goodsinfoname"));  
  118.         }elseif("212".equals(smsModelType)){  
  119.             smsParamVo.setGoodsinfoname(modelParam.getString("goodsinfoname"));  
  120.         }elseif("213".equals(smsModelType)){  
  121.         }  
  122.         smsParamVo.setProduct(smsSign);  
  123.         String smsParam = JSONObject.toJSONString(smsParamVo);  
  124.         //System.out.println("簡訊通知引數smsParam:"+smsParam);
  125.         //簡訊模板變數,傳參規則{"key":"value"},key的名字須和申請模板中的變數名一致,多個變數之間以逗號隔開
  126.         //案例:req.setSmsParamString("{\"code\":\"1234\",\"product\":\"alidayu\"}");
  127.         req.setSmsParamString(smsParam);  
  128.         //簡訊模板ID
  129.         req.setSmsTemplateCode(smsModelId);  
  130.         AlibabaAliqinFcSmsNumSendResponse rsp = client.execute(req);  
  131.         JSONObject json = JSON.parseObject(rsp.getBody());    
  132.         String jsonStr = json.getString("alibaba_aliqin_fc_sms_num_send_response");    
  133.         if (jsonStr!=null&&!jsonStr.isEmpty() ) {    
  134.             json = JSON.parseObject(jsonStr);    
  135.             String result = json.getString("result");    
  136.             if (result!=null && !result.isEmpty()) {    
  137.                 json = JSON.parseObject(result);    
  138.                 //System.out.println("json:"+json);
  139.                 String errorCode = json.getString("err_code");    
  140.                 if ("0".equals(errorCode)) {  
  141.                     //傳送成功  
  142.                     returntrue;  
  143.                 } else {  
  144.                     //傳送失敗
  145.                     returnfalse;  
  146.                 }    
  147.             }    
  148.         }  
  149.         //傳送失敗
  150.         returnfalse;  
  151.     }  
  152.     /** 
  153.      * 隨機生成6位數字作為驗證碼 
  154.      * @return 
  155.      */
  156.     publicstatic String getCode(){  
  157.         int code=(int)(Math.random()*9000+100000);  
  158.         return code + "";  
  159.     }  
  160.     //測試
  161.     publicstaticvoid main(String[] args) {  
  162.          try {    
  163.              String phone="183****6512";  
  164.              String smsUrl="http://gw.api.taobao.com/router/rest";  
  165.              String smsAppKey="23669622";  
  166.              String smsSerect="77c99b227ff054dc44fab8b9d41f975a";  
  167.              String smsSign="千匠";  
  168.              //模板型別:1驗證碼類2通知類
  169.              String smsModelType="213";  
  170.              String smsModelId="SMS_57315117";  
  171.              JSONObject modelParam=new JSONObject();  
  172.              //modelParam.put("disname", "華東");
  173.              //modelParam.put("goodsinfoname", "聯想拯救者R720");
  174.              //modelParam.put("ofollowprice", "6200.99");
  175.              //modelParam.put("nfollowprice", "6199.00");
  176.              //modelParam.put("bsetname", "千米網站");
  177.              SmsUtil m = new SmsUtil();    
  178.              boolean result=m.sendMsgCode(phone, smsUrl, smsAppKey, smsSerect, smsSign, smsModelType, smsModelId, modelParam);  
  179.              System.out.println(result);  
  180.              System.out.println("傳送成功");  
  181.          } catch (Exception e) {    
  182.              e.printStackTrace();   
  183.              System.out.println("傳送失敗");  
  184.          }      
  185.     }  
  186. }  

備註:簡訊傳送模板變數必須與你申請的模板變數一致。以上案例中模板變數均是本人阿里雲賬號申請的模板變數。如下圖所示:


測試控制檯資訊:

手機收到的簡訊: