微信公众号开发实例
文档下载地址:
https://github.com/duangYiXia/WX-DEMO
下微信公众号开发实例01.docx
本文档主要以天气查询为功能的微信公众号应用开发为例,详细地描述了微信公众号应用开发的环境搭建,开发过程,以及其它相关的知识。
1.简介
微信,是当下智能手机几乎必装的即时通讯服务软件。全球注册人数数亿,截止2016年12月,微信月活跃用户数高达8.89亿。如此巨大的月活跃用户数,自然蕴含了巨大的商机。2012年8月20日,腾讯公司在微信中加入了微信公众号的功能。此功能主要面向个人、政府、媒体、企业等机构推出了合作推广业务。大家使用微信公众号将自己的品牌推广给数亿的微信用户,减少了宣传成本,提高了品牌知名度,打造了更具影响力的品牌形象。
“再小的个体,也有自己的品牌”,这是微信公众号网站上的广告词。现如今大量的用户加入了微信公众号应用的开发之中,给微信用户提供了各种各样的服务,如微网站,微商城,微KTV,微政务,微酒店,微汽车,微旅游,微餐饮,微调查,微会员,微喜帖,微团购,微房产,微教育,微菜单,微门店,微物业,微酒吧,微餐饮,微花店,微美容,微婚庆,微生活,微相册,LBS,智能客服等等功能。
1.1 基础知识
1. 微信公众平台与微信公众号的关系
微信公众平台是腾讯公司为了让用户申请和管理微信公众号而推出的一个WEB平台。而微信公众号的所有操作管理都需要在微信公众平台下进行。所有用户都需要在腾讯公司统一提供的微信公众平台下操作。URL地址:
https://mp.weixin.qq.com
微信公众号与微信的区别
微信公众号的服务对象是微信,是以微信为载体,简单来说,没有微信,就用不了微信公众号提供的功能。微信公众号需要利用微信公众号平台来开发,可能需要用到WEB服务器。而微信只需要下载微信app到手机安装即可使用。微信公众号与微博的区别
微信公众号更具有私密性,达到率更高,侧重于客户管理,且具有即搜即用的特点。微薄更侧重于传播和公开。微博的信息过多,发表的微博可能被淹没在海量消息中而不会被粉丝看到。- 微信公众号的分类
微信公众号目前有三种类型:
企业号
微信为企业客户提供的移动应用入口、简化管理流程,提升组织协同动作效率;帮助企业建立员工、上下游供应链与企业IT系统间的连接。
适用人群:媒体、企业、政府或其它组织。
服务号
服务号开发的接口比较多,主要针对于企业、以服务功能型为主的账户,功能强大,但不需要过多推送内容,以服务为主,给企业和组织提供更强大的业务服务与用户管理能力,帮助企业快速实现全新的公众号服务平台,如招商信用卡、南方航空。很多企业也会选择服务号与订阅号同时建立来满足不同的服务需求。
适用人群:媒体、企业、政府或其它组织。
订阅号
主要用于推广。多是一些媒体、自媒体、公司市场、品牌、宣传使用,为媒体和个人提供一种新的信息传播方式,构建与读者之间更好的沟通和管理模式。订阅号还分个人订阅号和企业组织类的订阅号,个人号无法认证,请申请企业类的账号,才能获得更多权限和排名的优化。
适用人群:媒体、企业、政府或其它组织。
三种账号的区别:
5. 微信公众号的申请准备资料
“企业”类型
包括:企业、分支机构、企业相关品牌、产品与服务、以及招聘、客服等类型的公众号。
“媒体”类型
包括:报纸、杂志、电视、电台、通讯社、其他媒体等类型的公众号。
“政府”类型
包括:国内外、各级、各类政府机构、事业单位、具有行政职能的社会组织等类型的公众号。
目前主要覆盖公安机构、党团机构、司法机构、交通机构、旅游机构、工商税务机构、市政机构、涉外机构等。
“其他组织”类型
包括:不属于企业、政府、媒体、个人的机构类型的公众号。
“个人”类型
包括:由自然人注册、认证、运营的公众帐号。
- 微信公众平台的测试号
申请微信公众号,还是比较麻烦,并且微信公众号的名称一旦注册就不能修改。开发微信公众号应用时,开发者可能也没有想好微信公众号的名称,另外也不知道微信公众号平台是否能提供自己需要的功能。
目前微信公众号平台提供测试号,这个不需要申请正式的微信公众号,就可以直接体验和测试微信公众号平台支持的所有高级API接口。
申请地址:
https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
注意:
使用测试号时,对微信公众平台提供接口的调用次数是有限制的。
具体参见文档:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433744592
2.开发准备
2.1 业务流程
从用户访问微信公众号,直到看见微信公众号的反馈消息过程中,到底经历了那些步骤:
从上面的业务流程中,可以看到微信公众号应用开发至少需要这些东西:
1、 微信公众号,微信关注了微信公众号以后,我们才有发送消息的入口。
2、 WEB服务器,用于部署WEB应用,WEB应用为微信公众号提供了各种服务。
3、 通信协议,即微信公众号平台与WEB应用之间的通信协议及其内容,了解这些知识才能正确处理来自微信公众号平台发来的请求消息,并且回复合适的响应消息回去。
2.2 微信公众号
微信公众号,需要到腾讯公司统一提供的微信公众号平台去申请。由于申请微信公众号还是有一些麻烦,开发微信公众号最方便快捷的方式,还是去微信公众号平台上申请测试号。
下面是申请微信公众测试号的过程:
1. 打开浏览器,输入网址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
点击网页中的“登录”按钮,出现一个二维码:
在手机上登录你的微信,然后使用微信中的“扫一扫”功能,扫描上面网页中的二维码。手机上会出现以下界面:
在手机上点击“确认登录”按钮,返回电脑网页,网页将会变成:
网页中会提供测试号的账号名称,appID和appsecret,以及二维码等信息。到这里,就完成了微信公众测试号的申请工作。
说明:
每一个微信公众测试号都有唯一的标识,通常是以gh_xxxxxxxxxxxx命名,由微信公众号平台自动产生。
appID和appsecret是测试号的重要信息,也是由微信公众号平台自动产生,用于调用微信公众号平台高级接口时作验证使用。
微信公众测试号二微码,也是由微信公众号平台自动产生,用于微信扫一扫加关注时使用。当扫描这个二微码加关注以后,就有了一个微信公众号的信息输入口。
此时的微信公众测试号并不能马上使用,还需要填写“接口配置信息”中的两项:
. URL
需要填写你的WEB应用服务的URL地址,这个地址必须在公网上被微信公众号平台访问到。根据微信公众号平台的规定,你的WEB应用应该部署在带域名并且开放80端口的公网服务器上。如果正式运营微信公众号时,所使用到的域名还需要ICP备案。
. Token
令牌,是你自己任意输入的信息,用于WEB应用接收微信公众号消息时作消息源验证使用。简单来说,就是用于验证WEB应用接收到的消息是否来自微信公众号平台。微信公众号平台转发消息给WEB应用时,会带上这个Token。
目前我们还没有WEB服务器,WEB应用也没有部署上去,这里的URL地址自然也无法确定。Token暂时也不急着填写。接下来,我们先设置WEB服务器,部署WEB应用。
2.3 WEB服务器
WEB应用赋予了微信公众号具有的所有功能。WEB应用部署在WEB服务器上。由于微信公众号平台的规定,WEB服务器需要公网域名并且开放80端口的访问。申请域名,申请主机,对于一般开发者而言,门槛还是比较高,即便在互联网上能找到免费的公网域名和主机资源,对于开发工作,也是相当不方便。因为软件开发,修改的工作是再平常不过的事情,每一次的修改都需要上传到公网服务器上作验证,想想也是头疼的事情。
开发者通常习惯使用本地环境做开发和测试。有这样的需求,自然也就有相应的解决方案:使用内网穿透技术。即向公网上的一个地址发送请求,可以转发到内网服务器上并返回响应消息。实现这种技术的软件很多,如nat123、花生壳、ngrok等等。
其中ngrok被使用的最多,ngrok是一个反向代理,可以在公共的端点和本地运行的WEB服务器之间建立一个安全的通通。可惜国外的ngrok.com由于各种原因被微信公众号平台封杀。还好,国内使用ngrok技术的一些站点还能使用。其中ngrok.cc是一个不错的选择,至少目前还提供免费的服务。
使用ngrok.cc的服务,需要到ngrok.cc网站上去申请账号,并且下载相应的软件。
下面是申请账号的过程:
1、 打开浏览器,输入网址:https://www.ngrok.cc/
2、 点击“注册”或者“立即注册”按钮
3、 填写“电子邮箱”,“用户名”,“密码”和“验证码”,点击“注册”按钮
4、 如果没有意外,会提示注册成功,之后自动转入登陆界面
5、 输入注册时“邮箱”和“密码”,点击“登陆”按钮,进入ngrok后台管理页面
6、 点击左侧栏菜单“隧道管理”-“开通隧道”,如下所示:
7、 网页右侧有“香港免费服务器”的选项,点击下面的“立刻购买”按钮,页面如下
8、 我们使用ngrok.cc站点将微信公众号消息转发到内网,只需要填写“隧道名称”,“前置域名”和“本地端口”即可。隧道协议默认http,不要填写“http验证用户名”和“http验证密码”字段。
说明:
“隧道名称”,可以任意输入,如“微信公众号测试”
“前置域名”,是你指定的域名前缀,如testserver1,那么你的域名全称就是testserver1.ngrok.cc,这里不需要输入ngrok.cc,只需要输入你想要域名的前缀。
“本地端口”,这个是指你想将消息转发的哪一台机器和哪一个端口,通常填写“127.0.0.1:8080”。
当这些字段填写后,那么这个隧道的工作内容,就是将发送到testserver1.ngrok.cc的消息,转发到本地服务器127.0.0.1的8080端口。
9、 填写好信息后,点击页面下面的“确定添加”按钮,就可完成账号的申请,点击左侧菜单“隧道管理”-“隧道管理”,可以看到你申请的账号信息,如下图
其中,有隧道id很重要,在使用软件连接到ngrok.cc站点时需要使用到,用于作隧道合法性验证。
10、 使用浏览器,再次打开网站https://www.ngrok.cc的主页,在网页下面选择本地服务器对应操作系统版本的ngrok软件。支持Linux 32bit/64bit/arm,Mac OSX 32bit/64bit,Window 32bit/64bit等。这里选择Window 64bit版本的ngrok软件即可。
11、 解压缩ngrok软件包,运行里面的程序“Sunny-Ngrok启动工具.bat”,如下图:
12、 现在输入步骤9中的隧道id,回车确认,ngrok客户端软件就开始连接ngrok.cc站点服务器,如果没有意外,连接成功以后的样子,应该是这样的:
从截图中可以看出,ngrok软件初始化完成,http://testserver1.ngrok.cc -> 127.0.0.1:8080,这个正是当初在ngrok.cc站点申请隧道的工作内容。
13、 隧道已经建立完成。我们可以作一个简单的测试。在本地Window服务器上启动一个TOMCAT服务,服务地址:127.0.0.1:8080。
14、 打开浏览器,输入网站:http://testserver1.ngrok.cc,浏览器应该可以显示一些内容了,如下图:
15、 同时查看ngrok客户端软件,也有一些信息提示,如下图:
16、 自此,我们就完成了WEB服务器的设置。
总结一下上面的内容,我们使用本地启动了TOMCAT服务的Window机器,做为微信公众号应用的WEB服务器,并且利用ngrok.cc站点提供ngrok技术,实现了公网地址上的请求转发到内网服务器上面。
有了WEB服务器,自然要部署WEB应用,因为涉及到WEB应用与微信公众号平台之间的通讯,因此需要先了解下一节“通讯协议”。
2.4 通信协议
这里所说的通讯协议,特指微信公众号平台与WEB应用程序之间的通讯协议。
微信公众号平台与WEB应用程序之间使用HTTP协议。因此,开发微信公众号应用能使用的开发语言就相当广泛了,如Java、Python、PHP等等。只要能同时支持HTTP GET和HTTP POST方法的开发语言,都可以用于微信公众号应用的开发。
HTTP GET方法,主要用于验证消息是否来自微信服务器。
HTTP POST方法,主要用于接收来自微信服务器提交过来的信息,如:文本、图片、地理位置、链接以及事件等。
下面是具体的协议内容:
1、 HTTP GET
应该还记得前面申请微信公众测试号时,有一个地方需要填写URL和Token。
当时我们并没有填入任何信息,主要因为当时服务地址并没有确定。
现在假设服务URL已经确定,如: http://testserver1.ngrok.cc/testserver/wx,并且Token指定为testserver,点击上面的“提交”按钮,网页会提示“配置失败”。即使服务URL:http://testserver1.ngrok.cc/testserver/wx真实存在,提交仍然会提示“配置失败”。这是为什么呢?
这是因为微信公众号平台的规定,强制WEB应用对微信公众平台的消息作消息源验证。
当上面页面点“提交”按钮时,微信公众号平台会发出HTTP GET请求:http://testserver1.ngrok.cc/testserver/wx?signature=xxx×tamp=xxx&nonce=xxx&echostr=xxx,即在你输入的URL后面携带上下面4个参数:
开发者需要通过signature对请求进行校验,下面是校验方法:
若确认此次HTTP GET请求来自微信服务器,原样返回echostr参数内容,则接入微信公众号平台成功,否则接入失败。
由于我们并没有WEB应用正确处理微信公众号平台发来的验证消息,所以才会提示“配置失败”。
解决的办法如下:
使用Eclipse创建一个WEB工程testserver,然后编写一个wx的servlet,在void doGet()方法中,解析出echostr,直接返回,就可以通过消息源验证。
2、 HTTP POST
HTTP POST,主要用于微信公众号平台向WEB应用程序发送文本,图片,地理位置,链接以及事件通知消息。
POST的URL,即是你在微信公众号平台填写的URL,如:
http://testserver1.ngrok.cc/testserver/wx
POST的请求消息的内容和返回消息的内容都使用XML格式,下面是具体的说明:
.文本请求消息举例说明: