• 《初识Java微信公众号开发》 学习中遇到的困难


    前一段时间无聊的时候,在慕课网上自学了一点点微信公众号开发(受学姐威胁)。

    慕课网教程的地址:http://www.imooc.com/learn/368 


    毕竟是免费的课程,不可能讲的那么详细。所以我吧我遇到的问题跟大家分享一下。

    这是我照着课程敲的代码(IDE是Eclipse): https://github.com/Zuosy/WeiXin 发到github上面了。

    为了这个,我还专门到廖大的网站上学了一遍Git。

    廖大的Git教程传送们:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000


    • 那个映射工具不见尿

    不见了,我就用了另一个映射工具,名字叫natapp。米纳桑可以自行百度一下,就有上面还有图文教程。

    因为是玩玩,开个免费的就行了。这个工具不会超时,不错的。

    发个图片秀一下:

    • 基本配置token验证失败

    主要的问题是老毕没有分享sha1加密算法。百度的可能百度到假的“傻一”加密算法。

    “傻一”加密算法的传送门: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 

    不会用慕课网上的手记,别举报我抄袭啊。

  • 相关阅读:
    03Qt信号与槽(2)
    01Qt中的隐式共享
    10GNU C语言函数调用
    09GNU C语言程序编译
    第一本C语言笔记(下)
    07控制器和控制卡(3)
    06控制器和控制卡(2)
    集合
    linux指令(目录类操作指令)
    面向对象三大特征
  • 原文地址:https://www.cnblogs.com/zuosy/p/7513860.html
Copyright © 2020-2023  润新知