微信公共平臺接口開發--Java實現

Java微信實現,采用SpringMVC 架構,采用SAXReader解析XML

@RequestMapping(value="/extend")
public class WeixinController {
?@RequestMapping(value="/weixin")
?public ModelAndView weixin(HttpServletRequest request,HttpServletResponse response) {
?String method=request.getMethod();
?method=method.toLowerCase();
?String signature=request.getParameter("signature");// — 微信加密簽名
?String timestamp=request.getParameter("timestamp");// — 時間戳
?String nonce=request.getParameter("nonce");// — 隨機數
?String echostr=request.getParameter("echostr");// — 隨機字符串
?String token="";//token
?ModelAndView mv = new ModelAndView("return");
?if("get".equals(method)){
??String diget=signature(token,timestamp,nonce);
??if(diget.equals(signature)){//標識請求來自微信
???mv.addObject("returnObject", echostr);
??}
?}else if("post".equals(method)){
??try {
???ServletInputStream inputStream = request.getInputStream();
???if(null!=inputStream){
????BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
????SAXReader saxReader = new SAXReader();
????Document document = saxReader.read(reader);
????Element rootElm = document.getRootElement();
????String toUserName = rootElm.element("ToUserName").getData().toString();// 消息接收方微信號,一般為公眾平臺賬號微信號
????String fromUserName = rootElm.element("FromUserName").getData().toString();// 消息發送方微信號
????String createTime = rootElm.element("CreateTime").getData().toString();// 消息創建時間
????String msgType = rootElm.element("MsgType").getData().toString();// 文本消息為text
????String event="";
????Element eventElement=rootElm.element("Event");
????if(null!=eventElement){
?????Object object=eventElement.getData();
?????if(null!=object){
??????event=object.toString();// 文本消息為text
?????}
????}
????String content = "";
????Element contentElement=rootElm.element("Content");
????if(null!=contentElement){
?????Object object=contentElement.getData();
?????if(null!=object){
??????content=object.toString();// 文本消息為text
?????}
????}
????System.err.println(document.asXML()+"---->"+fromUserName+" send message to "+toUserName+": MsgType->"+msgType+" Content->"+content);
????if("event".equals(msgType)&&"subscribe".equals(event)){
?????String reply=generReplyTextMessage(fromUserName,toUserName,"歡迎您關注無不網絡微信公共賬號,無不竭誠為您服務!");
?????mv.addObject("returnObject", reply);
????}else{
?????String questionContent = "取消關注";
?????String xml=generReplyTextMessage(fromUserName,toUserName,questionContent);
?????mv.addObject("returnObject", xml);
????}
???}
??} catch (IOException e) {
???e.printStackTrace();
??} catch (DocumentException e) {
???e.printStackTrace();
??}
?}
?return mv;
}

private String generReplyTextMessage(String toUserName,String fromUserName,String content){
?StringBuffer xml=new StringBuffer();
?xml.append("<xml>");
?xml.append("<ToUserName><![CDATA["+toUserName+"]]></ToUserName>");
?xml.append("<FromUserName><![CDATA["+fromUserName+"]]></FromUserName>");
?xml.append("<CreateTime>"+new Date().getTime()+"</CreateTime>");
?xml.append("<MsgType><![CDATA[text]]></MsgType>");
?xml.append("<Content><![CDATA["+content+"]]></Content>");
?xml.append("<FuncFlag>0</FuncFlag>");
?xml.append("</xml>");
?return xml.toString();
}
?/**
? * 驗證微信
? * @param token
? * @param timestamp
? * @param nonce
? * @return
? */
?private static String signature(String token, String timestamp, String nonce) {
?? String[] str = { token, timestamp, nonce };
???????? Arrays.sort(str); // 字典序排序
???????? String bigStr = str[0] + str[1] + str[2];
???????? // SHA1加密
???????? String digest = new SHA1().getDigestOfString(bigStr.getBytes()).toLowerCase();
?? return digest;
?}
}

