关于签名的算法,api提供的原文是:

1.签名算法

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

第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。

特别注意以下重要规则:

  1.  ◆ 参数名ASCII码从小到大排序(字典序);
  2.  ◆ 如果参数的值为空不参与签名;
  3.  ◆ 参数名区分大小写;
  4.  ◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
  5.  ◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段

第二步,在stringA最后拼接上key=(API密钥的值)得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。

举例:

假设传送的参数如下:

appid: wxd930ea5d5a258f4f

mch_id: 10000100

device_info: 1000

body: test

nonce_str: ibuaiVcKdpRxkhJA

第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:

stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA";

第二步:拼接API密钥:

stringSignTemp="stringA&key=192006250b4c09247ec02edce69f6a2d"

sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A9CF3B7"

网友的整理:

ok,根据这个我们来尝试一下看能够根据提供的参数得到这个结果【9A0A8659F005D6984697E2CA0A9CF3B7】!!!!

关于按照ASCII排序这里用到了(SortedMap),我的上一篇blog说过的,有兴趣自己去看看

关键代码Set es = parameters.entrySet();//所有参与传参的参数按照accsii排序(升序)

生成MD5的时候,需要统一编码,这里微信api要求是UTF-8

相关代码如下:

【MD5Util】

private static String byteArrayToHexString(byte b[]) {StringBuffer resultSb = new StringBuffer();for (int i = 0; i < b.length; i++)resultSb.append(byteToHexString(b[i]));return resultSb.toString();}private static String byteToHexString(byte b) {int n = b;if (n < 0)n += 256;int d1 = n / 16;int d2 = n % 16;return hexDigits[d1] + hexDigits[d2];}public static String MD5Encode(String origin, String charsetname) {String resultString = null;try {resultString = new String(origin);MessageDigest md = MessageDigest.getInstance("MD5");if (charsetname == null || "".equals(charsetname))resultString = byteArrayToHexString(md.digest(resultString.getBytes()));elseresultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));} catch (Exception exception) {}return resultString;}private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5","6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };

【PayTest】

//http://mch.weixin.qq.com/wiki/doc/api/index.php?chapter=4_3private static String Key = "192006250b4c09247ec02edce69f6a2d";/*** @param args*/public static void main(String[] args) {System.out.println(">>>模拟微信支付<<<");System.out.println("==========华丽的分隔符==========");//微信api提供的参数String appid = "wxd930ea5d5a258f4f";String mch_id = "10000100";String device_info = "1000";String body = "test";String nonce_str = "ibuaiVcKdpRxkhJA";SortedMap<Object,Object> parameters = new TreeMap<Object,Object>();parameters.put("appid", appid);parameters.put("mch_id", mch_id);parameters.put("device_info", device_info);parameters.put("body", body);parameters.put("nonce_str", nonce_str);String characterEncoding = "UTF-8";String weixinApiSign = "9A0A8659F005D6984697E2CA0A9CF3B7";System.out.println("微信的签名是:" + weixinApiSign);String mySign = createSign(characterEncoding,parameters);System.out.println("我     的签名是:"+mySign);if(weixinApiSign.equals(mySign)){System.out.println("恭喜你成功了~");}else{System.out.println("注定了你是个失败者~");}String userAgent = "Mozilla/5.0(iphone;CPU iphone OS 5_1_1 like Mac OS X) AppleWebKit/534.46(KHTML,like Geocko) Mobile/9B206 MicroMessenger/5.0";char agent = userAgent.charAt(userAgent.indexOf("MicroMessenger")+15);System.out.println("微信的版本号:"+new String(new char[]{agent}));}/*** 微信支付签名算法sign* @param characterEncoding* @param parameters* @return*/@SuppressWarnings("unchecked")public static String createSign(String characterEncoding,SortedMap<Object,Object> parameters){StringBuffer sb = new StringBuffer();Set es = parameters.entrySet();//所有参与传参的参数按照accsii排序(升序)Iterator it = es.iterator();while(it.hasNext()) {Map.Entry entry = (Map.Entry)it.next();String k = (String)entry.getKey();Object v = entry.getValue();if(null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {sb.append(k + "=" + v + "&");}}sb.append("key=" + Key);String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();return sign;}

【最终结果】

>>>模拟微信支付<<<
==========华丽的分隔符==========
微信的签名是:9A0A8659F005D6984697E2CA0A9CF3B7
我     的签名是:9A0A8659F005D6984697E2CA0A9CF3B7
恭喜你成功了~
微信的版本号:5

后期用真正的商家APPId整合再试试~~good

