写这篇文章其实也是为了给期末的作业增添一项亮点,正好想了一下就把期末的作业总结一下吧。
首先介绍一下,期末的作业是做微信平台的二次开发。老师手底下正好有三位大神,可以分别在python 、java、php方面帮到我们。相对来说java语言是我最熟悉的,所以一开始就选择了java,看着确实很顺眼,但是做到后期发现了一些问题,于是开始改python,python我也是比较喜欢的。第二篇文章会介绍Python的开发。经历了这一个月,算是对两种语言的开发都有所了解吧。做个总结,也让自己别忘记了。
好废话不多说,接下来开始进入正题。
其实网上有很多的视频,教学,慕课网上就有一个比较详实的Java 微信开发的课程。就照着那个课堂上来吧。
一开始是关于微信公众号的介绍,直接跳过去了。。。
进入开发模式。
我用的是myeclipse,本机装了tomcat服务器做测试,然后用了ngrok做外网映射。ngrok这个工具也是非常小巧的,也可以很方便的下载到,百度一搜就是,我就不介绍了。
使用的指令就是,在对应的目录下,输入ngrok http 80就可以把你本机的端口映射出去了。截图如下。
接下来再申请一个用来做测试的微信公众号
也是非常的简单。好,环境搭建,完成。
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
为了保证能让所有的小白看懂,我把我的代码也贴一下吧。protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("here");
String signature = req.getParameter("signature");
String timestamp = req.getParameter("timestamp");
String nonce = req.getParameter("nonce");
String echostr = req.getParameter("echostr");
System.out.println(signature+","+timestamp+","+nonce+","+echostr);
String arr[] = {signature,timestamp,nonce};
PrintWriter out = resp.getWriter();
if(CheckUtil.checkSignature(signature,timestamp,nonce)){
out.print(echostr);
System.out.println("OK");
}
else{
out.print("abc");
}
}
忘记交代了,这个接入验证,是一个GET请求,所以要在get方法里验证。这是我的servlet。另外把checkutil的内容也贴一下。
public static boolean checkSignature(String signature, String timestamp, String nonce){
String arr[] = {timestamp,nonce,TOKEN};
//1排序
Arrays.sort(arr);
//2生成字符串
StringBuffer sbf = new StringBuffer();
for(String str:arr){
sbf.append(str);
}
String sig_ = getSha1(sbf.toString());
return sig_.equals(signature);
}
public static String getSha1(String str){
if (null == str || 0 == str.length()){
return null;
}
char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f'};
try {
MessageDigest mdTemp = MessageDigest.getInstance("SHA1");
mdTemp.update(str.getBytes("UTF-8"));
byte[] md = mdTemp.digest();
int j = md.length;
char[] buf = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
buf[k++] = hexDigits[byte0 >>> 4 & 0xf];
buf[k++] = hexDigits[byte0 & 0xf];
}
return new String(buf);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return null;
}
}
代码如此详细,应该大家都能看懂了吧。
1348831860
1234567890123456
在慕课网上的教程呢,是比较方便地用到了一个jar包,可以方便地把发送过来的数据流,按照元素节点,解析成对应的map,这个就非常方便了。这样到后面我们只要用Map即可。比如说,我们想看它的消息类型,就可以这么读取
String msgType = map.get("MsgType");
同理,想看一下这个文本的内容,就可以这样看一下。
String content = map.get("Content")
这样真的就非常方便了。大家可以根据类型,msgType去看,发来的到底是文本呢,还是图片呢,还是语音呢?
12345678
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
PrintWriter out = resp.getWriter();
String returnStr = WechatService.ProcessMessage(req);
System.out.println(returnStr);
out.print(returnStr);
out.close();
}
第二呢,就是所有发送回去的,都是一个String,当然是按照拼装好格式的url哦。这样就可以进行一个交互啦。
好了,以发送消息为例,一个简单的微信二次开发就做完了。我觉得这篇文章的要点在于,有详实的代码,可以防止一些小白干瞪眼。当然,大家可以留言,大家一起交流。