import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.*;
import java.util.Map; public class order {
private static String create_order(String ip, String merchantId, String key, String payWay, String amount)
throws NoSuchAlgorithmException, InvalidKeyException, IOException {
// url参数
Map<String, Object> url_map = new TreeMap<String, Object>();
url_map.put("merchantId", merchantId);
url_map.put("signatureMethod", "HmacSHA256");
url_map.put("signatureVersion", "1");
url_map.put("timestamp", System.currentTimeMillis()); // url参数拼接
StringBuilder url_data = new StringBuilder();
for (Map.Entry<String, Object> url :url_map.entrySet()) {
url_data.append(url.getKey()).append("=").append(url.getValue()).append("&");
}
url_data = new StringBuilder(url_data.substring(0, url_data.length() - 1));
// System.out.println(url_data); // body参数
Map<String, Object> body_map = new TreeMap<String, Object>();
body_map.put("jUserId", "666666");
body_map.put("jUserIp", "110.110.110.110");
body_map.put("jOrderId", Long.toString(System.currentTimeMillis()));
body_map.put("orderType", "1");
body_map.put("payWay", payWay);
body_map.put("amount", amount);
body_map.put("currency", "CNY");
body_map.put("jUserName", "奥里给");
body_map.put("notifyUrl", "https://test.com"); // 全部参数
Map<String, Object> all_map = new TreeMap<String, Object>();
all_map.putAll(url_map);
all_map.putAll(body_map); // 参数拼接
StringBuilder all_data = new StringBuilder();
for (Map.Entry<String, Object> url :all_map.entrySet()) {
all_data.append(url.getKey()).append("=").append(url.getValue()).append("&");
} all_data = new StringBuilder(all_data.substring(0, all_data.length() - 1));
// System.out.println("data:" + all_data); // HmacSHA256加密
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
sha256_HMAC.init(secret_key);
byte[] array = sha256_HMAC.doFinal(all_data.toString().getBytes(StandardCharsets.UTF_8));
StringBuilder sec = new StringBuilder();
for (byte item : array) {
sec.append(Integer.toHexString((item & 0xFF) | 0x100), 1, 3);
}
String signature_data = sec.toString().toUpperCase();
System.out.println("signature:" + signature_data); String URL = ip + "?" + url_data + "&signature=" + signature_data;
System.out.println("url:" + URL);
HttpPost httppost = new HttpPost(URL); // 请求body参数拼接
StringBuilder list_data = new StringBuilder();
for (Map.Entry<String, Object> m :body_map.entrySet()) {
list_data.append(m.getKey()).append("=").append(m.getValue()).append("&");
}
list_data = new StringBuilder(list_data.substring(0, list_data.length() - 1));
System.out.println("data:" + list_data); // 创建订单-发送请求
StringEntity entity = new StringEntity(list_data.toString(), "utf-8");
entity.setContentEncoding("UTF-8");
entity.setContentType("application/x-www-form-urlencoded");
httppost.setEntity(entity);
HttpClient httpClient = new DefaultHttpClient();
HttpResponse response = httpClient.execute(httppost);
String strResult = EntityUtils.toString(response.getEntity());
System.out.println("result:" + strResult + "\t");
httppost.releaseConnection(); return strResult;
} public static void main(String[] args) throws Exception {
create_order("https://test.com", "merchantId",
"key", "pay", "666");
}
}