【java】微信支付生成签名的过程相关推荐

  1. 微信支付生成签名和验签SDK源码分析

    目录 一.签名分析 1.1 流程分析 1.构造签名串 2.计算签名值 3.设置请求头 二.源码级别分析 二.获取平台证书分析 三.验签分析 3.1 验签使用场景: 3.2 验证流程: 1.获取微信平台 ...

  2. java微信支付验证签名_Java中的微信支付(3):API V3对微信服务器响应进行签名验证...

    1. 前言 牢记一句话:公钥加密,私钥解密:私钥加签,公钥验签. 微信支付V3版本前两篇分别讲了如何对请求做签名和如何获取并刷新微信平台公钥,本篇将继续展开如何对微信支付响应结果的验签. 2. 为什么 ...

  3. java支付接口开发原理_java对接微信支付接口开发的过程是什么?

    java对接微信支付接口开发的过程是什么?以下是小编整理的java对接微信支付接口实现的方法和过程,有需要的朋友可以学习以下的java对接微信支付接口内容. java对接微信支付接口开发的过程是什么? ...

  4. java 微信支付以及退款拿过来直接使用

    该功能我在程自己在学习时候尝试搭建的,可能会有很多问题,在这里只是做一下记录.直接上代码. 如果想要源码楼主或者加群725395843    这里是技术讨论群.供大家讨论. JAVA开发微信支付-公众 ...

  5. java微信支付代码_Java微信支付之服务号支付代码示例

    Java微信支付之服务号支付实现,网上的java微信支付sdk和Demo基本上是水的,看着头疼所以我决心自己开始写Java微信支付之公众号支付,多的不说见下面源码,为了方便使用我分别用了两个Servl ...

  6. java微信支付超时_Java微信支付之关闭订单

    本文实例为大家分享了java微信支付之关闭订单的具体代码,供大家参考,具体内容如下 一.应用场景 商户订单支付失败需要生成新单号重新发起支付,要对原订单号调用关单,避免重复支付 系统下单后,用户支付超 ...

  7. java微信支付v3系列——4.创建订单的封装及使用

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  8. Java 微信支付之APP支付服务端 (一)

    Java 微信支付之APP支付服务端 (一) 如图所示,这是服务端要集成的所有微信接口.至于在开放平台申请就不做赘述了.主要流程,1.下单,2.异步通知,3.查询. 一.微信统一下单请求交易 /*** ...

  9. 写一个java微信支付的接口

    要写一个 Java 微信支付接口,需要以下几个步骤: 注册微信支付商户,获取微信支付商户号和密钥. 准备微信支付需要的相关参数,包括商户订单号.订单金额.订单描述等. 使用 Java 实现微信支付下单 ...

最新文章

  1. PHP安装parsekit扩展查看opcode
  2. Linux之重定向命令
  3. LINUX应用与发展简介
  4. python继承编程教程_Python实现通过继承覆盖方法示例
  5. Boost:bind绑定访客的测试程序
  6. 【纠错记录】本地FTP服务器无法被外部连接
  7. 一帮一python_[python]L1-030 一帮一 (15分)
  8. ruby 覆盖率测试_Ruby方法覆盖
  9. mysql crud_如何使用Laravel和MySQL构建您的第一个CRUD应用
  10. 查看SQL执行计划的方法及优劣
  11. 计算机网络实验指导书 pdf,计算机网络实验指导书-20210608153043.pdf-原创力文档
  12. leetcode链表中的两数相加问题
  13. Spring简单的定时器
  14. 迈达斯cdn安装_CDN安装
  15. 美国大学计算机理论专业phd,专家:美国大学计算机专业PHD申请难度有多大
  16. 理解计算机(一)计算机中的抽象概念
  17. Joiner拼接String
  18. SD卡无法格式化方法介绍
  19. MATLAB图像如何显示希腊字母、上下标(alpha、beta等)
  20. outlook 签名_快速提示:轻松在Outlook 2007中的签名之间切换

热门文章

  1. 坐标转换(像素转换米)
  2. 宝可梦世界无限极服务器密码,宝可梦世界无极限
  3. Wireshark菜单栏介绍之编辑菜单4-4
  4. android中倒计时动画,Android实现倒计时效果
  5. 加强中学理化生实验室建设要求,深化教学改革
  6. 2004年下半年 网络工程师 上下午试卷【附带答案】
  7. 荣耀畅玩8C生猛来袭夺C位,红米Note5看了只能默默躲角落
  8. 计算机上创建表格,Word 2007中插入表格或创建表格 -电脑资料
  9. 让你效率飞起的右键工具——超级右键
  10. 吟诵,不为吟诵 - 徐健顺