闲来没事,就记录一下微信公众平台的开发吧~

其实微信公众平台开发没有想象中的那么困难,因为注册了微信公众平台帐号登录之后在开发者模式里有详细的文档,个人感觉介绍还是比较详细的。

微信公众平台订阅号和服务号的区别网上已经有N多的介绍了,这里就不再说了。从微信公众平台登录之后开始说起吧。

对于开发者来说,开发者模式是最好的选择了。因为在里面可以更自由更灵活的选择消息回复方式。编辑模式只能对特定的字符进行相应的消息回复。而且在开发者模式下可以灵活的创建自定义菜单(前提是你的帐号有提供相应的接口,需要微信认证,提供了APPID和SECRET后才能调用接口创建自定义菜单)。

进入开发者模式之后第一步是要填写URL和TOKEN进行验证。因为你既然要对用户发来的消息进行处理作更灵活的回复的话。首先你得能收到帐号粉丝发来的消息。而粉丝发来的消息首先会发到微信服务器,只有进行验证之后微信服务器才知道该把你帐号粉丝发来的消息转发到哪儿(就是你填的URL,你的服务器地址)。所以第一步需要验证,在你的服务器和微信服务器之间建立起连接。下面就来说说URL和TOKEN吧。

URL是要公网能访问到的地址。TOKEN则是自己设置的。想填什么就填什么,不过这个TOKEN在你的服务器代码里会用到。

当你填写了URL和TOKEN之后,微信服务器会向你填写的URL发送GET请求。该请求中会携带四个参数。微信开发者文档里有写。

在这里你填写的TOKEN会被集成到GET请求里的参数里,到你的处理该请求的代码段里就会被用到了。这里对每个参数也做了详细的说明。我也不需要废话了。

当微信服务器向你指定的URL发送请求之后就到你的代码段里了。首先你得获取请求中的上述四个参数(在你的servlet的doGET()方法里获取)。拿到四个参数之后按照文档里说的你要将TOKEN(你之前填写的,在你的代码段里就是一个变量的值了),timestamp,nonce三个参数进行字典排序然后sha1加密处理,处理之后可与微信服务器发来的参数中的signature进行对比(这一步相当于确保你的服务器安全,这样你的服务器才能确定请求是由微信服务器发来的)。若对比结果是一样的就说明该请求是微信服务器发来的,这时在你的代码段里返回取得的参数中的echostr就行了。若不一样就表示请求不是微信服务器发来的。下面就把获取参数及参数处理的java代码贴出来给大家分享一下~

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException { // response.getWriter().write("LOL");
String signature = request.getParameter("signature"); String timestamp = request.getParameter("timestamp"); String nonce = request.getParameter("nonce"); String echostr = request.getParameter("echostr"); PrintWriter out = response.getWriter(); if (SignUtil.checkSignature(signature, timestamp, nonce)) {
out.print(echostr);
}
out.close();
out = null;
}
private static String token = "***你设置的token值*****";

    public static boolean checkSignature(String signature,String timestamp,String nonce){
String[] arr = new String[] {token,timestamp,nonce};
Arrays.sort(arr);
StringBuilder content = new StringBuilder();
for(int i=0;i<arr.length;i++){
content.append(arr[i]);
}
MessageDigest md = null;
String tmpStr = null; try{
md = MessageDigest.getInstance("SHA-1");
byte[] digest = md.digest(content.toString().getBytes());
tmpStr = byteToStr(digest);
}catch(NoSuchAlgorithmException e){
e.printStackTrace();
}
content = null;
return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
}
//这部分代码是从柳峰大神的博客里拷过来的(还是得尊重版权)

private static String byteToStr(byte[] byteArray){
String strDigest = "";
for(int i=0;i<byteArray.length;i++){
strDigest += byteToHexStr(byteArray[i]);
}
return strDigest;
} private static String byteToHexStr(byte mByte){
char[] Digit = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char[] tempArr = new char[2];
tempArr[0] = Digit[(mByte >>> 4)& 0X0F];
tempArr[1] = Digit[mByte & 0X0F]; String s = new String(tempArr);
return s;
}

按照以上代码对微信服务器发来的GET请求处理完毕之后正确返回echostr,微信服务器收到你返回的echostr后就能通过验证了。通过验证之后就能进行开发了。通过看后面的文档,你会发现微信服务器会把你帐号粉丝发来的信息通过POST方式,post到你填写的URL对应的Servlet里。后面的开发工作就可以从你的Servlet的dopost()方法开始……

先写到这,下次有时间继续写(对于微信公众平台开发的个人经验:多看文档)……

如果有问题可以在下面留言或者发邮件给我376751704@qq.com

