首页 > 编程语言 >Java 三方接口PHP写法;doHmacSHA2; 将字节数组转换成16进制字符串;Mac.getInstance;HmacSHA256;

Java 三方接口PHP写法;doHmacSHA2; 将字节数组转换成16进制字符串;Mac.getInstance;HmacSHA256;

时间:2023-05-08 10:24:45浏览次数:45  
标签:Java String getInstance 16 timestamp http return new import

先看一段 Java 代码,一个签名过程

  1 package com.sixents.bss.filter;
  2 
  3 
  4 import org.apache.http.HttpEntity;
  5 import org.apache.http.NameValuePair;
  6 import org.apache.http.client.entity.UrlEncodedFormEntity;
  7 import org.apache.http.client.methods.CloseableHttpResponse;
  8 import org.apache.http.client.methods.HttpPost;
  9 import org.apache.http.impl.client.CloseableHttpClient;
 10 import org.apache.http.impl.client.HttpClients;
 11 import org.apache.http.message.BasicNameValuePair;
 12 import org.apache.http.util.EntityUtils;
 13 
 14 import javax.crypto.Mac;
 15 import javax.crypto.spec.SecretKeySpec;
 16 import java.nio.charset.Charset;
 17 import java.security.InvalidKeyException;
 18 import java.security.NoSuchAlgorithmException;
 19 import java.util.*;
 20 import java.util.Map.Entry;
 21 
 22 /**
 23  * @author zy
 24  * date 2021-08-19
 25  */
 26 public class demoTest {
 27 
 28 
 29     public static void main(String[] args) throws Exception{
 30         String sik = "0797517995";//请填写您申请的sik
 31         String sis = "inuHf8DvK+z3lqor168yDcx60lAcMCtAagcchaxWRlvWTq6WImQ4zQVEibnwhegShrQNft8zvGXA" +
 32                 "C6TSH4gjQzmaTSeNzugv0dTSj9m2eiQ=";//请填写您申请的sis
 33         String apiName = "get-account-list";// 访问的API接口名称
 34         String apiPath = "/rest/" + apiName + "/" + "sik" + "/"+sik;// API路径,注意没有问号
 35         // 参数列表(加签的时候需要进行字典序升序排序)
 36         Map<String, String> paramMap = new HashMap<String, String>();
 37         paramMap.put("pageNum", "1");
 38         paramMap.put("pageSize", "20");
 39         paramMap.put("serverType", "1");
 40      // 毫秒级时间戳,一定是毫秒级!重要!!!
 41         String timestamp = String.valueOf(System.currentTimeMillis());
 42         System.out.println("时间戳:"+timestamp);
 43         String signatureStr = demoTest.doHmacSHA2(apiPath, paramMap, sis, timestamp);
 44         System.out.println("加签值:"+signatureStr);//打印sign值
 45 
 46         String qxwzUrl = "http://localhost:21009";//服务器地址
 47         String queryUrl = qxwzUrl + apiPath + "?_sign=" + signatureStr;
 48         System.out.println(queryUrl);
 49 
 50         //发送http请求,获取返回值
 51         doHttpPost(queryUrl,paramMap,timestamp);
 52     }
 53 
 54     public static void doHttpPost(String url,Map<String, String> paramMap, String timestamp) throws Exception {
 55         CloseableHttpClient httpClient = HttpClients.createDefault();
 56         HttpPost httpPost = new HttpPost(url);
 57         httpPost.setHeader("content-type", "application/json");
 58         httpPost.setHeader("wz-acs-timestamp", timestamp);//此处注意加上时间戳,否则http请求将无效
 59         List<NameValuePair> nvps = new ArrayList<NameValuePair>();
 60         for (Map.Entry<String, String> entry : paramMap.entrySet()){
 61             if (entry.getValue() == null) continue;
 62             nvps.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
 63         }
 64         httpPost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8"));//处理中文编码的问题
 65 
 66 
 67         try {
 68             CloseableHttpResponse response = (CloseableHttpResponse) httpClient.execute(httpPost);
 69             try {
 70                 HttpEntity entity = response.getEntity();
 71                 if (entity != null) {
 72                     System.out.println("返回值:"+EntityUtils.toString(entity));
 73                     /*
 74                      * 此处针对返回结果进行不同的处理
 75                      */
 76                     EntityUtils.consume(entity);
 77                 }
 78             } finally {
 79                 response.close();
 80             }
 81 
 82         } catch (Exception e) {
 83             e.printStackTrace();
 84         }finally {
 85             if (httpPost != null) {
 86                 httpPost.releaseConnection();//释放资源
 87             }
 88             if(httpClient != null){
 89                 httpClient.close();//释放资源
 90             }
 91         }
 92     }
 93 
 94     /*
 95      * 将字节数组转换成16进制字符串
 96      * */
 97     public static String encodeHexStr(final byte[] bytes){
 98         if (bytes == null) {
 99             return null;
100         }
101         char[] digital  = "0123456789ABCDEF".toCharArray();
102         char[] result = new char[bytes.length * 2];
103         for (int i = 0; i < bytes.length; i++) {
104             result[i * 2] = digital[(bytes[i] & 0xf0) >> 4];
105             result[i * 2 + 1] = digital[bytes[i] & 0x0f];
106         }
107         return new String(result);
108     }
109 
110     /*
111      * 加签算法
112      * */
113     public static <T> String doHmacSHA2(String path, Map<String, T> params, String key, String timestamp) {
114 
115         List<Map.Entry<String, T>> parameters = new ArrayList<Map.Entry<String,T>>(params.entrySet());
116         SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), "HmacSHA256");
117         Charset CHARSET_UTF8 = Charset.forName("UTF-8");
118         Mac mac;
119         try {
120             mac = Mac.getInstance("HmacSHA256");
121             mac.init(signingKey);
122         } catch (NoSuchAlgorithmException e) {
123             throw new IllegalStateException(e.getMessage(), e);
124         } catch (InvalidKeyException e) {
125             throw new IllegalStateException(e.getMessage(), e);
126         }
127         if(path != null && path.length() > 0){
128             mac.update(path.getBytes(CHARSET_UTF8));
129         }
130         if(parameters != null){
131             Collections.sort(parameters, new MapEntryComparator<String, T>());
132             for (Map.Entry<String, T> parameter : parameters) {
133                 byte[] name = parameter.getKey().getBytes(CHARSET_UTF8);
134                 Object value = parameter.getValue();
135                 if(value instanceof Collection){
136                     for (Object o : (Collection)value){
137                         mac.update(name);
138                         if(o != null){
139                             mac.update(o.toString().getBytes(CHARSET_UTF8));
140                         }
141                     }
142                 }else{
143                     mac.update(name);
144                     if(value != null){
145                         mac.update(value.toString().getBytes(CHARSET_UTF8));
146                     }
147                 }
148             }
149         }
150         if(timestamp != null && timestamp.length() > 0){
151             mac.update(timestamp.toString().getBytes(CHARSET_UTF8));
152         }
153         return encodeHexStr(mac.doFinal());
154     }
155 }
156 
157 /*
158  * Map参数排序类
159  * */
160 
161 class MapEntryComparator<K, V> implements Comparator<Map.Entry<K, V>> {
162 
163     @Override
164     public int compare(Entry<K, V> o1, Entry<K, V> o2) {
165         if (o1 == o2) {
166             return 0;
167         }
168         final String k1 = o1.getKey().toString();
169         final String k2 = o2.getKey().toString();
170         int l1 = k1.length();
171         int l2a = k2.length();
172         for (int i = 0; i < l1; i++) {
173             char c1 = k1.charAt(i);
174             char c2;
175             if (i < l2a) {
176                 c2 = k2.charAt(i);
177             } else {
178                 return 1;
179             }
180             if (c1 > c2) {
181                 return 1;
182             } else if (c1 < c2) {
183                 return -1;
184             }
185         }
186         if (l1 < l2a) {
187             return -1;
188         }else if(l1 == l2a) {
189             return 0;
190         }else {
191             return -1;
192         }
193     }
194 
195 }

 

