微信公众平台开发之对加密模式的解密

消息加密模式有三种,如下图:

在明文模式下我们不需要解密,但如果是加密模式提交的,我们要对得到的数据进行解密才能使用。

一、首先要到官方网站下载示例文件。

点这里下载...

1.拷贝包src.com.qq.weixin.mp.aes下的java类

2.拷贝jar包:commons-codec-1.9.jar

3.官方说明:

提供接收和推送给公众平台消息的加解密接口(UTF8编码的字符串).
            第三方回复加密消息给公众平台
            第三方收到公众平台发送的消息,验证消息的安全性,并对消息进行解密。

说明:异常java.security.InvalidKeyException:illegal Key Size的解决方案

在官方网站下载JCE无限制权限策略文件:

点这里下载...

下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt
            如果安装了JRE,将两个jar文件放到%JRE_HOME%\lib\security目录下覆盖原来的文件
            如果安装了JDK,将两个jar文件放到%JDK_HOME%\jre\lib\security目录下覆盖原来文件

注:这里说明一下,我使用的是jdk 1.7.0_45且jdk安装在d盘,替换的jre路径为:

D:\Program Files\Java\jdk1.7.0_45\jre\lib\security

二、在MessageUtil.java中添加解析加密文件的代码:

----MessageUtil.java:

/**
  * 对加密模式提交的配置进行解密处理
  * 2015-09-03
  * @param req
  * @return
  * @throws Exception
  */
 public static Map<String, String> parseEncryptXml(HttpServletRequest req) throws Exception{
  
  //保存要处理的加密文件
  Map<String, String> map = new HashMap<String, String>();
  
  //用InputStream来存放要处理的数据
  InputStream is = req.getInputStream();
  
  //读取InputStream中的数据(xml)
  InputStreamReader isr = new InputStreamReader(is);
  BufferedReader br = new BufferedReader(isr);
  
  StringBuffer sb = new StringBuffer();
  
  String line = br.readLine();
  while(line != null) {
   sb.append(line);
  }
  
  //进行解密
  String msgSignature = req.getParameter("msg_signature");
  String timeStamp = req.getParameter("timestamp");
  String nonce = req.getParameter("nonce");
  
  //微信官方提供的工具
  //WXBizMsgCrypt的三个属性:
  //String token, String encodingAesKey, String appId
  WXBizMsgCrypt msgCrypt = new WXBizMsgCrypt("token", "encodingAesKey", "appId");
  String msgXml = msgCrypt.decryptMsg(msgSignature, timeStamp, nonce, sb.toString());
  
  //使用dom4j工具对xml文件进行解析
  Document document = DocumentHelper.parseText(msgXml);
  //从根元素开始解析
  Element root = document.getRootElement();
  //递归解析
  map = recursiveParseXML(map, root);
  
  //释放资源
  is.close();
  is = null;
  
  return map;
 }

三、在CoreServlet.java类中的doPost()中添加代码,处理加密的消息:

----CoreServlet.java:

/**
  * 接收微信服务器请求处理的内容
  * 交给CoreService类处理
  */
 public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  //设置字符集 微信默认的为UTF-8  
  //请求
  request.setCharacterEncoding("utf-8");
  //响应
  response.setCharacterEncoding("utf-8");
  
  try{
   /**
    * 对三种加密方式进行解析
    * 明文模式
    * 兼容模式
    * 安全模式
    */
   //加密方式
   String encryptType = request.getParameter("encrypt_type");
   //时间戳
   String timestamp = request.getParameter("timestamp");
   //随机数
   String nonce = request.getParameter("nonce");
   
   //定义一个Map来接收请求的xml文件
   Map<String, String> requestMap = null;
   //响应回去的xml文件
   String responseXml = null;
   
   //以安全模式提交的数据
   if("aes".equals(encryptType)) {
    //
    requestMap = MessageUtil.parseEncryptXml(request);
    //要响应的xml文件
    responseXml = CoreService.processRequest(requestMap);
    
    //进行加密
    WXBizMsgCrypt msgCrypt = new WXBizMsgCrypt("token", "encodingAesKey", "appId");
    //响应加密后的xml文件
    responseXml = msgCrypt.encryptMsg(responseXml, timestamp, nonce);
   }
   //以明文模式提交过来的,不需要解密
   else {
    //处理接收到的消息
    requestMap = MessageUtil.parseXML(request);
    responseXml = CoreService.processRequest(requestMap);
   }
   
   //向服务器相关响应信息
   PrintWriter out = response.getWriter();
   out.print(responseXml);
   out.close();
   
  }catch(Exception e) {
   e.printStackTrace();
  }
 }

---------------------------完毕---------------------------

时间: 2024-10-29 18:17:34

微信公众平台开发之对加密模式的解密的相关文章

[号外]微信公众平台开发---消息体签名及加解密

