每一个值从a到z的顺序排序,若遇到相同首字母,则看第二个字母,以此类推
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注意
- 计算之前需要将原文以UTF-8字符集编码为字节数组;
- 根据HTTP协议要求,传递参数的值中如果含有特殊字符(如@、+、/),该值需要做URL Encoding,这样服务中心才能接收到正确的参数值;
- 不管是否含有特殊字符,安全码原文使用原始值。
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表示业务参数
appId
和serviceName
表示平台参数
YYY表示APIKey,原文末尾
3.4.4返回值安全码原文格式
安全码原文中包含status、message、data、APIKey四部分
- 比如 “根据票据代码、票号、随机码”接口失败时安全码原文:
APIKey=XXX&message
=message原文&status
=status原文 - 比如 “根据票据代码、票号、随机码”接口成功时安全码原文:
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的顺序排序,若遇到相同首字母,则看第二个字母,以此类推相关推荐
- 输入一个字符串,将其中大写字母转换为对应小写字母之后的第五个字母,若原始大写字母为V~Z, 则转换为对应小写字母的值减21。其他字符不变,输出转换.
输入一个字符串,将其中大写字母转换为对应小写字母之后的第五个字母,若原始大写字母为V-Z, 则转换为对应小写字母的值减21.其他字符不变,输出转换. #include<stdio.h> ...
- C语言编程>第二十五周 ② 下列程序中,函数fun的功能是:将大写字母转换为对应小写字母之后的第五个字母,若为小写字母为v~z,使小写字母的值减21,转换后的小写字母作为函数值返回。
例题:下列程序中,函数fun的功能是:将大写字母转换为对应小写字母之后的第五个字母,若为小写字母为v-z,使小写字母的值减21,转换后的小写字母作为函数值返回. 例如,若形参是字母A,则转换为小写字母 ...
- pandas使用groupby.last函数获取每个组中的最后一个值实战:groupby.last函数获取每个组中的最后一个值、groupby.nth函数获取每个组中的最后一个值
pandas使用groupby.last函数获取每个组中的最后一个值实战:groupby.last函数获取每个组中的最后一个值.groupby.nth函数获取每个组中的最后一个值 目录
- oracle学习-存储过程返回一个值,和返回一个结果集
一.返回一个值 --创建存储过程create or replace procedure sp_hu_test(spcode in varchar2,spname out varchar2)is beg ...
- 常考数据结构与算法----给定一个二叉树和一个值 sum,请找出所有的根节点到叶子节点的节点值之和等于sum 的路径,
题目描述 给定一个二叉树和一个值sum,请找出所有的根节点到叶子节点的节点值之和等于sum 的路径, 例如: 给出如下的二叉树,sum=22, 返回 [ [5,4,11,2], [5,8,9] ] 示 ...
- dropdownlist总是获取第一个值
dropdownlist总是获取第一个值 造成这种情况的原因是每选一次就向服务器回传一次,然后就把当前页面重新刷新一次,所以选择后看到的总是第一条选择项,解决的办法: 1.在后台页面的pre_load ...
- php中间值,比较当前值和下一个值,并在中间推送数组(Adodb)PHP
我有一个用AdodbConn从表中选择的函数,问题是如何将当前值与循环中的下一个值进行比较.因为我必须在当前值和下一个值之间推一个值. public function list() { $errMsg ...
- 算法—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 ...
- php 去除二维数组中的包含某一个值的数组
今天写程序,遇到一个的问题. 我想把一个二维数组中的包含某一个值的数组去掉,并重新生成索引下标 例如: $all_zone=array(array("id"=>"R ...
最新文章
- 华中农大在土壤矿物-微生物相互作用研究方面取得新进展
- 大合集!80 篇 CVPR2020 论文分方向整理: 目标检测/图像分割/姿态估计等(附链接&下载)...
- apache强制https访问
- iptable 命令
- 打印合同_批量打印合同用印申请单
- Linux之shell中的(),(()),{},=,==:{var}(cmd)((exp))=赋值==判断
- 开发一款自动指向特定页面元素的jQuery插件:jQuery PointPoint
- oid 值 内存使用_如何使用Choerodon LDAP以及配置定时任务
- sql 替换text字段中的指定字符
- lua检测表中是否有某个值_Lua基础知识总结(入职面试题)
- C语言:斗地主发牌程序
- python解常微分方程龙格库_求解常微分方程组初值问题的龙格库塔法分析及其C代码...
- 灯具类产品各国EMC认证标准大全
- 玩家浅谈MID平板电脑主流中端方案
- 【拓展】腾讯十大最受欢迎的开源项目!
- 二叉平衡树(C++)
- 【推荐架构day2】微博怎么给你推荐信息的:基本原理
- python寻峰算法_python/scipy的寻峰算法
- 架构师的职责是什么?
- 【原创】大叔经验分享(30)CM开启kerberos
热门文章
- GeForce MX150相对应的NVIDIA CUDA版本_MX150显卡满血版和MX150显卡非满血版有什么区别?...
- MSP432中断初试
- msp432上运行linux,MSP432实现printf 输出
- 我和计算机做游戏课后反思,语言活动设计《我和风儿做游戏》
- 前端html赋值 js方法
- 【Win7下教你更改平板显示器缩放】
- RadioGroup中RadioButton默认选中问题
- Opencascade 导入.stp、.stl、.igs、.brep文件
- 回家的行囊装着“年”
- Microsoft Visual Studio 2010 下载及学习资料大全