微信公众平台二次开发JAVA

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

首先介绍一下,期末的作业是做微信平台的二次开发。老师手底下正好有三位大神,可以分别在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哦。这样就可以进行一个交互啦。


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




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值