《初識Java微信公衆號開發》 學習中遇到的困難

前一段時間無聊的時候,在慕課網上自學了一點點微信公衆號開發(受學姐威脅)。html

慕課網教程的地址:http://www.imooc.com/learn/368 java


畢竟是免費的課程,不可能講的那麼詳細。因此我吧我遇到的問題跟你們分享一下。git

這是我照着課程敲的代碼(IDE是Eclipse): https://github.com/Zuosy/WeiXin 發到github上面了。github

爲了這個,我還專門到廖大的網站上學了一遍Git。算法

廖大的Git教程傳送們:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000數組


  • 那個映射工具不見尿

不見了,我就用了另外一個映射工具,名字叫natapp。米納桑能夠自行百度一下,就有上面還有圖文教程。微信

由於是玩玩,開個免費的就好了。這個工具不會超時,不錯的。app

發個圖片秀一下:dom

  • 基本配置token驗證失敗

主要的問題是老畢沒有分享sha1加密算法。百度的可能百度到假的「傻一」加密算法。ide

「傻一」加密算法的傳送門:http://www.cnblogs.com/blackdeng/p/6060781.html

防止代碼丟失,我貼出來

傻一加密算法工具類:

 1 package org.fc.Util;
 2 
 3 import java.security.MessageDigest;
 4 import java.security.NoSuchAlgorithmException;
 5 import java.util.Arrays;
 6 
 7 import com.sun.mail.handlers.message_rfc822;
 8 
 9 public class SignUtil {
10     
11     private static String  token="XXXXXX";
12     
13     /**
14      * 傳入三個參數以及微信的token(靜態本身設定)驗證,
15      * @param signature 簽名用來覈實最後的結果是否一致        
16      * @param timestamp 時間標記
17      * @param nonce 隨機數字標記
18      * @return 一個布爾值肯定最後加密獲得的是否與signature一致
19      */
20     public static boolean checkSignature(String signature,
21             String timestamp,String nonce){
22         //將傳入參數變成一個String數組而後進行字典排序
23         String[] arr=new String[]{token,timestamp,nonce};
24         Arrays.sort(arr);
25         //建立一個對象儲存排序後三個String的結合體
26         StringBuilder content=new StringBuilder();
27         for(int i=0;i<arr.length;i++){
28             content.append(arr[i]);
29         }
30         
31         
32         //啓動sha1加密法的工具
33         MessageDigest md=null;
34         String tmpStr=null;
35         try {
36             md=MessageDigest.getInstance("SHA-1");
37             //md.digest()方法必須做用於字節數組
38             byte[] digest=md.digest(content.toString().getBytes());
39             //將字節數組弄成字符串
40             tmpStr=byteToStr(digest);
41         } catch (NoSuchAlgorithmException e) {
42             // TODO Auto-generated catch block
43             e.printStackTrace();
44         }
45         content=null;
46         
47         return tmpStr!=null?tmpStr.equals(signature.toUpperCase()):false;
48         
49     }
50     
51     
52     /**
53      * 將字節加工而後轉化成字符串
54      * @param digest
55      * @return
56      */
57     private static String byteToStr(byte[] digest){
58         String strDigest="";
59         for(int i=0;i<digest.length;i++){
60             //將取得字符的二進制碼轉化爲16進制碼的的碼數字符串
61             strDigest+=byteToHexStr(digest[i]);
62         }
63         return strDigest;
64     }
65     
66     /**
67      * 把每一個字節加工成一個16位的字符串
68      * @param b
69      * @return
70      */
71     public static String byteToHexStr(byte b){
72         //轉位數參照表
73         char[] Digit= {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
74         
75         
76         //位操做把2進制轉化爲16進制
77         char[] tempArr=new char[2];
78         tempArr[0]=Digit[(b>>>4)&0X0F];//XXXX&1111那麼獲得的仍是XXXX
79         tempArr[1]=Digit[b&0X0F];//XXXX&1111那麼獲得的仍是XXXX
80         
81         //獲得進制碼的字符串
82         String s=new String(tempArr);
83         return s;
84     }
85 }

這個是好用的,能夠直接替換老畢的CheckUtil 就好了。

  • XStream報錯

缺乏xmlpull的jar包

傳送門: http://blog.csdn.net/ljg888/article/details/7711852

其實那些jar包,到網上都能下載,我發的gitbug項目裏面應該都已經有了。

  • 中文亂碼問題

這個是我粗心致使的。

1 response.setCharacterEncoding("UTF-8");

這行代碼必定要寫在doPost方法的第一行。

  • 注意大小寫

注意textMessage類裏面的屬性(變量名) 必定要注意大小寫。不然封裝成xml的時候你就會打出GG。

  • MessageUtil工具類

在開發的時候,我發現這個工具類是能夠循環利用的。我就貼出來吧,之後會用到的。

 1 package com.misaka.util;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.util.Date;
 6 import java.util.HashMap;
 7 import java.util.List;
 8 import java.util.Map;
 9 import javax.servlet.http.HttpServletRequest;
10 import org.dom4j.Document;
11 import org.dom4j.DocumentException;
12 import org.dom4j.Element;
13 import org.dom4j.io.SAXReader;
14 
15 import com.misaka.po.TextMessage;
16 import com.thoughtworks.xstream.XStream;
17 
18 public class MessageUtil {
19 
20     // 注意大小寫
21     public static final String MESSAGE_TEXT = "text";
22     public static final String MESSAGE_IMAGE = "image";
23     public static final String MESSAGE_VOICE = "voice";
24     public static final String MESSAGE_VIDEO = "video";
25     public static final String MESSAGE_SHORTVIDEO = "shortvideo";
26     public static final String MESSAGE_LINK = "link";
27     public static final String MESSAGE_LOCATION = "location";
28     // 事件
29     public static final String MESSAGE_EVENT = "event";
30     public static final String EVENT_SUBSCRIBE = "subscribe";
31     public static final String EVENT_UNSUBSCRIBE = "unsubscribe";
32     public static final String EVENT_SCAN = "SCAN";// 掃碼
33     public static final String EVENT_LOCATION = "LOCATION";// 上報地理位置
34     public static final String EVENT_CLICK = "CLICK";
35     public static final String EVENT_VIEW = "VIEW";
36 
37     /*
38      * 須要有一個xml --> map 的方法 還要有一個map --> xml 的方法
39      */
40 
41     /**
42      * xml --> map
43      * @param request
44      * @return
45      * @throws IOException
46      * @throws DocumentException
47      */
48     public static Map<String, String> xmlToMap(HttpServletRequest request) throws IOException, DocumentException {
49         Map<String, String> map = new HashMap<>();
50         SAXReader reader = new SAXReader();
51         InputStream input = request.getInputStream();
52 
53         Document doc = reader.read(input);
54         Element root = doc.getRootElement();
55         List<Element> list = root.elements();
56 
57         for (Element e : list) {
58             map.put(e.getName(), e.getText());
59         }
60         input.close();
61         return map;
62     }
63 
64     /**
65      * textMessage --> xml
66      * @param textMessage
67      * @return
68      */
69     public static String textMessageToXml(TextMessage textMessage) {
70         XStream xstream = new XStream();
71         xstream.alias("xml", textMessage.getClass());
72         return xstream.toXML(textMessage);
73     }
74 
75     public static String initText(String toUserName, String fromUserName, String content) {
76         TextMessage text = new TextMessage();
77         text.setFromUserName(toUserName);
78         text.setToUserName(fromUserName);
79         text.setMsgType(MESSAGE_TEXT);
80         text.setCreateTime(new Date().getTime());
81         text.setContent(content);
82         return textMessageToXml(text);
83     }
84 
85 }

 


 

 

這是我在慕課網上發的手記:http://www.imooc.com/article/20238 

不會用慕課網上的手記,別舉報我抄襲啊。

相關文章
相關標籤/搜索