本课程将带领大家学习一门新的技术:PHP微信公众号接口开发。主要目的是让大家了解微信公众号接口开发技术,了解公众号和服务器的消息交互和处理。利用php开发一个简易的公众号SDK,封装一些常用的接口,最后通过测试并搭建一个自己的微信公众号,实现与粉丝的交互。
本课程总共分为三个实验。本次实验主要为大家介绍一下微信公众平台情况,配置服务器并接入微信公众平台进行开发。
本课程着重于接口开发和功能测试,暂不需要前台的操作界面。
开启 Apache 服务器:
sudo service apache2 start
代码编写:
- 会员用户,推荐使用 WebIDE
- 普通用户,可以使用普通文本编辑器,我推荐 sublime:点击桌面左下角, 应用程序菜单/开发/sublime
既然是微信公众号开发,大家别忘了关注实验楼的公众号,获取最新实验教程:
顺便也贴一下我的公众号,这也是我写完这门课程之后的成果,欢迎关注
近年以来,越来越多的人逐渐使用微信作为主要的社交聊天工具,据统计,微信每月活跃用户已达到5.49亿,用户覆盖200多个国家、超过20种语言。可见其覆盖范围之广,用户量之大。
随着微信的火热,也衍生一系列周边产品,很多商家看中了微信的巨大用户量,开始进军微信市场,大家最常听说的就是微商了,通过微信朋友圈宣传,在微店浏览商品,下单,支付,形成一套完整的购物体系。
其他一些组织或者机构,也可以通过微信来宣传营销自己的产品。于是有了微信公众平台来满足需求。公众平台的作用在官方文档有说明:微信公众平台是运营者通过公众号为微信用户提供资讯和服务的平台
。相信你或多或少关注了一些公众号,也体验过他们的服务,如果你没有关注过微信公众号,赶快关注上方实验楼官方微信,获取更多资讯。
为了满足个性化和高级的功能需求,微信公众平台面向开发者提供了公众平台的API,只需要简单的配置,开发者可以根据这些api自定义功能,开发更有特色的产品。如果你此前没有接触过这种类似的开发(调用api),那么通过本套课程,你将学到很多新东西。好了,闲话不多说,下面我们正式开始开发工作。
要使用微信公众平台,首先需要有一个微信公众号,如果你已经有账号了,那么可以跳过这部分内容。如果还没有账号,点击 申请 前往公众号申请页面。
填写表单的各种信息,你就可以拥有一个微信公众号。有几点说明一下,微信公众号分为三种类型:订阅号
、服务号
、企业号
,不同类型的公众号对应不同的用户群体和不同的功能。
服务号、订阅号、企业号的介绍(区别)
1、订阅号:主要偏于为用户传达资讯(类似报纸杂志),认证前后都是每天只可以群发一条消息;
2、服务号:主要偏于服务交互(类似银行,114,提供服务查询),认证前后都是每个月可群发4条消息;
3、企业号:主要用于公司内部通讯使用,需要先有成员的通讯信息验证才可以关注成功企业号;
温馨提示:
1、如果想简单的发送消息,达到宣传效果,建议可选择订阅号;
2、如果想进行商品销售,进行商品售卖,建议可申请服务号;
3、如果想用来管理内部企业员工、团队,对内使用,可申请企业号。
4、订阅号可通过微信认证资质审核通过后有一次升级为服务号的入口,升级成功后类型不可再变。
5、服务号不可变更成订阅号。
对我们个人而言,我们选择订阅号就可以了。按照正常的注册流程成功之后。登录进去之后,你就可以看到你的公众号后台了,你可以花点时间了解一下各种功能的使用。
接下来,我教大家如何快速搭建一个自己的公众号(不用写任何代码),直接通过后台管理就可以实现,我简单演示一下:
-
关注自动回复
如果你关注过公众号,你应该就知道这个功能的使用,当你第一次关注这个公众号时,系统会给你发欢迎信息,就是这个功能,你可以自己设置个性化的欢迎信息
-
消息自动回复
用户给公众号发送任意消息,公众号马上给出回复内容,不过有频率限制,一小时只能回复两至三条消息。
-
关键词回复(全匹配/模糊匹配)
类似于和机器人聊天,只要你发送的消息中包含某些关键词,系统就会自动给你发相应的消息。比如,我设置关键词
笑话
(可设置多个关键字),回复内容为一段笑话。当用户给你发消息时,系统会自动检测关键字(可以设置完全匹配或模糊匹配),发送内容给我讲一个笑话
,那么系统会自动下发你设置好的笑话内容。当然,你也可以回复语音,图片,图文或者视频内容。非常好玩。 -
自定义菜单(默认未开启)
自定义客户端可以使用的菜单功能
设置好你的菜单和功能之后,一个简单的公众号就可以使用了(更多的功能,自己去探索)。
查看当前公众号的信息:
拿起你的手机,扫描你的二维码,成为你的公众号的第一个粉丝。你将会体验到你刚才设置的功能。当然,这只是一个简单的公众号,如果你有兴趣,有内容,有粉丝的话,你也可以运营你自己的公众号,在上面发布有用的信息,让更多人看到。
如果你满足于上面的效果和功能,那我只能说你太容易满足了。上面的教程只是适用于不会编程的小白用户,不用写一行代码,就可以搭建一个功能丰富的公众号。既然你在学习本课程,说明你具有一定的编程能力,接下来,让我们更加深入了解微信公众号是如何实现这些功能的,他们的信息是如何传递的,消息是如何处理的。让我们通过写代码方式来实现上面的功能。
也许你会纳闷,上面的公众号后台使用非常方便,功能也很多,为什么我们还要自己写代码?
原因很简单,上面管理的功能都是一些比较低级的功能,成为开发者之后,就可以使用公众平台的高级功能、自动应答菜单、客服、自定义菜单、微官网、微信商城等功能。这些都需要我们自己调用公众平台提供的API去对接实现
当然,本课程也不会涉及到这些高级的功能,我们主要通过代码的方式,先实现一些低级的功能,比如消息管理,用户管理以及素材管理等,虽然这些功能都可以通过管理界面实现。但是作为开发者,我们更愿意用代码去实现,在此过程中,不断提高编程能力,还可以了解公众号运行的原理,为以后开发高级功能打好基础。
虽然公众平台提供了api调用,但是限制了权限频率,你可以查看 [开发]--->[接口权限],查看当前接口使用权限和使用频率。可以看到,一个新的公众号,可使用的接口数量太少了,根本达不到我们练习的目的。不过,我们申请一个测试号,点击 [开发]--->[开发者工具],你可以看到以下页面:
我做了两处标记,一个是开发者文档,没有文档,开发寸步难行。所有的操作都需要根据文档的说明来做。
第二个就是特意为开发者准备的测试账号,使用这个账号,我们可以使用所有高级和初级api,基本上没有任何条件限制。最适合我们用来做开发练习。
进入之后,你就会得到测试号的开发配置信息。这些信息在正常的公众号里也有。点击 [开发]--->[基本配置] 就可以看到你的公众号开发者信息:
测试号与普通的公众号最大的区别就是不限制接口使用权限,使用频率限制也降低了,更好地帮助开发者调用API测试自己的应用。
为了识别用户,每个用户针对每个公众号会产生一个安全的OpenID,如果需要在多公众号、移动应用之间做用户共通,则需前往微信开放平台,将这些公众号和应用绑定到一个开放平台账号下,绑定后,一个用户虽然对多个公众号和应用有多个不同的OpenID,但他对所有这些同一开放平台账号下的公众号和应用,只有一个UnionID,可以在用户管理-获取用户基本信息(UnionID机制)文档了解详情。
AppSecret(应用密钥):这个相当于你的账户密码,一般情况下不能泄露。需要同时传递 OpenID 和 AppSecret 才可以获取接口凭证 access_token。
公众平台以access_token为接口调用凭据,来调用接口,所有接口的调用需要先获取access_token,access_token在2小时内有效,过期需要重新获取,但1天内获取次数有限,开发者需自行存储,详见获取接口调用凭据(access_token)文档
为了接入微信公众平台,我们需要配置自己的服务器(非本地),完成与微信服务器对接。
这里我就不一步一步的截图教大家了。在开发中文档中有详细的说明,为了帮助开发者快速入门公众平台,在开发文档中给我们提供了一个入门教程:入门指引 。你可以根据上面的操作完成服务器配置与接入工作,而且还提供了一些小示例,不过是用 python 实现的,待会儿我们用 php 也可以完成。
当你看了入门指引 之后,肯定很郁闷,因为其中有一项配置是需要使用一台在线服务器。其实原因很简单:
默认情况下,我们发送的所有消息都是微信服务器来接受、处理以及回复的,你现在自己的公众号就是这样的,你刚才设置的那些消息回复和菜单相应都是由微信服务器来处理。
而现在,我们需要自己开发微信公众号接口,那么微信服务器就只是一个中继站,它负责用户与开发者服务器之间的信息传递。用户发送一条消息,微信服务器接收到,然后经过数据格式处理,将数据发送给开发者服务器,开发者就可以收到这些信息,开发者可以对用户的消息做处理并且做出回应,回应的消息也将被微信服务器接受,再次经过数据格式的转换,发送给用户。
所以为了保证信息正确传递和接受,开发者必须要有一台在线服务器能和微信服务器 进行数据交互。
我相信学习本课程的绝大多数人都没有一台在线的服务器。
接下来最直接的问题就是:如何拥有一台在线服务器?一般情况下,因为种种原因,外网是不能访问我们自己的个人电脑的。所以我们本地搭建的那些web项目,别人没办法访问。最简单也是最有效地方法就是购买阿里云或腾讯云的 VPS。不过这需要一定的资金,我觉得对你们来说还不至于。
对于程序员来说,越困难的技术,有人越想去解决。总会有聪明的人想出最好解决方案。这里我给大家推荐一个内网穿透神器:ngrok ,因为这是国外的网站,因为某些原因,下载网速可能很慢,所以我为大家上传了这个文件,使用以下命令获取:
wget http://labfile.oss.aliyuncs.com/courses/676/ngrok-stable-linux-amd64.zip
他的作用:ngrok allows you to expose a web server running on your local machine to the internet. Just tell ngrok what port your web server is listening on.
翻译过来就是:ngrok允许你将本地计算机上运行的Web服务器公开到互联网。 只要告诉ngrok你的web服务器正在监听什么端口。
这正是我们想要的功能,我们我们平时都是用本地Apache作为服务器,监听 80 端口,使用 127.0.0.1:80
就可以访问本地服务。那么,通过这个软件,他会给我们一个动态域名,通过这个域名可以映射到我们的本地web地址。
通过这样的方式,我们本地服务器就变成了在线服务器,通过访问他提供的这个域名,实际访问的是我们本地的服务。如果你有其他的自己本地的项目,也可以变成线上项目,让其他人访问你的服务(如果你曾经有想上线的想法,赶快体验一下)。通过本地的 4040 端口,可以查看 ngrok 的运行状态和通信请求记录。
不过这种方式只适合用来学习且短时间内使用,因为这个程序不能关闭,如果你关闭了程序,你当前的域名就会失效,下次再使用该程序,你又会得到一个新的域名,而且这个域名非常不容易记住。如果你想让你的项目一直在线,那么你必须保持这个程序运行,且你的电脑也不能关机,而且他的在线状态也不是很稳定。所以只适合用来学习交流用途,如果你有上线需求的话,还是去买VPS吧。不过这个工具对我们来说已经足够使用了。
接下来将我们服务器与微信服务器对接。
实验楼的在线环境默认没有开启 Apache 服务器,使用以下命令开启:
sudo service apache2 start
在浏览器中打开 127.0.0.1:80
,我们的服务器已经运行了:
将下载的 ngrok 解压并运行:
unzip ngrok-stable-linux-amd64.zip
./ngrok http 80 #因为网络原因,可能需要尝试多次获等待一段时间
你就可以得到我上面运行的界面,它提供了两个 url ,分别是 http
和 https
。保持持续运行,复制任意一个 url,放到浏览器中打开,你会看到如下界面(访问速度可能较慢,耐心等待):
注意到url的变化了吗?通过这样的方式,我们本地的项目就变成在线项目了。记住你当前的 url。
进入测试账号管理页面,看到有 接口配置信息
的表单,URL
就填上你刚才所使用的 url。Token
是你自定义的字符串,随便填什么都行,我填的是 helloweixin
。点击提交,百分百是配置失败的。接下来我讲一下开发者服务器是如何接入微信服务器的(首次配置)。
这在开发者文档中有详细说明:接入指南 ,具体的内容大家自己花时间去看,文档中的示例是普通账号的配置方式,稍微多一些选项,在测试账号中就非常简单了,不过原理都是一样的。我这里就简单总结一下:
当我们配置好接口信息之后,点击提交之后,微信服务器将发送GET请求到填写的服务器地址URL上,包含四个字段:
signature:微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
timestamp:时间戳
nonce:随机数
echostr:随机字符串
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
我们需要自己写代码校验 signature
。这个我等一下说。
验证URL有效性成功后即接入生效,成为开发者。你可以在公众平台网站中申请微信认证,认证成功后,将获得更多接口权限,满足更多业务需求。(个人账号不能认证,测试账号不用关心借口权限)
成为开发者后,用户每次向公众号发送消息、或者产生自定义菜单、或产生微信支付订单等情况时,开发者填写的服务器配置URL将得到微信服务器推送过来的消息和事件,开发者可以依据自身业务逻辑进行响应,如回复消息。
至此,我们的接入流程就完毕了。接下来就是写代码校验请求。
进入Apache服务器的web根目录:/var/www/html
。因为后续实验涉及到文件写入的操作,所以我们需要更改一下根目录的权限:
sudo chmod -R 777 html
之前也说过,我们要开发一个简易的SDK,封装常用的接口功能。通俗一点就是写一个类,里面封装很多方法,一些方法对应API接口的功能实现。
首先新建一个 wechat.class.php
作为我们的微信类,所有的API功能都通过他的方法实现。
他要实现的第一个功能就是校验signature,编辑如下:
<?php
/**
* wechat class
*/
class WeChat
{
//接入验证
public function valid()
{
$echoStr = $_GET["echostr"];
//valid signature , option
if($this->checkSignature()){
echo $echoStr;
exit;
}
}
//Signature验证
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$tmpArr = array($this->token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
}
验证的逻辑上面已经说过了。
打开 index.php
,删除里面所有的内容,编辑如下:
<?php
$wechatObj = new WeChat($options);
if (isset($_GET["echostr"])) {
$wechatObj->valid();
}
现在,你可以提交刚才配置的接口信息了。可能由于网络的原因,你需要多试几次才能成功。如果提示配置失败,你可以在浏览器中打开 127.0.0.1:4040
查看网络请求和响应:
配置成功之后,你的响应请求应该和传来的 echostr
相同。
配置成功,你的测试号管理页面也会有变化:
至此,我们的微信公众平台就接入成功了。用户发来的所有消息都将通过微信服务器转发给我们。
拿起你的手机,关注你的测试号。
上图是我关注了我的测试号之后,随便发送一条消息。你也可以这样做。现在你再打开 127.0.0.1:404
ngrok 控制面板查看,多了一条post请求,并且post的数据包含了我刚才发的消息:
事实证明,我们用户发送的数据确实从微信服务器转发给了我们自己的服务器,这正是我们想要的。
本次实验主要讲的是理论性的知识,首先向大家介绍了微信公众平台的背景,然后给大家介绍了如何快速搭建一个自己的微信公众号,最后介绍微信公众号开发的基本情况,如何将本地服务器变为在线服务器并完成微信公众平台的接入,最终达到了我们想要的效果,顺利的接收到了来自微信服务器的转发内容,为后续实验做好了接口开发的准备,下个实验,我们将着重接口功能的开发。
最后要说明的一点,多看微信公众平台的 开发者文档 。我们所使用的一切功能,都需要参考文档说明。大家下来有时间的话,多去看看文档,能让你对微信公众平台更快更多的了解。