3.4安全码

计算安全码使用的算法 SHA1

3.4.1安全码原文

将所有“名值对”和APIKey拼接

名值对 APIKey
key1=value1&key2=value2…每一个值从a到z的顺序排序,若遇到相同首字母,则看第二个字母,以此类推 AppId对应的APIKey值,Base64值

比如名值对字母升序之后 a=value1&b=value2&c=value3;APIKey是QVBJS2V5,安全码原文=
a=value1&b=value2&c=value3QVBJS2V5

3.4.2注意

  1. 计算之前需要将原文以UTF-8字符集编码为字节数组;
  2. 根据HTTP协议要求,传递参数的值中如果含有特殊字符(如@、+、/),该值需要做URL Encoding,这样服务中心才能接收到正确的参数值;
  3. 不管是否含有特殊字符,安全码原文使用原始值。

3.4.3请求参数安全码原文格式

安全码原文包含(1)业务参数、(2)除安全码之外平台接入参数、(3)APIKey三部分。比如 “根据票据代码、票号、随机码”接口的安全码原文:

举例
appId=XXX&dataType=XXX&eInvoiceCode=XXX&eInvoiceNumber=XXX&randomNumber=XXX&serviceName=XXXYYY

dataType=XXX&eInvoiceCode=XXX&eInvoiceNumber=XXX&randomNumber=XXX表示业务参数
appIdserviceName表示平台参数
YYY表示APIKey,原文末尾

3.4.4返回值安全码原文格式

安全码原文中包含statusmessagedata、APIKey四部分

  1. 比如 “根据票据代码、票号、随机码”接口失败时安全码原文:
    APIKey=XXX&message=message原文&status=status原文
  2. 比如 “根据票据代码、票号、随机码”接口成功时安全码原文:
    APIKey=XXX[&data=data原文]&message=message原文&status=status原文

代码参考

  • 拼接