?

SHA1加密算法

public class SHA1 {
?private final int[] abcde = { 0x67452301, 0xefcdab89, 0x98badcfe,
???0x10325476, 0xc3d2e1f0 };
?// 摘要數據存儲數組
?private int[] digestInt = new int[5];
?// 計算過程中的臨時數據存儲數組
?private int[] tmpData = new int[80];

?// 計算sha-1摘要
?private int process_input_bytes(byte[] bytedata) {
??// 初試化常量
??System.arraycopy(abcde, 0, digestInt, 0, abcde.length);
??// 格式化輸入字節數組,補10及長度數據
??byte[] newbyte = byteArrayFormatData(bytedata);
??// 獲取數據摘要計算的數據單元個數
??int MCount = newbyte.length / 64;
??// 循環對每個數據單元進行摘要計算
??for (int pos = 0; pos < MCount; pos++) {
???// 將每個單元的數據轉換成16個整型數據,并保存到tmpData的前16個數組元素中
???for (int j = 0; j < 16; j++) {
????tmpData[j] = byteArrayToInt(newbyte, (pos * 64) + (j * 4));
???}
???// 摘要計算函數
???encrypt();
??}
??return 20;
?}

?// 格式化輸入字節數組格式
?private byte[] byteArrayFormatData(byte[] bytedata) {
??// 補0數量
??int zeros = 0;
??// 補位后總位數
??int size = 0;
??// 原始數據長度
??int n = bytedata.length;
??// 模64后的剩余位數
??int m = n % 64;
??// 計算添加0的個數以及添加10后的總長度
??if (m < 56) {
???zeros = 55 - m;
???size = n - m + 64;
??} else if (m == 56) {
???zeros = 63;
???size = n + 8 + 64;
??} else {
???zeros = 63 - m + 56;
???size = (n + 64) - m + 64;
??}
??// 補位后生成的新數組內容
??byte[] newbyte = new byte[size];
??// 復制數組的前面部分
??System.arraycopy(bytedata, 0, newbyte, 0, n);
??// 獲得數組Append數據元素的位置
??int l = n;
??// 補1操作
??newbyte[l++] = (byte) 0x80;
??// 補0操作
??for (int i = 0; i < zeros; i++) {
???newbyte[l++] = (byte) 0x00;
??}
??// 計算數據長度,補數據長度位共8字節,長整型
??long N = (long) n * 8;
??byte h8 = (byte) (N & 0xFF);
??byte h7 = (byte) ((N >> 8) & 0xFF);
??byte h6 = (byte) ((N >> 16) & 0xFF);
??byte h5 = (byte) ((N >> 24) & 0xFF);
??byte h4 = (byte) ((N >> 32) & 0xFF);
??byte h3 = (byte) ((N >> 40) & 0xFF);
??byte h2 = (byte) ((N >> 48) & 0xFF);
??byte h1 = (byte) (N >> 56);
??newbyte[l++] = h1;
??newbyte[l++] = h2;
??newbyte[l++] = h3;
??newbyte[l++] = h4;
??newbyte[l++] = h5;
??newbyte[l++] = h6;
??newbyte[l++] = h7;
??newbyte[l++] = h8;
??return newbyte;
?}

?private int f1(int x, int y, int z) {
??return (x & y) | (~x & z);
?}

?private int f2(int x, int y, int z) {
??return x ^ y ^ z;
?}

?private int f3(int x, int y, int z) {
??return (x & y) | (x & z) | (y & z);
?}

?private int f4(int x, int y) {
??return (x << y) | x >>> (32 - y);
?}

?// 單元摘要計算函數
?private void encrypt() {
??for (int i = 16; i <= 79; i++) {
???tmpData[i] = f4(tmpData[i - 3] ^ tmpData[i - 8] ^ tmpData[i - 14]
?????^ tmpData[i - 16], 1);
??}
??int[] tmpabcde = new int[5];
??for (int i1 = 0; i1 < tmpabcde.length; i1++) {
???tmpabcde[i1] = digestInt[i1];
??}
??for (int j = 0; j <= 19; j++) {
???int tmp = f4(tmpabcde[0], 5)
?????+ f1(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4]
?????+ tmpData[j] + 0x5a827999;
???tmpabcde[4] = tmpabcde[3];
???tmpabcde[3] = tmpabcde[2];
???tmpabcde[2] = f4(tmpabcde[1], 30);
???tmpabcde[1] = tmpabcde[0];
???tmpabcde[0] = tmp;
??}
??for (int k = 20; k <= 39; k++) {
???int tmp = f4(tmpabcde[0], 5)
?????+ f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4]
?????+ tmpData[k] + 0x6ed9eba1;
???tmpabcde[4] = tmpabcde[3];
???tmpabcde[3] = tmpabcde[2];
???tmpabcde[2] = f4(tmpabcde[1], 30);
???tmpabcde[1] = tmpabcde[0];
???tmpabcde[0] = tmp;
??}
??for (int l = 40; l <= 59; l++) {
???int tmp = f4(tmpabcde[0], 5)
?????+ f3(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4]
?????+ tmpData[l] + 0x8f1bbcdc;
???tmpabcde[4] = tmpabcde[3];
???tmpabcde[3] = tmpabcde[2];
???tmpabcde[2] = f4(tmpabcde[1], 30);
???tmpabcde[1] = tmpabcde[0];
???tmpabcde[0] = tmp;
??}
??for (int m = 60; m <= 79; m++) {
???int tmp = f4(tmpabcde[0], 5)
?????+ f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4]
?????+ tmpData[m] + 0xca62c1d6;
???tmpabcde[4] = tmpabcde[3];
???tmpabcde[3] = tmpabcde[2];
???tmpabcde[2] = f4(tmpabcde[1], 30);
???tmpabcde[1] = tmpabcde[0];
???tmpabcde[0] = tmp;
??}
??for (int i2 = 0; i2 < tmpabcde.length; i2++) {
???digestInt[i2] = digestInt[i2] + tmpabcde[i2];
??}
??for (int n = 0; n < tmpData.length; n++) {
???tmpData[n] = 0;
??}
?}