PHP 写法如此简单:

 1     private function get_sign($path, $params, $timestamp)
 2     {
 3         if (empty($params)) {
 4             die('miss params');
 5         }
 6 
 7         // 排序
 8         ksort($params);
 9 
10         $ctx = hash_init('sha256', HASH_HMAC, $this->sis);
11 
12         hash_update($ctx, utf8_encode($path));
13       
14         foreach ($params as $key => $value) { // 如果 $value 还是数组再循环一次即可 
15             hash_update($ctx, utf8_encode($key));
16             hash_update($ctx, utf8_encode($value));
17         }
18 
19         hash_update($ctx, utf8_encode($timestamp));
20 
21         return strtoupper(hash_final($ctx));
22     }
23     

 

标签:Java,String,getInstance,16,timestamp,http,return,new,import
From: https://www.cnblogs.com/qk1314/p/17380898.html

相关文章

  • 29基于java的在线考试系统设计与实现
    本章节来介绍一个基于java的在线考试系统的实现系统概要近年来,随着世界各国需要参加考核的人员与日俱增,单纯依靠传统的人工安排考场和监考人员的纸质化考试逐渐显示出了效率低,易发生冲突的缺陷,这时,在线考试系统便应运而生,此种考试方式以方便快捷高效等优点将越来越适用于如今......
  • Java开发、SpringBoot开发(狂神说Java)
    目录JavaSpringBoot开发学习(狂神说Java)SpringBoot概述微服务SpringBoot程序安装测试配置文件原理自动配置主启动类yaml语法给属性赋值的几种方式JR303校验多环境配置及配置文件位置SpringBootWeb开发理论静态资源首页模板引擎Thymeleaf语法MVC配置原理,扩展SpringMVC视图解析视......
  • java基于springboot+vue非前后端分离的学生成绩管理系统、学生信息管理系统,附源码+数
    1、项目介绍java基于springboot+vue非前后端分离的学生成绩管理系统、学生信息管理系统。本文首先介绍了学生成绩管理的技术发展背景与发展现状,然后遵循软件常规开发流程,首先针对系统选取适用的语言和开发平台,根据需求分析制定模块并设计数据库结构,再根据系统总体功能模块的设计......
  • Java的构造方法和标准JavaBean
    构造方法一、构造方法概述:构造方法也叫做构造器,构造函数,平时叫做构造方法二、构造方法的作用:创建对象的时候,由虚拟机自动调用,给成员变量进行初始化(赋值)三、构造方法的格式:publicclassstudent{修饰符类名(参数){​ 方法体;​ }}四、特点:方法名与类名相同,大小......
  • Java守护线程daemon介绍
    1.介绍线程分为用户线程和守护线程JVM必须确保用户线程执行完毕,但是不用等待守护线程执行完毕示例代码:publicclassTestDaemon{publicstaticvoidmain(String[]args){DaemonThreaddaemon=newDaemonThread();CustomerThreadcustomer=ne......
  • Java游戏任务背包系统设计思路
    前言在游戏开发中,游戏任务系统是必不可少的,因为任务系统是游戏的驱动,是使玩家能坚持玩下去的途径之一,也是玩家的目标。任务大体分为三块,玩家接受任务--进行任务--任务完成获得奖励。这里面包括两个系统,任务系统和背包系统,因为玩家获得的奖励需要落到玩家自己的背包里。所以我们......
  • Java多线程--让主线程等待所有子线…
    朋友让我帮忙写个程序从文本文档中导入数据到oracle数据库中,技术上没有什么难度,文档的格式都是固定的只要对应数据库中的字段解析就行了,关键在于性能。   数据量很大百万条记录,因此考虑到要用多线程并发执行,在写的过程中又遇到问题,我想统计所有子进程执行完......
  • Java练手项目(尚硅谷),后续2
    菜鸟小白,如有大佬发现错误欢迎指正,洗耳恭听。今天在练习Java尚硅谷的项目的时候,发现自己对break语句,还是不太了解,就把那个项目里面的一段循环代码拿了出来,单独放在一个小项目里,去看看,到底执行了哪句,执行顺序。发现,这样来理解比较好一些。代码如下:importjava.util.Scanner;......
  • java注解
    /***@JsonIgnore不返回*/@JsonIgnoreprivateStringsummary;/***@JsonFormat时间注解*/@JsonFormat(pattern="yyyy-MM-ddhh:mm:ss",locale="zh",timezone="GMT+8")privateDatecreateTime;/***@JsonInclude空字段不返回*/......
  • LeetCode 516. 最长回文子序列
    classSolution{public:intf[1010][1010];//f[i][j]表示s[i~j]之间的最长序列intINF=0x3f3f3f3f;intlongestPalindromeSubseq(strings){intn=s.size();s=''+s;for(intlen=1;len<=n;len++)for(inti=1;i......