微信公众帐号开发之一(java)的更多相关文章

  1. 微信公众帐号开发。大家是用框架还是自己写的流程。现在遇到若干问题。请教各路大仙 - V2EX

    微信公众帐号开发.大家是用框架还是自己写的流程.现在遇到若干问题.请教各路大仙 - V2EX 微信公众帐号开发.大家是用框架还是自己写的流程.现在遇到若干问题.请教各路大仙

  2. [033] 微信公众帐号开发教程第9篇-QQ表情的发送与接收(转)

    我想大家对QQ表情一定不会陌生,一个个小头像极大丰富了聊天的乐趣,使得聊天不再是简单的文字叙述,还能够配上喜.怒.哀.乐等表达人物心情的小图片.本文重点要介绍的内容就是怎样在微信公众平台使用QQ表情, ...

  3. [033] 微信公众帐号开发教程第9篇-QQ表情的发送与接收

    我想大家对QQ表情一定不会陌生,一个个小头像极大丰富了聊天的乐趣,使得聊天不再是简单的文字叙述,还能够配上喜.怒.哀.乐等表达人物心情的小图片.本文重点要介绍的内容就是如何在微信公众平台使用QQ表情, ...

  4. 微信公众帐号开发教程第4篇-----开发模式启用及接口配置Java

    欢迎加入群:347245650   345531810 进行讨论相互交流  我的微信号:572839485 我的微信公众账号  我的微社区欢迎关注 索取源码←请点击 图床:没有服务器 拖拽图片 外网即 ...

  5. [039] 微信公众帐号开发教程第15篇-自定义菜单的view类型(访问网页)

    引言及内容概要 距离写上一篇文章<自定义菜单的创建及菜单事件响应>整整过了两个月的时间,那时公众平台还没有开放view类型的菜单.在不久前,微信公众平台悄悄开放了view类型的菜单,却没有 ...

  6. [034] 微信公众帐号开发教程第10篇-解析接口中的消息创建时间CreateTime(转)

    从微信公众平台的消息接口指南中能够看出,每种类型的消息定义中,都包括有CreateTime參数,它表示消息的创建时间,例如以下图所看到的: 上图是消息接口指南中4.1-文本消息的定义.注意Create ...

  7. 微信公众帐号开发-消息创建时间long型与标准时间的互相转换

    /**  *   */ package com.hd.admin.wxmeet.utils; /**  * @author jymcpp  *  */ import java.text.DateFor ...

  8. 欢迎大家关注我的微信公众帐号小q机器人(xiaoqrobot)(转)

    一个偶然的机会让我接触到了微信公众平台,赶紧加了几个交流群了解下相关情况,突然间发现好像全部的APP开发人员都在研究微信公众帐号的开发,而我显得有些落舞了.至于为什么热度会这么高,我想一个数字足以说明 ...

  9. SSH框架构建微信公众帐号服务器小技巧

    SSH框架构建微信公众帐号服务器小技巧 熟悉struts2和servlet的同学应该清楚,struts2的方法多样性弥补了servlet单一的doGet 和doPost方法.如果自己的公众账号服务器是 ...

随机推荐

  1. 忘记mysql数据库密码时进行修改方法

    长时间没有使用数据库了,或者把密码改完之后就忘了数据库密码,不能正常进入数据库,也无法修改密码,有一个简单的常用修改密码方式: 1.首先找到和打开mysql.exe和mysqld.exe所在的文件夹( ...

  2. Java多线程与并发——进程与线程

    1.什么是进程 程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念.而进程是程序在处理机上的一次执行过程,它是一个动态的概念. 进程是一个具有一定独立功能的程序,一个实体,每一个进 ...

  3. ASP.NET MVC CheckBoxFor为什么会生成hidden input控件

    自己开发的公众号,可以领取淘宝内部优惠券 @Html.CheckBoxFor(m => m.Bool) 使用CheckBoxFor方法得到的html代码会是下面这个样子 <input ch ...

  4. 输入网址调用第三方接口获取结果_java

    最近公司给了一个第三方服务的网址,要我调用后返回需要用到的信息 具体网址:http://www.xxxx.com/xxx-api/xxxx/getXxxByUserId?userId=" + ...

  5. sublime 常用快捷键(转)

    Sublime text 3是码农最喜欢的代码编辑器,每天和代码打交道,必先利其器,掌握基本的代码编辑器的快捷键,能让你打码更有效率.刚开始可能有些生疏,只要花一两个星期坚持使用并熟悉这些常用的快捷键 ...

  6. oracle最高账号sys的密码认证模式

    CONNECT USERNAME/PASSWORD@SERVERNAME AS SYSDBAconnect 是指连接到username是指用户名password是指密码servername是指服务名a ...

  7. linux 命令——29 chgrp(转)

    在 lunix系统里,文件或目录的权限的掌控以拥有者及所诉群组来管理.可以使用chgrp指令取变更文件与目录所属群组,这种方式采用群组名称或群组识别 码都可以.Chgrp命令就是change grou ...

  8. Bezier贝塞尔曲线的原理、二次贝塞尔曲线的实现

    Bezier曲线的原理 Bezier曲线是应用于二维图形的曲线.曲线由顶点和控制点组成,通过改变控制点坐标可以改变曲线的形状. 一次Bezier曲线公式: 一次Bezier曲线是由P0至P1的连续点, ...

  9. Select与SelectMany

    SelectMany在MSDN中的解释:将序列的每个元素投影到 IEnumerable(T) 并将结果序列合并为一个序列. 不用去用foreach进行两次遍历,就可以将子循环需要的元素过滤出来... ...

  10. Object comparison - (BOOL)isEqual:(id)other

    https://developer.apple.com/library/content/documentation/General/Conceptual/DevPedia-CocoaCore/Obje ...