java键对值SHA256加密接口请求的更多相关文章

  1. 接口自动化:HttpClient + TestNG + Java(四) - 封装和测试post方法请求

    在上一篇中,我们对第一个自动化接口测试用例做了初步优化和断言,这一篇我们处理POST请求. 4.1 发送POST方法请求 post方法和get方法是我们在做接口测试时,绝大部分场景下要应对的主要方法. ...

  2. 【转】js生成接口请求参数签名加密

    js生成接口请求参数签名加密 签名算法规则: 第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=v ...

  3. C#、Java和JS实现SHA256+BASE64加密总结

    C#.Java和JS实现SHA256+BASE64加密总结 --莫非(www.muphy.me) 原理 首先,通过编码格式(UTF-8.ASCII等,如果含有汉字等字符,编码格式不同加密结果也不同)获 ...

  4. C# 动态创建SQL数据库(二) 在.net core web项目中生成二维码 后台Post/Get 请求接口 方式 WebForm 页面ajax 请求后台页面 方法 实现输入框小数多 自动进位展示,编辑时实际值不变 快速掌握Gif动态图实现代码 C#处理和对接HTTP接口请求

    C# 动态创建SQL数据库(二) 使用Entity Framework  创建数据库与表 前面文章有说到使用SQL语句动态创建数据库与数据表,这次直接使用Entriy Framwork 的ORM对象关 ...

  5. SpringBoot整合knife4j框架(可生成离线接口文档),并设置接口请求头token默认值

    功能和swagger类似 官网地址:https://doc.xiaominfo.com/knife4j/ 这个框架可以设置返回字段的描述 引入依赖 <dependency> <gro ...

  6. SpringBoot整合Swagger框架 ,并设置接口请求头token默认值

      引入maven依赖 <!-- swagger2--> <dependency> <groupId>io.springfox</groupId> &l ...

  7. Android(java)学习笔记105:Map集合的遍历之键值对对象找键和值

    package cn.itcast_01; import java.util.HashMap; import java.util.Map; import java.util.Set; /* * Map ...

  8. Android(java)学习笔记104:Map集合的遍历之键找值

    package cn.itcast_01; import java.util.HashMap; import java.util.Map; import java.util.Set; /* * Map ...

  9. Java基础知识强化之集合框架笔记53:Map集合之Map集合的遍历 键值对对象找键和值

    1. Map集合的遍历(键值对对象找键和值) Map -- 夫妻对  思路:  A: 获取所有结婚证的集合  B: 遍历结婚证的集合,得到每一个结婚证  C: 根据结婚证获取丈夫和妻子 转换:  A: ...

随机推荐

  1. 序列化流(ObjectOutputStream、ObjectInputStream)

    1.序列化流(ObjectOutputStream) package demo10.objstream; /* java.io.ObjectOutputStream extends OutputStr ...

  2. 使用正则表达式限制<kbd>QLineEdit</kbd>不能输入大于某个整数

    使用正则表达式限制QLineEdit不能输入大于某个整数,即:使用正则表达式,匹配不大于某个整数 举例:匹配不大于4567 * 原理分析: 匹配不大于4567这个数,所以第一个想到的是只要小于4567 ...

  3. 在win10的Linux子系统(WSL)上搭载python编程环境

    为什么使用WSL进行python编程 WSL,全称Windows Subsystem for Linux.简言之,win10提供了一个子Linux系统,可以解决虚拟机和双系统的系统之间阻隔的问题而不影 ...

  4. Chrome扩展应用Postman地址(直接搜是搜不到的)

    https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop

  5. rcp

    rcp的命令 rcp,远程文件复制.rcp既可以在本地主机和远程主机之间进行文件复制,也可以用于在两个远程主机之间进行文件复制.除了复制文件外,rcp也可以用于目录复制,只需要加参数-r. rcp的命 ...

  6. Linux图形界面安装Oracle11G(Centos7)

    以Centos7为列 创建运行Oracle数据库的系统用户和用户组 #切换root用户 [px@localhost /]$ su - root [px@localhost /]$ su - root ...

  7. vim缩写

    vim缩写可以简化输入,如在Python调试中的logging.warning可以缩写为lgw,在使用时会提高效率. 一.设置缩写 在~/.vimrc增加: :abbreviate lgw loggi ...

  8. C言语--冒泡排序

    /* 冒泡排序,从小到大 */ include<stdio.h> int main(void) { int i; int t; int p; int val; int a[6]; for( ...

  9. Linux环境下MySQL 5.6安装与配置----亲测有效----纯离线安装

    一.安装MySQL 1.下载安装包 mysql-5.6.40-linux-glibc2.12-x86_64.tar.gz 下载地址: https://dev.mysql.com/get/Downloa ...

  10. 2020重新出发,MySql基础,MySql视图&索引&存储过程&触发器

    @ 目录 视图是什么 视图的优点 1) 定制用户数据,聚焦特定的数据 2) 简化数据操作 3) 提高数据的安全性 4) 共享所需数据 5) 更改数据格式 6) 重用 SQL 语句 MySQL创建视图 ...