微信公众平台二次开发JAVA

来源:互联网 发布:国密算法实现 编辑:程序博客网 时间:2024/06/05 04:38

写这篇文章其实也是为了给期末的作业增添一项亮点,正好想了一下就把期末的作业总结一下吧。

首先介绍一下,期末的作业是做微信平台的二次开发。老师手底下正好有三位大神,可以分别在python 、java、php方面帮到我们。相对来说java语言是我最熟悉的,所以一开始就选择了java,看着确实很顺眼,但是做到后期发现了一些问题,于是开始改python,python我也是比较喜欢的。第二篇文章会介绍Python的开发。经历了这一个月,算是对两种语言的开发都有所了解吧。做个总结,也让自己别忘记了。

好废话不多说,接下来开始进入正题。

其实网上有很多的视频,教学,慕课网上就有一个比较详实的Java 微信开发的课程。就照着那个课堂上来吧。

一开始是关于微信公众号的介绍,直接跳过去了。。。

进入开发模式。

一、环境搭建。

     我用的是myeclipse,本机装了tomcat服务器做测试,然后用了ngrok做外网映射。ngrok这个工具也是非常小巧的,也可以很方便的下载到,百度一搜就是,我就不介绍了。

使用的指令就是,在对应的目录下,输入ngrok http 80就可以把你本机的端口映射出去了。截图如下。

接下来再申请一个用来做测试的微信公众号

也是非常的简单。好,环境搭建,完成。

二、开发者模式接入。

开发者模式接入,对很多小白来说就是第一关。不过跟着教程走,认真仔细听,应该很快就会跨过去的。
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319&token=&lang=zh_CN这个是微信公众号的开发文档。这里就有有关,接入的方法。用到了这几个变量,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;    }}
代码如此详细,应该大家都能看懂了吧。

三、消息的接收。

同样是看到了开发者文档。一个普通的文本消息格式如下,这些元素节点就不用我解释了吧,开发文档都有。我们要返回的时候呢,就同样按照格式,给它返回一个xml格式的文本。
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1348831860</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[this is a test]]></Content> <MsgId>1234567890123456</MsgId> </xml>
在慕课网上的教程呢,是比较方便地用到了一个jar包,可以方便地把发送过来的数据流,按照元素节点,解析成对应的map,这个就非常方便了。这样到后面我们只要用Map即可。比如说,我们想看它的消息类型,就可以这么读取
String msgType = map.get("MsgType");
同理,想看一下这个文本的内容,就可以这样看一下。
String content = map.get("Content")
这样真的就非常方便了。大家可以根据类型,msgType去看,发来的到底是文本呢,还是图片呢,还是语音呢?
当然也可以根据发来的文本的内容,做具体的解析。比如说,发来1,代表了什么含义,有什么要求。就赶紧做对应的反应,并封装好信息,回传回去。


四、消息的发送。

要回复文本消息呢,也是非常的简单。按照开发者文档,只要成为这样一个格式的,

<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>12345678</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[你好]]></Content></xml>

然后给它返回回去就行啦!

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哦。这样就可以进行一个交互啦。


好了,以发送消息为例,一个简单的微信二次开发就做完了。我觉得这篇文章的要点在于,有详实的代码,可以防止一些小白干瞪眼。当然,大家可以留言,大家一起交流。




0 0
原创粉丝点击