?// 4字節數組轉換為整數
?private int byteArrayToInt(byte[] bytedata, int i) {
??return ((bytedata[i] & 0xff) << 24) | ((bytedata[i + 1] & 0xff) << 16)
????| ((bytedata[i + 2] & 0xff) << 8) | (bytedata[i + 3] & 0xff);
?}

?// 整數轉換為4字節數組
?private void intToByteArray(int intValue, byte[] byteData, int i) {
??byteData[i] = (byte) (intValue >>> 24);
??byteData[i + 1] = (byte) (intValue >>> 16);
??byteData[i + 2] = (byte) (intValue >>> 8);
??byteData[i + 3] = (byte) intValue;
?}

?// 將字節轉換為十六進制字符串
?private static String byteToHexString(byte ib) {
??char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',
????'B', 'C', 'D', 'E', 'F' };
??char[] ob = new char[2];
??ob[0] = Digit[(ib >>> 4) & 0X0F];
??ob[1] = Digit[ib & 0X0F];
??String s = new String(ob);
??return s;
?}

?// 將字節數組轉換為十六進制字符串
?private static String byteArrayToHexString(byte[] bytearray) {
??String strDigest = "";
??for (int i = 0; i < bytearray.length; i++) {
???strDigest += byteToHexString(bytearray[i]);
??}
??return strDigest;
?}

?// 計算sha-1摘要,返回相應的字節數組
?public byte[] getDigestOfBytes(byte[] byteData) {
??process_input_bytes(byteData);
??byte[] digest = new byte[20];
??for (int i = 0; i < digestInt.length; i++) {
???intToByteArray(digestInt[i], digest, i * 4);
??}
??return digest;
?}

