java paysign_微信支付签名算法java版本-其他地方都可通用
一、算法简介
签名生成的通用步骤如下:
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
◆ 参数名ASCII码从小到大排序(字典序);
◆ 如果参数的值为空不参与签名;
◆ 参数名区分大小写;
◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
二、代码实现
public class WxPaySignUtils {
public static final String MD5 = "MD5";
public static final String HMAC_SHA256 = "HMAC-SHA256";
/**
* 签名
* @param data
* @param key
* @param signType
* @return
*/
public static String sign(Map data,String key,String signType){
if(null == data || data.size() == 0 || null == key || key.trim().equals("") || null == signType || !(MD5.equals(signType) || HMAC_SHA256.equals(signType))){
throw new RuntimeException("参数缺失");
}
// 签名值
String signKey = "";
SortedMap sortedMap = new TreeMap<>(data);
String paramStr = "";
for (Map.Entry stringStringEntry : sortedMap.entrySet()) {
if(paramStr.equals("")){
paramStr = stringStringEntry.getKey() + "=" + stringStringEntry.getValue();
}else{
paramStr = paramStr + "&" +stringStringEntry.getKey() + "=" + stringStringEntry.getValue();
}
}
paramStr = paramStr + "&key=" + key;
if(signType.equals(MD5)){
signKey = getMD5(paramStr);
}else{
signKey = getHmacSha256(paramStr,key);
}
return signKey.toUpperCase();
}
/**
* 获取MD5
* @param str
* @return
*/
private static String getMD5(String str) {
try {
// 生成一个MD5加密计算摘要
MessageDigest md = MessageDigest.getInstance("MD5");
// 计算md5函数
md.update(str.getBytes());
return byteArrayToHexString(md.digest());
} catch (Exception e) {
throw new RuntimeException("MD5加密出现错误");
}
}
/**
* 获取HmacSha256
* @param message
* @param key
* @return
*/
private static String getHmacSha256(String message,String key){
String outPut= null;
try{
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(),"HmacSHA256");
sha256_HMAC.init(secret_key);
byte[] bytes = sha256_HMAC.doFinal(message.getBytes());
outPut = byteArrayToHexString(bytes);
}catch (Exception e){
throw new RuntimeException("HmacSHA256加密出现错误");
}
return outPut;
}
/**
* byte数组转16进制字符串
* @param b
* @return
*/
private static String byteArrayToHexString(byte[] b) {
StringBuilder sb = new StringBuilder();
String stmp;
for (int n = 0; b != null && n < b.length; n++) {
stmp = Integer.toHexString(b[n] & 0XFF);
if (stmp.length() == 1)
sb.append('0');
sb.append(stmp);
}
return sb.toString().toLowerCase();
}
}
来源:oschina
链接:https://my.oschina.net/fellowtraveler/blog/4781077
java paysign_微信支付签名算法java版本-其他地方都可通用相关推荐
- Java对接微信支付(完整全流程)
Java对接微信支付及支付回调通知的全流程 一.所用框架.对接微信支付我们技术组用的是payment框架,因为该框架已整合springboot因此很方便快捷 <dependency>< ...
- java对接微信支付收不到支付通知问题(亲身实践)
问题描述: 用java对接微信支付时,统一下单接口正常.但是用户扫码付款成功后,设置用于回调的notify_url对应的接口并没有收到请求(这个url测试过,是正常的且外网能访问的). 由于官方文档没 ...
- 微信小程序-JAVA实现微信支付功能(微信支付2.0)
微信小程序-JAVA实现微信支付功能(微信支付2.0) 一.前言 本博客主要介绍JAVA后台与微信小程序(UNI-APP或者原生微信小程序)的微信支付的实现,如果是APP或者H5的开发暂时不支持,具体 ...
- java集成微信支付(完整流程)
java集成微信支付(完整流程) 1.申请微信支付能力 * 要想使用微信支付能力,不管是app支付.公众号支付.h5支付等支付方式都需要先在微信商户平台申请开通支付能力.* 申请开通支付能力的资料有公 ...
- 【java】微信支付生成签名的过程
关于签名的算法,api提供的原文是: 1.签名算法 签名生成的通用步骤如下: 第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用U ...
- java微信签名什么意思,java,_求java实现微信签名,java - phpStudy
求java实现微信签名 1.求java怎么实现微信签名 package sign; import java.security.MessageDigest; public class MD5Util { ...
- 微信支付2.0版本,更换参数即可使用
微信支付2.0版本,更换参数即可使用 前段时间公司开发需要用到微信支付,查阅了微信官网,支付1.0的说后期不再维护了,就研究着2.0的json主流格式,现在当个经验交流,供大家借鉴,只需要替换成自己公 ...
- 微信支付API V3版本JAVA开发指南
微信支付版本V3的Demo,在官方上下载下来,压根就是不能直接用的东西,你要想学会用,你就得一层一层的看源码,看文档,要求你事无巨细的做一个接入者. 如果接入API需要让人看源码来理解,我觉得是一件让 ...
- 微信支付(java版本)
废话不多说,直接进入主体: 最近在做支付相关的项目,大致需求是用户在公众号发起订单之后调起微信支付.我也是第一次做微信支付,在这里把方法记录下来,也为了给初次做微信支付的同行们提供点经验. 一:接入准 ...
最新文章
- 如何发现数据中的异常值?对异常值是怎么处理的?
- BootStrap轮播图失效
- Angular Route数据结构里常用字段使用方法一览
- FPGA学习之路—应用程序—原码二位乘法器及Verilog代码分析
- 【ArcGIS微课1000例】0016:ArcGIS书签操作(添加书签、管理书签)知多少?
- matlab命令 脑电波,基于Matlab的脑电波信号处理
- 聊聊自己的高效学习方法~
- 解决Kscope中文乱码问题
- Android Camera 3D效果
- android语音识别
- python实现给微信指定好友定时发消息
- 高价值的聚合支付源码修复版+带后台/语音播报
- 超大源码库使用git clone --mirror克隆远程代码制作镜像失败的处理办法
- easyboot的一个严重不足
- C++学习笔记:实现向量类的加减赋值运算,重载运算符
- 解决ES数据偏移问题
- 可口可乐和百事可乐查出杀虫剂成分!
- GCC-PHAT算法
- Scratch创作-从入门到精通
- php 图片处理羽化,ps中羽化是什么意思