Commit 9bc19ad7605f902c452a7d5d9b48d8142be2f10c

Authored by 运维管理账户
1 parent d50648d3

1.1 SHA1签名.md

Showing 1 changed file with 126 additions and 0 deletions
common_components/sign.md 0 → 100644
  1 +/*
  2 +Title: SHA1签名
  3 +*/
  4 +
  5 +
  6 +### 系统参数说明 ###
  7 +
  8 +|名称 |类型 |必选 |描述|
  9 +| :----------- | :------: | :------: | :------: |
  10 +|appId |string |Y |入驻服务开发者(SP)的应用唯一标识码,由开放平台统一分配并提供(一个SP可自行创建多个应用号)|
  11 +|timestamp |int |Y |当前Unix时间戳,请保证请求服务器时间正确,有些API接口是有时效性要求的|
  12 +|ver |string |Y |协议版本号,统一取值为1.0|
  13 +|sign |string |Y |验证码,生成规则详见下面的说明,其中app_key是由开放平台统一分配并提供的SP私钥|
  14 +
  15 +
  16 +### 签名描述 ###
  17 +
  18 +签名机制
  19 +SHA1 加密
  20 +
  21 +1. 对所有传入参数(含系统参数和接口参数)按照字段名的 ASCII 码从小到大排序(字典序)后,使用 URL 键值 对的格式。
  22 + (即 key1=value1&key2=value2…)拼接成字符串 string1,
  23 + 注意:值为空的参数不参与签名,所有请求参数值都需要进行URL编码。
  24 +2. 在 string1 最 后 拼 接 上 key=app_key得 到 stringSignTemp 字 符 串 , 并 对 stringSignTemp 进行 sha1 运算,再将得到的字符串所有字符转换为大写,
  25 + 得到 sign 值 signValue。
  26 +3. 对传入参数中所有键值对的 value 进行 urlencode 转码后重新拼接成字符串 string2。
  27 +4. 将 sign=signValue拼接到string2后面得到最终的 参数 字符串。
  28 +
  29 +
  30 +#### Java代码示例
  31 +
  32 +```java
  33 +
  34 + //生成get 方式 带签名的请求URL
  35 + public static void main(String[] args) {
  36 + String app_key = "xxxxxxxxxxx"; //开发者帐号对应的key. 请开发者谨慎保管此值。
  37 + Map<String, String> map = new HashMap<String,String>();
  38 +
  39 + map.put("appId","xxxxxxxxxx"); //开发者帐号对应的10位ID ,所有接口参数都必须有此参数。
  40 + map.put("param1_keyname", "Parm1_vaule"); //接口需要的参数1
  41 + map.put("param2_keyname", "Parm2_vaule"); //接口需要的参数2 。。。 等等
  42 +
  43 + String getUrl = buildURL("http://api.cnlive.com/open/api2/xxxxxxx",map, app_key);
  44 + System.out.println(getUrl);
  45 + }
  46 +
  47 + //生成post方式的请求参数签名
  48 + public static void main(String[] args) {
  49 + String app_key = "xxxxxxxxxxx"; //开发者帐号对应的key. 请开发者谨慎保管此值。
  50 + Map<String, String> map = new HashMap<String,String>();
  51 +
  52 + map.put("appId","xxxxxxxxxx"); //开发者帐号对应的10位ID ,所有接口参数都必须有此参数。
  53 + map.put("param1_keyname", "Parm1_vaule"); //接口需要的参数1
  54 + map.put("param2_keyname", "Parm2_vaule"); //接口需要的参数2 。。。 等等
  55 +
  56 + String post_param_signed = sign(map, app_key);
  57 + System.out.println(post_param_signed);
  58 + }
  59 +
  60 + /**
  61 + * 生成URL
  62 + * @param url
  63 + * @param params
  64 + * @param app_key
  65 + * @return
  66 + */
  67 + public static String buildURL(String url,Map<String,String> params,String app_key){
  68 + Map<String,String> map = order(params);
  69 + if(map.containsKey("sign")){
  70 + map.remove("sign");
  71 + }
  72 + String str = mapJoin(map,true,false);
  73 + String sign = SHA1.SHA1Digest(str+"&key="+app_key).toUpperCase();
  74 + map.put("sign", sign);
  75 + return url+"?"+mapJoin(map, false, true);
  76 + }
  77 +
  78 + /**
  79 + * Map key 排序
  80 + * @param map
  81 + * @return
  82 + */
  83 + private static Map<String,String> order(Map<String, String> map){
  84 + HashMap<String, String> tempMap = new LinkedHashMap<String, String>();
  85 + List<Entry<String, String>> infoIds = new ArrayList<Entry<String, String>>( map.entrySet());
  86 +
  87 + Collections.sort(infoIds, new Comparator<Entry<String, String>>() {
  88 + public int compare(Entry<String, String> o1,Entry<String, String> o2) {
  89 + return (o1.getKey()).toString().compareTo(o2.getKey());
  90 + }
  91 + });
  92 +
  93 + for (int i = 0; i < infoIds.size(); i++) {
  94 + Entry<String, String> item = infoIds.get(i);
  95 + tempMap.put(item.getKey(), item.getValue());
  96 + }
  97 + return tempMap;
  98 + }
  99 +
  100 + /**
  101 + * url 参数串连
  102 + * @param map
  103 + * @param keyLower
  104 + * @param valueUrlencode
  105 + * @return
  106 + */
  107 + private static String mapJoin(Map<String, String> map,boolean keyLower,boolean valueUrlencode){
  108 + StringBuilder stringBuilder = new StringBuilder();
  109 + for(String key :map.keySet()){
  110 + if(map.get(key)!=null&&!"".equals(map.get(key))){
  111 + try {
  112 + stringBuilder.append(key)
  113 + .append("=")
  114 + .append(valueUrlencode?URLEncoder.encode(map.get(key),"utf-8").replace("+", "%20"):map.get(key))
  115 + .append("&");
  116 + } catch (UnsupportedEncodingException e) {
  117 + e.printStackTrace();
  118 + }
  119 + }
  120 + }
  121 + if(stringBuilder.length()>0){
  122 + stringBuilder.deleteCharAt(stringBuilder.length()-1);
  123 + }
  124 + return stringBuilder.toString();
  125 + }
  126 +```
0 \ No newline at end of file 127 \ No newline at end of file