一、算法简介

签名生成的通用步骤如下:

第一步,设所有发送或者接收到的数据为集合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版本-其他地方都可通用相关推荐

  1. Java对接微信支付(完整全流程)

    Java对接微信支付及支付回调通知的全流程 一.所用框架.对接微信支付我们技术组用的是payment框架,因为该框架已整合springboot因此很方便快捷 <dependency>< ...

  2. java对接微信支付收不到支付通知问题(亲身实践)

    问题描述: 用java对接微信支付时,统一下单接口正常.但是用户扫码付款成功后,设置用于回调的notify_url对应的接口并没有收到请求(这个url测试过,是正常的且外网能访问的). 由于官方文档没 ...

  3. 微信小程序-JAVA实现微信支付功能(微信支付2.0)

    微信小程序-JAVA实现微信支付功能(微信支付2.0) 一.前言 本博客主要介绍JAVA后台与微信小程序(UNI-APP或者原生微信小程序)的微信支付的实现,如果是APP或者H5的开发暂时不支持,具体 ...

  4. java集成微信支付(完整流程)

    java集成微信支付(完整流程) 1.申请微信支付能力 * 要想使用微信支付能力,不管是app支付.公众号支付.h5支付等支付方式都需要先在微信商户平台申请开通支付能力.* 申请开通支付能力的资料有公 ...

  5. 【java】微信支付生成签名的过程

    关于签名的算法,api提供的原文是: 1.签名算法 签名生成的通用步骤如下: 第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用U ...

  6. java微信签名什么意思,java,_求java实现微信签名,java - phpStudy

    求java实现微信签名 1.求java怎么实现微信签名 package sign; import java.security.MessageDigest; public class MD5Util { ...

  7. 微信支付2.0版本,更换参数即可使用

    微信支付2.0版本,更换参数即可使用 前段时间公司开发需要用到微信支付,查阅了微信官网,支付1.0的说后期不再维护了,就研究着2.0的json主流格式,现在当个经验交流,供大家借鉴,只需要替换成自己公 ...

  8. 微信支付API V3版本JAVA开发指南

    微信支付版本V3的Demo,在官方上下载下来,压根就是不能直接用的东西,你要想学会用,你就得一层一层的看源码,看文档,要求你事无巨细的做一个接入者. 如果接入API需要让人看源码来理解,我觉得是一件让 ...

  9. 微信支付(java版本)

    废话不多说,直接进入主体: 最近在做支付相关的项目,大致需求是用户在公众号发起订单之后调起微信支付.我也是第一次做微信支付,在这里把方法记录下来,也为了给初次做微信支付的同行们提供点经验. 一:接入准 ...

最新文章

  1. 如何发现数据中的异常值?对异常值是怎么处理的?
  2. BootStrap轮播图失效
  3. Angular Route数据结构里常用字段使用方法一览
  4. FPGA学习之路—应用程序—原码二位乘法器及Verilog代码分析
  5. 【ArcGIS微课1000例】0016:ArcGIS书签操作(添加书签、管理书签)知多少?
  6. matlab命令 脑电波,基于Matlab的脑电波信号处理
  7. 聊聊自己的高效学习方法~
  8. 解决Kscope中文乱码问题
  9. Android Camera 3D效果
  10. android语音识别
  11. python实现给微信指定好友定时发消息
  12. 高价值的聚合支付源码修复版+带后台/语音播报
  13. 超大源码库使用git clone --mirror克隆远程代码制作镜像失败的处理办法
  14. easyboot的一个严重不足
  15. C++学习笔记:实现向量类的加减赋值运算,重载运算符
  16. 解决ES数据偏移问题
  17. 可口可乐和百事可乐查出杀虫剂成分!
  18. GCC-PHAT算法
  19. Scratch创作-从入门到精通
  20. php 图片处理羽化,ps中羽化是什么意思

热门文章

  1. SpringMVC深度探险(三) —— DispatcherServlet与初始化主线
  2. 04. 字符串合并与拆分写法小结
  3. Android Studio设置字体
  4. 线程同步之经典生产者-消费者模型
  5. 《转》atomic assign retain
  6. oracle 10g 手动创建scott(tiger) schema
  7. HtmlParser 简介
  8. 水晶报表10 注册码
  9. leetcode 3.无重复字符的最长子串(中等)
  10. 刚安装了Fedora32,尝尝鲜~,哈哈~~~