?// 計算sha-1摘要,返回相應的十六進制字符串
?public String getDigestOfString(byte[] byteData) {
??return byteArrayToHexString(getDigestOfBytes(byteData));
?}

?public static void main(String[] args) {
??String data = "123456";
??System.out.println(data);
??String digest = new SHA1().getDigestOfString(data.getBytes());
??System.out.println(digest);

??// System.out.println( ToMD5.convertSHA1(data).toUpperCase());
?}
}


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/273516.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273516.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273516.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

最大權閉合圖hdu3996

定義&#xff1a;最大權閉合圖&#xff1a;是有向圖的一個點集&#xff0c;且該點集的所有出邊都指向該集合。即閉合圖內任意點的集合也在改閉合圖內&#xff0c;給每個點分配一個點權值Pu&#xff0c;最大權閉合圖就是使閉合圖的點權之和最大。 最小割建邊方式&#xff1a;源點…

非監督學習的單層網絡分析

這篇博客對應的是Andrew.Ng的那篇文章&#xff1a;An Analysis o f Single-Layer Networks in Unsupervised Feature Learning&#xff0c;文章的主要目的是討論receptive field size&#xff0c;number of hidden nodes&#xff0c; step-stride以及whitening在對卷積網絡模型…

Spring MVC 驗證碼

頁面 <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <% String path request.getContextPath(); String basePath request.getScheme()"://"request.getServerName()":"request.getServerP…

數據結構實驗之鏈表四:有序鏈表的歸并

數據結構實驗之鏈表四&#xff1a;有序鏈表的歸并 Time Limit: 1000MS Memory limit: 65536K 題目描述 分別輸入兩個有序的整數序列&#xff08;分別包含M和N個數據&#xff09;&#xff0c;建立兩個有序的單鏈表&#xff0c;將這兩個有序單鏈表合并成為一個大的有序單鏈表&…

apk文件編譯到系統文件中的方法(及包含so庫的)

把第三方或自己開發的apk文件編譯到系統文件(system.img)中的方法&#xff1a; 1 (1)源碼編譯后&#xff0c;把apk拷貝到out\target\product\generic\system\app中。 (2) 執行命令make snod , 把添加的spk編到system.img 中 缺點&#xff1a;執行make clean 后&#xff0c;再…

javascript中interval與setTimeOut的區別

setTimeout(code,millisec) //- 在指定時間后執行代碼 code必須&#xff1b; millisec必須&#xff1b; clearTimeout(setTimeoutId) //- 取消 setTimeout() setInterval(code,millisec)&#xff1b;//指定間隔毫秒內循環執行代碼 code必須&#xff1b; millisec必須&a…

java設計模式之單例模式(七種方法)

單例模式&#xff1a;個人認為這個是最簡單的一種設計模式&#xff0c;而且也是在我們開發中最常用的一個設計模式。 單例模式的意思就是只有一個實例。單例模式確保某一個類只有一個實例&#xff0c;而且自行實例化并向整個系統提供這個實例。這個類稱為單例類。我們前面學習的…

java 遍歷map集合

Map<String, String> map new HashMap<String, String>(); map.put("key1", "value1"); map.put("key2", "value2"); map.put("key3", "value3"); //第一種&#xff1a;通過Map.keySet遍…

poj3009 Curling 2.0 深搜

PS&#xff1a;以前看到題目這么長就沒寫下去了。今天做了半天&#xff0c;沒做出來。準備看題解&#xff0c;打開了網站都忍住了&#xff0c;最后還是靠自己做出來的。算是一點進步吧。 分析&#xff1a; 題目的意思沒明白或者理解有偏差都沒辦法做題。看樣例3和樣例4&#xf…

Android監聽事件

