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

前言:

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


一、准备工作:

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

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

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

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

二、具体实现:

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


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


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

AuthProcess.java

[java]  view plain  copy
  1. package cn.qtone.xxt.base.wechat.utils;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4.   
  5. import cn.qtone.xxt.base.wechat.utils.aes.AesException;  
  6. import cn.qtone.xxt.base.wechat.utils.aes.WXBizMsgCrypt;  
  7.   
  8. public class AuthProcess {  
  9.     public final static String Token = "xxxx";//公众平台上面自己填写的Token  
  10.     public final static String EncodingAESKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";//公众平台上面自己填写的43位EncodingAESKey  
  11.     public final static String AppID = "wx488885e67d6c19e2";//应用的appid(微信生成的)  
  12.   
  13.   
  14.     /** 
  15.     * 将加密后的原文进行解密重新封装 
  16.     * @param request 
  17.     * @param originalXml 原xml 
  18.     * @return    重新解密后的xml 
  19.      */  
  20.     public static String  decryptMsg(HttpServletRequest request,String originalXml) {  
  21.         // 微信加密签名   
  22.         //String sVerifyMsgSig = request.getParameter("signature");  
  23.         String msgSignature = request.getParameter("msg_signature");  
  24.         // 时间戳  
  25.         String timestamp = request.getParameter("timestamp");  
  26.         // 随机数  
  27.         String nonce = request.getParameter("nonce");  
  28.         try {  
  29.             WXBizMsgCrypt pc = new WXBizMsgCrypt(Token, EncodingAESKey, AppID);  
  30.             return pc.decryptMsg(msgSignature, timestamp, nonce, originalXml);  
  31.         } catch (AesException e) {  
  32.             // TODO Auto-generated catch block  
  33.             e.printStackTrace();  
  34.         }  
  35.         return null;  
  36.     }  
  37.       
  38.     /** 
  39.     * 对需要回复的原文进行加密重新封装 
  40.     * @param request 
  41.     * @param replyXml 需要回复的xml 
  42.     * @return    重新加密后的xml 
  43.      */  
  44.     public static String  encryptMsg(HttpServletRequest request,String replyXml) {  
  45.         // 时间戳  
  46.         String timestamp = request.getParameter("timestamp");  
  47.         // 随机数  
  48.         String nonce = request.getParameter("nonce");  
  49.         try {  
  50.             WXBizMsgCrypt pc = new WXBizMsgCrypt(Token, EncodingAESKey, AppID);  
  51.             return pc.encryptMsg(replyXml, timestamp, nonce);  
  52.         } catch (AesException e) {  
  53.             // TODO Auto-generated catch block  
  54.             e.printStackTrace();  
  55.         }  
  56.         return null;  
  57.     }  
  58. }  

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

[java]  view plain  copy
  1. //加密消息处理  
  2. String encrypt_type =request.getParameter("encrypt_type");  
  3. if (StringTools.nil(encrypt_type) || encrypt_type.equals("raw")) {//不用加密  
  4. // 正常的微信处理流程  
  5. result = weChatService.processWechatMag(xml);  
  6. else {//需走加解密流程  
  7. //解密请求消息体  
  8. String nXmlString = AuthProcess.decryptMsg(request, xml);  
  9. //执行原处理  
  10. String originalResult = weChatService.processWechatMag(nXmlString);  
  11. //加密回复消息体  
  12. result = AuthProcess.encryptMsg(request, originalResult);  
  13. }  
总结:经测试,以上流程是成功的,但中间出现一点小状况,需要特别说明一下,这里引述一下官方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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值