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 \ No newline at end of file 102 \ No newline at end of file