public static void main(String[] args) throws Exception {Map<String, String>params = new HashMap<>();params.put("appId", "XXX");params.put("serviceName", "checkAccount");params.put("dataType", "json");String builderSignStr = builderSignStr(params);String apiKey = "APIKey";byte[] securityCode= EncryptUtils.hmac(apiKey, builderSignStr + apiKey);// 转化securityCode 为 base64 字符串System.out.println(securityCode);}public static String builderSignStr(Map<String, String> params) {Set<String> keySet = params.keySet();List<String>keyList = new ArrayList<String>(keySet);Collections.sort(keyList);StringBuilder sb = new StringBuilder();for (String key : keyList) {sb.append(key);sb.append("=");sb.append(params.get(key));sb.append("&");}sb.deleteCharAt(sb.length() - 1);return sb.toString();}public static String md5(String plaintext) {assert plaintext != null : "plaintext may arg not be null";byte[] bytes = null;String encoded = "";try {MessageDigest digest = MessageDigest.getInstance("MD5");digest.reset();digest.update(plaintext.getBytes(Charset.forName("utf-8")));bytes = digest.digest();encoded = Base64.encodeBytes(bytes);} catch (NoSuchAlgorithmException e) {//throw new EncryptException(e.getMessage(), e);}return encoded;}
  • 每一个值从a到z的顺序排序,若遇到相同首字母,则看第二个字母,以此类推
    public static void main(String[] args) throws Exception {java.util.SortedMap<String, String> packageParams = new TreeMap<String, String>();packageParams.put("status", "{merBillNo:2015090700000000}");packageParams.put("message", "2015090700000000");packageParams.put("data", "2015090700000000");String str = new SortedMap().createSign(packageParams);System.out.println(str);String str2 = new SortedMap().createSign2(packageParams);System.out.println(str2);}/*** 规则是:按参数名称a-z排序,遇到空值的参数不参加签名。V型知识库www.vxzsk.com*/public String createSign(java.util.SortedMap<String, String> packageParams) throws Exception {StringBuffer sb = new StringBuffer();Set<?> es = packageParams.entrySet();Iterator<?> it = es.iterator();while (it.hasNext()) {Map.Entry entry = (Map.Entry) it.next();String k = (String) entry.getKey();String v = (String) entry.getValue();if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {sb.append(k + "=" + v + "&");}}sb.append("key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");return sb.toString();}/*** 规则是:按参数名称a-z排序,遇到空值的参数不参加签名。V型知识库www.vxzsk.com*/public String createSign2(java.util.SortedMap<String, String> packageParams) throws Exception {StringBuffer sb = new StringBuffer();if (packageParams != null) {for (Map.Entry entry : packageParams.entrySet()) {String k = (String) entry.getKey();String v = (String) entry.getValue();if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {sb.append(k + "=" + v + "&");}}}sb.append("key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");return sb.toString();}

每一个值从a到z的顺序排序,若遇到相同首字母,则看第二个字母,以此类推相关推荐

  1. 输入一个字符串,将其中大写字母转换为对应小写字母之后的第五个字母,若原始大写字母为V~Z, 则转换为对应小写字母的值减21。其他字符不变,输出转换.

    输入一个字符串,将其中大写字母转换为对应小写字母之后的第五个字母,若原始大写字母为V-Z,  则转换为对应小写字母的值减21.其他字符不变,输出转换. #include<stdio.h> ...

  2. C语言编程>第二十五周 ② 下列程序中,函数fun的功能是:将大写字母转换为对应小写字母之后的第五个字母,若为小写字母为v~z,使小写字母的值减21,转换后的小写字母作为函数值返回。

    例题:下列程序中,函数fun的功能是:将大写字母转换为对应小写字母之后的第五个字母,若为小写字母为v-z,使小写字母的值减21,转换后的小写字母作为函数值返回. 例如,若形参是字母A,则转换为小写字母 ...

  3. pandas使用groupby.last函数获取每个组中的最后一个值实战:groupby.last函数获取每个组中的最后一个值、groupby.nth函数获取每个组中的最后一个值

    pandas使用groupby.last函数获取每个组中的最后一个值实战:groupby.last函数获取每个组中的最后一个值.groupby.nth函数获取每个组中的最后一个值 目录

  4. oracle学习-存储过程返回一个值,和返回一个结果集

    一.返回一个值 --创建存储过程create or replace procedure sp_hu_test(spcode in varchar2,spname out varchar2)is beg ...

  5. 常考数据结构与算法----给定一个二叉树和一个值 sum,请找出所有的根节点到叶子节点的节点值之和等于sum 的路径,

    题目描述 给定一个二叉树和一个值sum,请找出所有的根节点到叶子节点的节点值之和等于sum 的路径, 例如: 给出如下的二叉树,sum=22, 返回 [ [5,4,11,2], [5,8,9] ] 示 ...

  6. dropdownlist总是获取第一个值

    dropdownlist总是获取第一个值 造成这种情况的原因是每选一次就向服务器回传一次,然后就把当前页面重新刷新一次,所以选择后看到的总是第一条选择项,解决的办法: 1.在后台页面的pre_load ...

  7. php中间值,比较当前值和下一个值,并在中间推送数组(Adodb)PHP

    我有一个用AdodbConn从表中选择的函数,问题是如何将当前值与循环中的下一个值进行比较.因为我必须在当前值和下一个值之间推一个值. public function list() { $errMsg ...

  8. 算法—2,记一个自己的算法题 计算数字k在0到n中的出现的次数,k可能是0~9的一个值

    3 计算数字k在0到n中的出现的次数,k可能是0~9的一个值 例如n=12,k=1,在 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],我们发现1出现了5次 (1 ...

  9. php 去除二维数组中的包含某一个值的数组

    今天写程序,遇到一个的问题. 我想把一个二维数组中的包含某一个值的数组去掉,并重新生成索引下标 例如: $all_zone=array(array("id"=>"R ...

最新文章

  1. 华中农大在土壤矿物-微生物相互作用研究方面取得新进展
  2. 大合集!80 篇 CVPR2020 论文分方向整理: 目标检测/图像分割/姿态估计等(附链接&下载)...
  3. apache强制https访问
  4. iptable 命令
  5. 打印合同_批量打印合同用印申请单
  6. Linux之shell中的(),(()),{},=,==:{var}(cmd)((exp))=赋值==判断
  7. 开发一款自动指向特定页面元素的jQuery插件:jQuery PointPoint
  8. oid 值 内存使用_如何使用Choerodon LDAP以及配置定时任务
  9. sql 替换text字段中的指定字符
  10. lua检测表中是否有某个值_Lua基础知识总结(入职面试题)
  11. C语言:斗地主发牌程序
  12. python解常微分方程龙格库_求解常微分方程组初值问题的龙格库塔法分析及其C代码...
  13. 灯具类产品各国EMC认证标准大全
  14. 玩家浅谈MID平板电脑主流中端方案
  15. 【拓展】腾讯十大最受欢迎的开源项目!
  16. 二叉平衡树(C++)
  17. 【推荐架构day2】微博怎么给你推荐信息的:基本原理
  18. python寻峰算法_python/scipy的寻峰算法
  19. 架构师的职责是什么?
  20. 【原创】大叔经验分享(30)CM开启kerberos

热门文章

  1. GeForce MX150相对应的NVIDIA CUDA版本_MX150显卡满血版和MX150显卡非满血版有什么区别?...
  2. MSP432中断初试
  3. msp432上运行linux,MSP432实现printf 输出
  4. 我和计算机做游戏课后反思,语言活动设计《我和风儿做游戏》
  5. 前端html赋值 js方法
  6. 【Win7下教你更改平板显示器缩放】
  7. RadioGroup中RadioButton默认选中问题
  8. Opencascade 导入.stp、.stl、.igs、.brep文件
  9. 回家的行囊装着“年”
  10. Microsoft Visual Studio 2010 下载及学习资料大全