AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
#### 签名生成的通用步骤如下: 第一步:设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。 特别注意以下重要规则: ◆ 参数名ASCII码从小到大排序(字典序); ◆ 如果参数的值为空不参与签名; ◆ 参数名区分大小写; ◆ 验证调用返回或支付中心主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。 ◆ 支付中心接口可能增加字段,验证签名时必须支持增加的扩展字段 第二步:在stringA最后拼接上key`[即 StringA +"&key=" + 私钥 ]`得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。 java代码签名示例: ~~~ private static String encodingCharset = "UTF-8"; ~~~ ~~~ /** * 计算签名 * @param map 参数Map * @param key 商户秘钥 * @return */ public static String getSign(Map<String,Object> map, String key){ ArrayList<String> list = new ArrayList<String>(); for(Map.Entry<String,Object> entry:map.entrySet()){ if(null != entry.getValue() && !"".equals(entry.getValue())){ list.add(entry.getKey() + "=" + entry.getValue() + "&"); } } int size = list.size(); String [] arrayToSort = list.toArray(new String[size]); Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER); StringBuilder sb = new StringBuilder(); for(int i = 0; i < size; i ++) { sb.append(arrayToSort[i]); } String result = sb.toString(); result += "key=" + key; log.info("signStr:{}", result); result = md5(result, encodingCharset).toUpperCase(); log.info("sign:{}", result); return result; } ~~~ ~~~ public static String md5(String value, String charset) { MessageDigest md = null; try { byte[] data = value.getBytes(charset); md = MessageDigest.getInstance("MD5"); byte[] digestData = md.digest(data); return toHex(digestData); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return null; } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; } } public static String toHex(byte input[]) { if (input == null) { return null; } StringBuffer output = new StringBuffer(input.length * 2); for (int i = 0; i < input.length; i++) { int current = input[i] & 0xff; if (current < 16) { output.append("0"); } output.append(Integer.toString(current, 16)); } return output.toString(); } ~~~