1. 首页
  2. 文本短信
  3. SDK参考
  4. JAVA SDK
菜单
本页目录
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package test;

import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.Map;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

/**
 *
 * @author guoxinhua
 */
public class Test {
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws Exception {

        //创建post参数不包含signature 密码不需要md5
        String password = "039e3beb";

        java.util.Map<String, String> paras = new java.util.HashMap<>();
        paras.put("sp_id", "497680");
        paras.put("mobile", "19000000000");
        paras.put("content", "【秒信通】短信验证码为:376691,请勿将验证码提供给他人。");
        //根据参数Key排序(顺序)
        java.util.TreeMap<String, String> sortParas = new java.util.TreeMap<>();
        sortParas.putAll(paras);

        String sortedQueryString = specialUrlEncode(http_build_query(sortParas));

        //将上面得到的字符串按照如下顺序拼接成新的字符串
        StringBuilder stringToSign = new StringBuilder();
        stringToSign.append("POST").append("&");
        stringToSign.append(toUtf8("/")).append("&");
        stringToSign.append(sortedQueryString);

        //签名采用HmacSHA1算法 + Base64。参考代码如下:
        String sign = getSignature(stringToSign.toString(), password);

        System.out.println(sign);
    }

    public static String toUtf8(String value) throws Exception {
        return java.net.URLEncoder.encode(value, "UTF-8");
    }

    public static String specialUrlEncode(String value) throws Exception {
        return value.replace("+", "%20").replace("*", "%2A").replace("%7E", "~");
    }

    public static String getSignature(String data, String key) throws Exception {
        byte[] keyBytes = key.getBytes();

        SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA1");

        Mac mac = Mac.getInstance("HmacSHA1");

        mac.init(signingKey);

        byte[] rawHmac = mac.doFinal(data.getBytes());

        String hexBytes = byte2hex(rawHmac);

        return new sun.misc.BASE64Encoder().encode(hexBytes.getBytes());
    }

    private static String byte2hex(final byte[] b) {
        String hs = "";

        String stmp = "";

        for (int n = 0; n < b.length; n++) {

            stmp = (java.lang.Integer.toHexString(b[n] & 0xFF));

            if (stmp.length() == 1) {
                hs = hs + "0" + stmp;

            } else {
                hs = hs + stmp;

            }

        }

        return hs;

    }

    /**
     * Java实现PHP中的http_build_query()效果
     *
     * @param array key=value形式的二位数组
     * @return
     */
   public static String http_build_query(Map<String, String> array) {
        String reString = null;
        //遍历数组形成akey=avalue&bkey=bvalue&ckey=cvalue形式的的字符串
        Iterator it = array.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry<String, String> entry = (Map.Entry) it.next();
            String key = entry.getKey();
            String value = entry.getValue();
            reString += key + "=" + value + "&";
        }
        reString = reString.substring(0, reString.length() - 1);
        //将得到的字符串进行处理得到目标格式的字符串
        try {
            reString = java.net.URLEncoder.encode(reString, "utf-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        reString = reString.replace("%3D", "=").replace("%26", "&");

        // 去除第一个多余的null符号
        return reString.substring(4);

    }

}