Commit be8829f145a681ab1575233963d42592e7becbf1

Authored by 刘炯
1 parent a8beff48

SHA1 签名

0. 公共组件/1.1 SHA1签名.md
1 1 /*
2   -Title: 1.1 获取单个分类接口
3   -Sort: 11
  2 +Title: SHA1签名
4 3 */
5 4  
6   -### 接口描述 ###
  5 +### 签名描述 ###
7 6  
  7 +签名机制
  8 +SHA1 加密
8 9  
9   -### 接口地址 ###
10   -http://icms.staff.cnlive.com/icms_service/api/getCategoryTree.do?appId=movie&catalogID=..
  10 + 1. 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)后,使用 URL 键值 对的格式(即 key1=value1&key2=value2…)拼接成字符串 string1,
  11 + 注意:值为空的参数不 参与签名;
  12 + 2. 在 string1 最 后 拼 接 上 key=sp_key得 到 stringSignTemp 字 符 串 , 并 对 stringSignTemp 进行 sha1 运算,再将得到的字符串所有字符转换为大写,
  13 + 得到 sign 值 signValue。
  14 + 3. 对传入参数中所有键值对的 value 进行 urlencode 转码后重新拼接成字符串 string2。
  15 + 4. 将 sign=signValue拼接到string2后面得到最终的 参数 字符串。
11 16  
12   -### 接口协议 ###
13   -HTTP GET
  17 +#### 代码示例
14 18  
15   -### 接口请求参数 ###
16   -- siteID:站点ID
17   -- catalogID:节点ID
18   -
19   -### 返回值 ###
20   -返回JSON格式的节目元数据信息,json示例如下:
21   -<pre><code>{
22   -Id: 1,
23   -title: "",
24   -parentI: "",
25   -children: ""
26   -}
27   -<code></pre>
28   -
29   -JSON属性说明:
30   -<table style="font-size:14px" >
31   - <tr>
32   - <td>字段名称</td>
33   - <td>描述</td>
34   - <td>是否可控</td>
35   - <td>备注</td>
36   - </tr>
37   - <tr>
38   - <td>Id</td>
39   - <td>节点ID</td>
40   - <td>否</td>
41   - <td></td>
42   - </tr>
43   - <tr>
44   - <td>title</td>
45   - <td>节点名称</td>
46   - <td>否</td>
47   - <td></td>
48   - </tr>
49   - <tr>
50   - <td>parentI</td>
51   - <td>父节点ID</td>
52   - <td>是</td>
53   - <td>为空没有该节点,表示是一级分类</td>
54   - </tr>
55   - <tr>
56   - <td>children</td>
57   - <td>当前节点下子节点数组</td>
58   - <td>是</td>
59   - <td>包含若干个节点,节点下也是id、title、chiildren,为空则没有该节点结构</td>
60   - </tr>
61   -</table>
  19 +```java
62 20  
  21 + public static void main(String[] args) {
  22 + String sp_key = "672db30805f848f59ec3728f8347a4a0"; //找相关开发者获取
  23 + Map<String, String> map = new HashMap<String,String>();
  24 + map.put("sp_id","iqhpk8pl19"); //找相关开发者获取
  25 + map.put("mobile", "13520335460");
  26 + map.put("content", "你好,test");
  27 +
  28 + //生成get 方式 请求
  29 + String getUrl = buildURL("http://localhost:9091/openapi/api/CnliveMobile/sendMsg",map, sp_key);
  30 + System.out.println(getUrl);
  31 + //生成 post 方式签名
  32 + //String sign = sign(map, sp_key);
  33 + }
  34 +
  35 + /**
  36 + * 生成URL
  37 + * @param url
  38 + * @param params
  39 + * @param sp_key
  40 + * @return
  41 + */
  42 + public static String buildURL(String url,Map<String,String> params,String sp_key){
  43 + Map<String,String> map = order(params);
  44 + if(map.containsKey("sign")){
  45 + map.remove("sign");
  46 + }
  47 + String str = mapJoin(map,true,false);
  48 + String sign = SHA1.SHA1Digest(str+"&key="+sp_key).toUpperCase();
  49 + map.put("sign", sign);
  50 + return url+"?"+mapJoin(map, false, true);
  51 + }
  52 +
  53 + /**
  54 + * Map key 排序
  55 + * @param map
  56 + * @return
  57 + */
  58 + private static Map<String,String> order(Map<String, String> map){
  59 + HashMap<String, String> tempMap = new LinkedHashMap<String, String>();
  60 + List<Entry<String, String>> infoIds = new ArrayList<Entry<String, String>>( map.entrySet());
63 61  
  62 + Collections.sort(infoIds, new Comparator<Entry<String, String>>() {
  63 + public int compare(Entry<String, String> o1,Entry<String, String> o2) {
  64 + return (o1.getKey()).toString().compareTo(o2.getKey());
  65 + }
  66 + });
64 67  
  68 + for (int i = 0; i < infoIds.size(); i++) {
  69 + Entry<String, String> item = infoIds.get(i);
  70 + tempMap.put(item.getKey(), item.getValue());
  71 + }
  72 + return tempMap;
  73 + }
  74 +
  75 + /**
  76 + * url 参数串连
  77 + * @param map
  78 + * @param keyLower
  79 + * @param valueUrlencode
  80 + * @return
  81 + */
  82 + private static String mapJoin(Map<String, String> map,boolean keyLower,boolean valueUrlencode){
  83 + StringBuilder stringBuilder = new StringBuilder();
  84 + for(String key :map.keySet()){
  85 + if(map.get(key)!=null&&!"".equals(map.get(key))){
  86 + try {
  87 + stringBuilder.append(key)
  88 + .append("=")
  89 + .append(valueUrlencode?URLEncoder.encode(map.get(key),"utf-8").replace("+", "%20"):map.get(key))
  90 + .append("&");
  91 + } catch (UnsupportedEncodingException e) {
  92 + e.printStackTrace();
  93 + }
  94 + }
  95 + }
  96 + if(stringBuilder.length()>0){
  97 + stringBuilder.deleteCharAt(stringBuilder.length()-1);
  98 + }
  99 + return stringBuilder.toString();
  100 + }
  101 +```
65 102 \ No newline at end of file
... ...