微信公眾平臺消息體簽名及加解密實例(Java)
來源:程序員人生 發布時間:2014-12-15 09:22:27 閱讀次數:7102次
前言:
最近在研究微信公眾平臺的開發,玩得不亦樂乎。基本的回復功能已實現了,而且回復用到了圖靈機器人的接口。其實圖靈機器人已有微信接口可以直接調用。如果項目的需要,想要做個性化需求的話,用這類方式是行不通的。我現在的解決方案是,我開發的利用A作為中間層,連接微信接口與圖靈機器人接口。有點扯遠了,如題,微信官方為了更高的安全性,10月份推出了消息體簽名驗證。網上關于此項的實例不多,其實根據官方的例子,重新封裝1下,就能夠了。
1、準備工作:
1.已申請了相干的定閱號或服務號(可以用虛擬器,具體的方式沒試過,百度1下,有很多介紹);
2.已有了原來的公眾平臺交互利用A;
3.依照官網提示下載相干的示例代碼;
4.保證利用的JDK是1.6以上;
2、具體實現:
1.去官網設置消息加密方式,點擊“開發者中心”-》“修改配置”,這里為了調試,設置為“兼容模式”:

2.將官網下載的示例代碼導入利用中,我們只需關注其中重要的接口類:WXBizMsgCrypt和它的具體利用展現Program類;

3.根據自己的代碼利用場景,將WXBizMsgCrypt重新封裝1下:
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);
}
總結:經測試,以上流程是成功的,但中間出現1點小狀態,需要特別說明1下,這里引述1下官方FAQ的其中1個我遇到的問題及他們的解決方案:
- 異常java.security.InvalidKeyException:illegal Key Size的解決方案:在官方網站下載JCE無窮制權限策略文件(請到官網下載對應的版本, 例如JDK7的下載地址:http://www.oracle.com/technetwork/java/javase/downloads/jce⑺-download⑷32124.html下載后解壓,可以看到local_policy.jar和US_export_policy.jar和readme.txt,如果安裝了JRE,將兩個jar文件放到%JRE_HOME%libsecurity目錄下覆蓋原來的文件;如果安裝了JDK,將兩個jar文件放到%JDK_HOME%jrelibsecurity目錄下覆蓋原來文件
我用的是jdk1.6.0_31,所以需要下載相干的文件并進行了覆蓋,下載地址:http://www.oracle.com/technetwork/java/javase/downloads/jce⑹-download⑷29243.html
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