离刚开始做微信开发到现在已经两个月了,因为被分配了另外一个任务,所以微信的开发就先放到了一遍. 在小公司便是如此,只有自己一个人做开发,所以哪里需要就要先转到哪一块.其实想想自己也没什么太好的理由说留在这个公司,想想也就是工作比较放松点,老板人还可以,项目上也催的不紧,孩子还小家里有点事了可以随时请假回家,这次也是家里父亲和小孩都住院了请了半个月假刚过来. 闲话不多说,先说下微信开发的博客,微信开发也算完成了一部分,因为没有完成,所以之前的『微信公众平台开发(一)---接口介绍及配置』起了个头便

Java微信公众平台开发模式+自定义按钮源码

首先,想用开放模式需要先成为开发者.成为开发者有两种写法. 一是:通过jsp页面,用out.print("echostr")//SHA1加密的字符串: 二是:通过Servlet.doGet返回exhostr,给微信平台. 这里我只写第二种方式的请求(这里的请求是以get方式请求),代码如下: import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.ut

Senparc.Weixin.MP SDK 微信公众平台开发教程(十五):消息加密

原文:Senparc.Weixin.MP SDK 微信公众平台开发教程(十五):消息加密 前不久,微信的企业号使用了强制的消息加密方式,随后公众号也加入了可选的消息加密选项.目前企业号和公众号的加密方式是一致的(格式会有少许差别). 加密设置 进入公众号后台的“开发者中心”,我们可以看到Url对接的设置: 点击[修改设置],可以进入到修改页面: 加密的方式一共有3种: 明文模式,即原始的消息格式 兼容模式,明文.密文将共存,正式发布的产品不建议使用(因为仍然包含了明文,达不到加密的效果) 安全模

微信公众平台开发模式详解图文教程

这部分主要讲解微信公众平台的开发模式,首先说明一下我不是程序员,所以本篇并非讲编程代码之类的,但是由于我们正在开发微信POP营销系统,所以我对开发模式有一定了解,这些了解应该会对准备尝试做微信开发的朋友会有一定帮助,少走部分弯路吧.如果对本篇教程有任何疑问或错漏之处欢迎留言或直接联系我进行更正修改. 微信公众平台开发模式 首先我们要明确开发模式什么可以做,什么不可以做: 一.开发模式可以实现的功能 可以接收用户发送过来的消息,通过你自己开发的系统把对应内容反馈回去.可以接收用户发送过来的地理位置

用C++做微信公众平台开发的后台开发时,用sha1加密验证的方法

微信公众平台开发时,需要验证消息是否来自微信服务器,这要用到sha1加密算法,官网上给的是php的sha函数,C++中要用到下面这个函数: 一.引入头文件: #include<openssl/sha.h> #include<inttypes.h> 二.用这个函数转码: //函数功能:将传入的字符串用sha1加密算法加密后传出 //strOriginal:原始字符串 //返回值:加密后的字符串 stringGetSha1Str(const string& strOrigina

微信公众平台-开发模式配置 URL Token

微信公众平台-开发模式配置需要拥有自己的服务器,配置页面有明文:"请填写接口配置信息,此信息需要你拥有自己的服务器资源."  这句话就是说有自己的服务器,独立ip,80端口开放的.并且这台服务器要能提供服务,就是说要能够被微信后台的服务器访问到.这需要服务器有一个外网IP.我们的Web Server监听外网IP的80端口之后就能收到微信后台的请求了. 可能很多读者希望能在自己的PC机上做接入的测试,但是笔者建议不要这么做,因为这可能会遇到很多的麻烦.如果你的确想这么做,请注意以下事情:

微信公众平台开发模式

微信公众平台提供了开发者模式,开启开发者模式的方法入下图 在右侧的工具栏最后一项“开发者中心”.点击进入“开发者中心”,需要配置服务器路径URL,和表示符Token.之后完成申请接入: (1)将微信提供的php文件放到服务器上,下载地址:http://mp.weixin.qq.com/mpres/htmledition/res/wx_sample.zip; (2)确认文件名和配置URL中的文件名一致; (3)修改php文件中define("TOKEN", "weixin&qu

第四篇 :微信公众平台开发实战Java版之完成消息接受与相应以及消息的处理

温馨提示: 这篇文章是依赖前几篇的文章的. 第一篇:微信公众平台开发实战之了解微信公众平台基础知识以及资料准备 第二篇 :微信公众平台开发实战之开启开发者模式,接入微信公众平台开发 第三篇 :微信公众平台开发实战之请求消息,响应消息以及事件消息类的封装 首先,我们看看原来写的dopost方法: /** * 处理微信服务器发来的消息 */ public void doPost(HttpServletRequest request, HttpServletResponse response) thr

微信公众平台开发入门教程

在这篇微信公众平台开发教程中,我们假定你已经有了PHP语言程序.MySQL数据库.计算机网络通讯.及HTTP/XML/CSS/JS等基础. 我们将使用微信公众账号方倍工作室作为讲解的例子,二维码见底部. 本系列教程将引导你完成如下任务: 创建新浪云计算平台应用 启用微信公众平台开发模式 基础接口消息及事件 微信公众平台PHP SDK 微信公众平台开发模式原理 开发天气预报功能 第一章 申请服务器资源 创建新浪云计算应用 申请账号 我们使用SAE新浪云计算平台作为服务器资源,并且申请PHP环境+M