微信公众平台消息体签名及加解密实例(Java)

前言:

最近在研究微信公众平台的开发,玩得不亦乐乎。基本的回复功能已经实现了,而且回复用到了图灵机器人的接口。其实图灵机器人已经有微信接口可以直接调用。如果项目的需要,想要做个性化需求的话,用这种方式是行不通的。我现在的解决方案是,我开发的应用A作为中间层,连接微信接口与图灵机器人接口。有点扯远了,如题,微信官方为了更高的安全性,10月份推出了消息体签名验证。网上关于此项的实例不多,其实根据官方的例子,重新封装一下,就可以了。

一、准备工作:

1.已申请了相关的订阅号或者服务号(可以用虚拟器,具体的方式没试过,百度一下,有很多介绍);

2.已经有了原来的公众平台交互应用A;

3.按照官网提示下载相关的示例代码;

4.保证应用的JDK是1.6以上;

二、具体实现:

1.去官网设置消息加密方式,点击“开发者中心”-》“修改配置”,这里为了调试,设置为“兼容模式”:

2.将官网下载的示例代码导入应用中,我们只需关注其中重要的接口类:WXBizMsgCrypt以及它的具体应用展示Program类;

3.根据自己的代码应用场景,将WXBizMsgCrypt重新封装一下:

AuthProcess.java

package cn.qtone.xxt.base.wechat.utils;

import javax.servlet.http.HttpServletRequest;

import cn.qtone.xxt.base.wechat.utils.aes.AesException;
import cn.qtone.xxt.base.wechat.utils.aes.WXBizMsgCrypt;

public class AuthProcess {
	public final static String Token = "xxxx";//公众平台上面自己填写的Token
	public final static String EncodingAESKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";//公众平台上面自己填写的43位EncodingAESKey
	public final static String AppID = "wx488885e67d6c19e2";//应用的appid(微信生成的)

