写这篇文章其实也是为了给期末的作业增添一项亮点,正好想了一下就把期末的作业总结一下吧。
首先介绍一下,期末的作业是做微信平台的二次开发。老师手底下正好有三位大神,可以分别在python 、java、php方面帮到我们。相对来说java语言是我最熟悉的,所以一开始就选择了java,看着确实很顺眼,但是做到后期发现了一些问题,于是开始改python,python我也是比较喜欢的。第二篇文章会介绍Python的开发。经历了这一个月,算是对两种语言的开发都有所了解吧。做个总结,也让自己别忘记了。
好废话不多说,接下来开始进入正题。
其实网上有很多的视频,教学,慕课网上就有一个比较详实的Java 微信开发的课程。就照着那个课堂上来吧。
一开始是关于微信公众号的介绍,直接跳过去了。。。
进入开发模式。
一、环境搭建。
我用的是myeclipse,本机装了tomcat服务器做测试,然后用了ngrok做外网映射。ngrok这个工具也是非常小巧的,也可以很方便的下载到,百度一搜就是,我就不介绍了。
使用的指令就是,在对应的目录下,输入ngrok http 80就可以把你本机的端口映射出去了。截图如下。
接下来再申请一个用来做测试的微信公众号
也是非常的简单。好,环境搭建,完成。
二、开发者模式接入。
这个是微信公众号的开发文档。这里就有有关,接入的方法。用到了这几个变量,
signature,timestamp,nonce,echostr。验证的方法呢,也是非常简单。
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; } }
代码如此详细,应该大家都能看懂了吧。
三、消息的接收。
toUser
fromUser
text
this is a test
23456
在慕课网上的教程呢,是比较方便地用到了一个jar包,可以方便地把发送过来的数据流,按照元素节点,解析成对应的map,这个就非常方便了。这样到后面我们只要用Map即可。比如说,我们想看它的消息类型,就可以这么读取
String msgType = map.get("MsgType");
同理,想看一下这个文本的内容,就可以这样看一下。
String content = map.get("Content")
这样真的就非常方便了。大家可以根据类型,msgType去看,发来的到底是文本呢,还是图片呢,还是语音呢?
四、消息的发送。
toUser fromUser text 你好 然后给它返回回去就行啦!
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哦。这样就可以进行一个交互啦。
好了,以发送消息为例,一个简单的微信二次开发就做完了。我觉得这篇文章的要点在于,有详实的代码,可以防止一些小白干瞪眼。当然,大家可以留言,大家一起交流。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/225331.html原文链接:https://javaforall.net