ListView事件監聽&#xff1a; setOnItemSelectedListener 鼠標滾動時觸發 setOnItemClickListener 點擊時觸發 EditText事件監聽&#xff1a; setOnKeyListener 獲取焦點時觸發 RadioGroup事件監聽&#xff1a; setOnCheckedChangeListener 點擊時觸發 CheckBox事件監聽&#…

子類能不能繼承父類的構造方法?

class A{ public A(){} // 1:無參數構造方法。 public A(String s){} // 2.}class B extends A{ public B(String s){ super(s); // 3. }}說明&#xff1a;如果沒有1處的無參數構造方法&#xff0c;那么3處一定要主動調用父類帶參數的構造方法。如果有1處的構造方法&#…

基于原生javascript的ajax實現

function getXMLHttpRequest(){if(window.ActiveXObject){//用戶是ie瀏覽器http_requestnew ActiveXObject("Microsoft.XMLHTTP");}else{//其他的瀏覽器http_requestnew XMLHttpRequest();}return http_request;}var httpRequest;function name(){httpRequestgetXMLH…

Google File System設計方面的問題匯總

1、Google File System概述 google file system是一個分布式文件系統&#xff0c;針對的是數據密集型應用&#xff0c;提供容錯功能&#xff0c;運行在低廉的服務器上&#xff0c;同時給大量的用戶提供高性能服務。盡管google file system有著傳統的分布式文件系統的目標&#…

linux phpize

phpize是什么 1、phpize是用來擴展php擴展模塊的&#xff0c;通過phpize可以建立php的外掛模塊。 當php編譯完后&#xff0c;在bin下面會有phpize這個腳本文件&#xff0c; 在編譯你要添加的擴展模塊之前&#xff0c;執行以下phpize就可以了&#xff1b; 比如現在想在php中加入…

一些常用的正則表達式

較驗郵箱&#xff1a; var EmailReg /^[-_A-Za-z0-9]([_A-Za-z0-9]\.)[A-Za-z0-9]{2,3}$/; 身份證號碼&#xff1a; var reg /(^\d{15}$)|(^\d{17}(\d|X)$)/; 15位身份證號 //身份證15位時&#xff0c;次序為省&#xff08;3位&#xff09;市&#xff08;3位&#xff…

iOS iphone屏幕分析(豈止而大)

在寫本文前&#xff0c;我必須介紹幾點內容&#xff1a;第一點&#xff1a;屏幕上面顯示的內容多少和屏幕的尺寸大小無關第二點&#xff1a;屏幕上面顯示的內容多少和分辨率完全無關第三點&#xff1a;屏幕上面顯示的內容多少和屏幕尺寸、屏幕分辨率、PPI等都是無關的那到底什么…

js的一些實現

響應回車鍵提交表單 //*******************************************************響應回車鍵登錄****************************************************************** document.οnkeydοwnfunction(event){ var e event || window.event || arguments…

【隨筆】Win7下GVIM的安裝與配置

針對各種語言的編輯器千千萬萬&#xff0c;最好的就是最適合自己的&#xff0c;這句話一點沒錯。 偶然間&#xff0c;需要在Windows上編寫代碼&#xff0c;MyEclipse等太大&#xff0c;完全沒有必要&#xff0c;所以就想起來了vim這個神器。個子小&#xff0c;功能強&#xff0…

java遍歷Set集合

在Java中使用Set,可以方便地將需要的類型&#xff0c;以集合類型保存在一個變量中.主要應用在顯示列表. Set是一個不包含重復元素的collection。更確切地講&#xff0c;set 不包含滿足 e1.equals(e2) 的元素對 e1 和 e2&#xff0c;并且最多包含一個 null 元素。 import java.u…

Java switch語句

在Java7之前&#xff0c;switch只能支持 byte、short、char、int或者其對應的封裝類以及Enum類型。 Java7可以使用String作為判斷條件 public class Test { public void test(String str) { switch(str) { case "abc": …