	/**
	* 将加密后的原文进行解密重新封装
	* @param request
	* @param originalXml 原xml
	* @return    重新解密后的xml
	 */
	public static String  decryptMsg(HttpServletRequest request,String originalXml) {
		// 微信加密签名
        //String sVerifyMsgSig = request.getParameter("signature");
        String msgSignature = request.getParameter("msg_signature");
        // 时间戳
        String timestamp = request.getParameter("timestamp");
        // 随机数
        String nonce = request.getParameter("nonce");
        try {
			WXBizMsgCrypt pc = new WXBizMsgCrypt(Token, EncodingAESKey, AppID);
			return pc.decryptMsg(msgSignature, timestamp, nonce, originalXml);
		} catch (AesException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	/**
	* 对需要回复的原文进行加密重新封装
	* @param request
	* @param replyXml 需要回复的xml
	* @return    重新加密后的xml
	 */
	public static String  encryptMsg(HttpServletRequest request,String replyXml) {
        // 时间戳
        String timestamp = request.getParameter("timestamp");
        // 随机数
        String nonce = request.getParameter("nonce");
        try {
			WXBizMsgCrypt pc = new WXBizMsgCrypt(Token, EncodingAESKey, AppID);
			return pc.encryptMsg(replyXml, timestamp, nonce);
		} catch (AesException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
}

4.找到原来自动回复接口的流程代码,在处理数据前后,加上请求数据解密,回复数据加密的流程(下面为关键代码部分):

 //加密消息处理
 String encrypt_type =request.getParameter("encrypt_type");
 if (StringTools.nil(encrypt_type) || encrypt_type.equals("raw")) {//不用加密
	// 正常的微信处理流程
	result = weChatService.processWechatMag(xml);
 } else {//需走加解密流程
	//解密请求消息体
	String nXmlString = AuthProcess.decryptMsg(request, xml);
	//执行原处理
	String originalResult = weChatService.processWechatMag(nXmlString);
	//加密回复消息体
	result = AuthProcess.encryptMsg(request, originalResult);
 }

总结:经测试,以上流程是成功的,但中间出现一点小状况,需要特别说明一下,这里引述一下官方FAQ的其中一个我遇到的问题及他们的解决方案:

  • 异常java.security.InvalidKeyException:illegal Key Size的解决方案:在官方网站下载JCE无限制权限策略文件(请到官网下载对应的版本, 例如JDK7的下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt,如果安装了JRE,将两个jar文件放到%JRE_HOME%\lib\security目录下覆盖原来的文件;如果安装了JDK,将两个jar文件放到%JDK_HOME%\jre\lib\security目录下覆盖原来文件

我用的是jdk1.6.0_31,所以需要下载相关的文件并进行了覆盖,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html

时间: 2024-11-06 22:16:38

微信公众平台消息体签名及加解密实例(Java)的相关文章

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

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

微信消息体签名及加解密功能详细解析以及.net实现

原文:微信消息体签名及加解密功能详细解析以及.net实现 前言 微信消息体签名及加密功能已上线,明文传输确实存在安全风险,鉴于微信的用户范围使用之广泛,必定会成为众矢之的.所以大家还是尽快接入安全模式为好.仔细阅读官方接入指南,发现这次安全升级只是涉及到用户在微信对话窗口中与公众好消息交互,所以此次升级还是比较简单的.下面为大家一一道来. 一.功能解析 微信消息体签名及加密功能已上线,出于安全考虑,强烈建议您尽快接入消息加密功能,消除安全风险.详见公告.公众平台接口调试工具已经全面支持消息体加密

微信公众平台消息体加解密实现

一.消息体加解密 微信公众平台在配置服务器时,提供了3种加解密的模式供开发者选择,即明文模式.兼容模式.安全模式,选择兼容模式和安全模式前,需在开发者中心填写消息加解密密钥EncodingAESKey. 明文模式:维持现有模式,没有适配加解密新特性,消息体明文收发,默认设置为明文模式 兼容模式:公众平台发送消息内容将同时包括明文和密文,消息包长度增加到原来的3倍左右:公众号回复明文或密文均可,不影响现有消息收发:开发者可在此模式下进行调试 安全模式(推荐):公众平台发送消息体的内容只含有密文,公

C#微信公众号开发系列教程三(消息体签名及加解密)

  C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南)    距离上一篇博文已经半个月了,本来打算每两天更新一次的,但可怜苦逼码农无日无夜的加班.第一篇博文发表后,博文视点的编辑就找到我,问我想不想出版这个系列,我当时瞬间就想到了王大锤的独白,想想真的是有点小激动,后面按照那边的要求,提交了申请书,也提交了目录,可惜文笔不行,再加上最近太忙,样稿一直没有给他,感觉挺愧疚了.真心希望能帮一下迷茫的

微信公众平台消息接口开发(32)空气质量指数查询

原文:微信公众平台消息接口开发(32)空气质量指数查询 微信公众平台开发 微信公众平台开发者 微信公众平台开发模式 空气质量指数 PM2.5 作者:方倍工作室 原文:http://www.cnblogs.com/txw1958/archive/2013/05/30/weixin-if32-air-quality.html 一.获取原版数据 在中国环境监测总站http://www.cnemc.cn/ 可以找到全国城市空气质量实时发布平台,其地址为 http://113.108.142.147:20

爬虫-微信公众平台消息获取

帮朋友抓取微信公众平台的用户评论信息. 下面只说核心的部分,怎么获取评论信息. 查看HTML代码,没有发现关于评论部分的标签.看来是用JS动态生成的,但是查找ajax请求也没有找到哪里有返回数据. 最后搜索一下,原来是在这里,很直白的写在了JS里: <script type="text/javascript"> wx.cgiData = { total_count : 91, latest_msg_id : '200325222', count : "20&quo

微信公众平台消息接口开发-封装weixin.class.php(转)

一.封装weixin.class.php 由于微信公众平台的通信使用的是特定格式的XML数据,每次接受和回复都要去做一大堆的数据处理. 我们就考虑在这个基础上做一次封装,weixin.class.php,代码如下: <?php class Weixin {     public $token = '';//token     public $debug =  false;//是否debug的状态标示,方便我们在调试的时候记录一些中间数据     public $setFlag = false;

微信公众平台消息接口开发-封装weixin.class.php

原文:微信公众平台消息接口开发-封装weixin.class.php 一.封装weixin.class.php 由于微信公众平台的通信使用的是特定格式的XML数据,每次接受和回复都要去做一大堆的数据处理. 我们就考虑在这个基础上做一次封装,weixin.class.php,代码如下: <?php class Weixin {     public $token = '';//token     public $debug =  false;//是否debug的状态标示,方便我们在调试的时候记录一

微信公众平台消息接口PHP版开发教程

原文:微信公众平台消息接口PHP版开发教程  一.写好接口程序 在你的服务器上上传好一个接口程序文件,如http://www.yourdomain.com/weixin.php  内容如下: <?php define("TOKEN", "weixin");//自己定义的token 就是个通信的私钥 $wechatObj = new wechatCallbackapiTest(); $wechatObj->valid(); //$wechatObj-&