短信驗證碼數據的封裝加密

1.作過兩個短信驗證碼的平臺介入:html

第一:發送的時候攜帶平臺的key,手機號,短信內容,這種相對於簡單,只須要對內容數據進行轉碼操做就能進行發送。java

第二:這種就比較複雜一點,短信介入須要發送xml格式的數據,發送以前須要對發送的xml的值進行字典排序以後再進行md5加密。以後把加密的字符串加入到xml中一塊兒發送過去。若是和平臺的加密一致就發送短信,不一致就不進行發送。下面着重講解第二種:微信

2.xml數據的封裝app

//第一種方式生成xml
            StringBuilder sb = new StringBuilder();
            sb.append("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>");
            sb.append("<smses>");
            for (int i = 0; i < 50; i++) {
                sb.append("<sms>");
                sb.append("<address>");
                sb.append(5554 + i);
                sb.append("</address>");
                sb.append("<body>");
                sb.append("我是短信內容" + i);
                sb.append("</body>");
                sb.append("<time>");
                sb.append(new Date().getTime());
                sb.append("</time>");
                sb.append("</sms>");
            }
            sb.append("</smses>");
          String msg=sb.toString();

第二種生成請看這篇博客:http://www.cnblogs.com/ygj0930/p/6651643.html (轉載)dom

3.上一步,咱們生成了xml文件的數據,可是裏面的數據咱們尚未加密封裝,加密方式相似於微信支付寶這樣的支付(其實我就是覺的一個短信的加密作成這樣也是夠夠的了鄙視一下內心)工具

//進行字典排序的的數據,再進行md5加密,藉助了一些網上大神的代碼,修改後的數據適應項目
 private static  String getSign(Map<String, String> params) throws UnsupportedEncodingException, NoSuchAlgorithmException {
        Map<String, String> sortMap = new TreeMap<String, String>();
        sortMap.putAll(params);
        // 以k1=v1&k2=v2...方式拼接參數
        StringBuilder builder = new StringBuilder();
        for (Map.Entry<String, String> s : sortMap.entrySet()) {
            String k = s.getKey();
            String v = s.getValue();
            if (StringUtils.isBlank(v)) {// 過濾空值s
                continue;
            }
            builder.append(k).append("=").append(v).append("&");
        }
        if (!sortMap.isEmpty()) {
            builder.deleteCharAt(builder.length() - 1);
        }
        String newString= DigestUtils.md5Hex(builder.append(String.format("&key=%s",appKey)).toString());
        //加密後的字符串
        return newString.toUpperCase();

4.以後把加密後的字符串放入到xml中進行發送post

發送咱們能夠用httpclient,以前作爬蟲用這個請求別人的接口,可是這個封裝要費必定的時間。此次咱們用一個小型的http工具就能夠,okhttp3這個,簡介地址:https://blog.csdn.net/xx326664162/article/details/77714126(轉載)微信支付

//發送的簡單封裝,通常不會出錯,能夠對異常進行更好的處理,當時給了一天時間就沒有多作處理      
 String xmls=addXml(phone,ip,randomstr, type);
       OkHttpClient client =new OkHttpClient.Builder()
           .connectTimeout(20, TimeUnit.SECONDS)
           .build();
       RequestBody body = RequestBody.create(JSON, xmls);
       Request request = new Request.Builder()
           .url(url)
           .post(body)
           .build();
       Response response = client.newCall(request).execute();

注意:還能夠對返回的數據進行處理若是是xml的轉成map這樣就好獲取ui

/**其餘大神的代碼寢室就是對節點的解析以後,裏哦用遞歸加入map中
     * Xml string轉換成Map
     * @param xmlStr
     * @return
     */
    public static Map<String,Object> xmlString2Map(String xmlStr){
        Map<String,Object> map = new HashMap<String,Object>();
        Document doc;
        try {
            doc = DocumentHelper.parseText(xmlStr);
            Element el = doc.getRootElement();
            map = recGetXmlElementValue(el,map);
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        return map;
    }
    /**
     * 循環解析xml
     * @param ele
     * @param map
     * @return
     */
    @SuppressWarnings({ "unchecked" })
    private static Map<String, Object> recGetXmlElementValue(Element ele, Map<String, Object> map){
        List<Element> eleList = ele.elements();
        if (eleList.size() == 0) {
            map.put(ele.getName(), ele.getTextTrim());
            return map;
        } else {
            for (Iterator<Element> iter = eleList.iterator(); iter.hasNext();) {
                Element innerEle = iter.next();
                recGetXmlElementValue(innerEle, map);
            }
            return map;
        }
    }

6.這樣咱們基本就完成了一個複雜短信的封裝加密

相關文章
相關標籤/搜索