跨媒体发布多图文消息程序开发

第九章 微信公众平台跨媒体开发

WeChat develop

第一节 微信公众平台开发准备

一、注册公众号及公众号信息发布

微信是当前国人之间最常用的社交工具。现在每天人们看手机绝大多数时间都在看微信。微信上不仅有朋友圈,上面每天都有丰富的文章供我们阅读。这些微信文章多数来自微信公众号,而微信公众号上的文章又是来自每一个自媒体。

现在每个人都能申请公众号,自己写的文章可以像很多名人作者一样向公众发布。越来越多的人希望也能有个自己的微信公众号。其实,你只要花几分钟就可以完成微信公众号的注册。

访问https://mp.weixin.qq.com/,选择立即注册,出现如图9-1所示的界面。

图示

图9-1 微信公众号注册

这里出现了四种选择:订阅号、服务号、小程序和企业微信。服务号和企业微信只有公司才能注册;小程序是微信推出不久的功能,用它可以替代App,但它比App最大的优势是不需要安装,用起来非常方便;订阅号则个人和学生都可以注册。本书主要针对订阅号来进行讲解。

用你的邮箱就可以申请订阅号,一个邮箱只能申请一个账号(但一个人可以申请多个订阅号)。按图9-2的提示操作。输入邮箱,点击激活邮箱,腾讯向你的邮箱发送验证邮件,邮件中有邮箱的验证码。填好,再填自己定义的密码,同意并遵守协议即可。

有了微信公众号,就可以在上面发文章了。微信订阅号每天可以发一篇文章,也可以一次发一组文章。

微信公众号中发布的文章有两种类型,一种是以一篇文章为一组的文章,称为单图文消息(图9-3);另一种是以多篇文章为一组的文章,称为多图文消息(图9-4)。

图示

图9-2 微信公众号注册

图示

图9-3 单图文消息

图示

图9-4 多图文消息

发公众号文章时,最简单的方法就是利用公众号左侧的菜单“功能-页面模板”和“素材管理”两个工具来发微信文章。现在也有很多很好用的第三方软件可以帮助你发微信文章。

如果你的文章都是原创,当你发几篇文章以后,微信官方有可能给你发出邀请,你可以在你的微信公众号下方增加原创保护功能,别人可以在下方进行评论,还可以给你打赏。

二、搭建服务器

上述的微信公众号的发布方法还不属于公众号开发,要从事微信公众号的开发,必须有一台自己的服务器。这台服务器应该一天24小时,一年365天都能正常运转。初学者可以花几百元在网上租用一台服务器。

1.服务器配置

在服务器上安装MAMP,并将MAMP的端口号设置为80。如果你的服务器上安装了IIS占用了80端口,一定要想办法让IIS用别的端口,因为微信公众号只认80端口。

2.注册域名

为了在互联网上区分,每台服务器都有一个名字,上面在购买服务器的时候,给了你一个名字:59.110.15.49,如图9-5所示。

图示

图9-5 服务器配置

这组号称为IP地址,在互联网上就是通过它来区分服务器的。

但对于人来讲,这组号太难记了。一个正式的网站,应该有一个域名。我们可以在网上查“域名注册”注册一个域名。在国内注册域名要求必须做实名认证。实名认证后的域名,就可以解析到你的服务器上了。图9-6中主机记录@用来解析不输入www的域名,如:cross-media.cn、www用来解析 常见的www域名,如www.cross-media.cn。

图示

图9-6 域名解析

在服务器上做一个最简单的index.html。如果在互联网上访问能看到,就说明域名解析成功了。

3.FTP设置

有了服务器,要想把自己的东西传到服务器上,就需要设置FTP账号。可以用IIS来设置,也可以安装一个软件来设置(如serv-U)。

三、微信公众号开发者配置

1.基本配置

进入公众号,点击“开发”“基本配置”,勾选“我同意”,点击“成为开发者”,出现如图9-7所示的界面,可以看到这个公众号的开发者AppID(这个ID对将来的开发非常重要)。

图示

图9-7 微信公众号基本配置获得AppID

图示

图9-8 获得AppSecret密码

点击开发者密码后面的“启用”。经过“扫码”身份确认和输入“密码”验证,就可以得到开发者密码,如图9-8所示。收藏好AppID和AppSecret密码,勾选“我已了解……”确定进行下一步设置IP白名单。就是要将你要用的网站的IP地址进行登记,以授权给微信。

2.服务器配置及验证

下面修改“服务器配置”。点击“修改配置”弹出“基本配置”窗口,如图9-9所示。此处要求填写自己服务器上对应的文件夹和文件名。

图示

图9-9 微信公众号基本配置

图示

到自己的服务器上建一个wx的文件夹,比如某个学生在服务器上的文件位置为http://www.cross-media.cn/s201803xx1/151010999/wx/,则在图9-9的URL中填写这个路径。Token填写cross,也可以填写其他字符串,但一定要与上面程序中的$token定义的一致。点击EncodingAESKey右侧的随机生成,生成消息加密密钥,记录下来,以便将来编程使用。消息加密方式选“明文模式”就可以了。

将以下程序存为index.php,将此文件上传到刚才建的wx文件夹下。

图示

程序上传完,内容都填好后,如果在这时点击“提交”,在浏览器上方会出现黄色的“token验证失败”字样。到“设置”“公众号设置”里的“JS接口安全域名”,点击右侧的“设置”。先将第3条中的MP_verify_*****.txt文件下载。将下载的txt文件上传到你的微信文件夹下。

在“域名1”处填写www.cross-media.cn/s201803xx1/151010999/wx,如图9-10所示,点“保存”。再到如图9-9所示的基本配置处点提交,如果显示成功,说明微信已经与微信服务器联上了。最后点击启动设置就完成了。

图示

图9-10 微信公众号JS接口安全域名设置

四、ThinkPHP框架

图示

在介绍网页设计时,框架是一种专业开发网站的重要方法。PHP编程也有框架这种专业开发手段,ThinkPHP就是国内最常用的一种。我们的范例是用ThinkPHP3.1版做的。你可以到http://www.thinkphp.cn/down/framework.html网站下载,也可以在我们的网站下载。

它的使用方法如下:

(1)建一个App目录,这是你自己的工程目录,自己起名。由于我们要编微信的程序,我们就把wx这个目录作为我们的工程目录。

(2)把ThinkPHP文件夹拷贝到wx目录下。

(3)在wx目录下建一个index.php文件,内容如下:

图示

(4)打开MAMP运行

http://localhost/wx/index.php

显示:

:)

欢迎使用 ThinkPHP!

这时你还会在wx发现一个新建的目录:weixin。这个目录下生成很多新的目录,如Common、conf、Lang、Lib、Runtime、Tpl。

打开D:\MAMP\htdocs\wx\weixin\Lib\Action\IndexAction.class.php。

图示

把里面的内容全部替换成:

图示

打开MAMP再次运行。

http://localhost/wx/index.php

结果显示:hello weixin。

虽然对ThinkPHP的整个原理我们还不太清楚,但我们隐隐约约地感觉,我们的编程应主要针对这个IndexAction.class.php文件进行。运行程序的时候却不运行IndexAction.class.php,而是去运行index.php。

对于ThinkPHP框架,网上有专门的视频教程,受篇幅所限,只能达到让大家能用的程度。不过现在的学习方法可能与过去不太相同,其实ThinkPHP框架你只要能知道这两页的内容就能用它进行微信公众号的开发了。至于如何能用框架编出高水平的程序,那是专业程序员的事,我们只是跨界的初学者,等我们能用它开发出一些微信公众号程序获得成就感以后,再提高自己的编程水平也是一种学习方法。

下面我们把微信的验证也用框架来做一次。

图示

图示

从上面的程序看,微信验证的主要程序与原来的index.php一模一样。虽然我们还是不知道那一行行语句是怎么验证的,但验证能通过就说明这段程序没有问题。

需要注意的是,微信公众平台基本配置的URL位置链接应该改为:

http://www.cross-media.cn/s201803xx1/151010999/wx/index.php/index

修改后,提交时显示绿色的“验证通过”就说明这个程序改成了。

第二节 模拟微信授权登录

一、用户关注微信后回复消息给用户

图示(https://www.daowen.com)

第一次用一个订阅号,需要用户做的就是找到这个订阅号,并加关注。下面的程序实现的是,用户关注公众号后,回复用户的功能。

在IndexAction.class.php微信验证程序中,加一句else语句:

图示

$this->reponseMsg();执行微信接收消息,并进行响应的程序。下面是定义reponseMsg()函数的程序。

图示

程序上传到服务器以后,进入你的微信,找到你的微信公众号,先要取消关注,然后再关注。这时候你会发现,在你的微信上显示的欢迎信息就是你在这程序中写在$content里定义的信息。在上面的程序中,又看到了我们熟悉的XML,微信也是通过XML把你要发给用户的微信内容打包在这个XML中,发送给微信服务器去发微信的。

二、模拟微信授权登录

我们在很多场合都用过微信的授权登录,只要微信授权后,登录网站的时候就不用输入用户名、密码。虽然这只是件很小的事,但给用户带来的体验是非常好的。

非常遗憾的是,我们个人能申请的订阅号是没有授权登录的权限的,甚至也没法用程序来自定义菜单。因为这些功能必须得在你的微信公众号通过认证的前提下才能进行。但腾讯规定订阅号是不能进行认证的,只有服务号和企业号才能通过认证。而个人又只能申请订阅号,这给我们初学者体验微信登录自己的网站带来了麻烦。

微信公众平台菜单“</>开发-开发者工具”中,有一个公众平台测试号,如果你要体验测试微信公众平台所有的高级接口,可以用这个测试号来体验。

我们还是在订阅号上想办法。在关注公众号的欢迎信息里加一个注册、登录的链接,结果如图9-11所示。

图示

图示

图9-11 关注界面

图示

图9-12 注册界面

在IndexAction.class.php中我们发现,那个$toUser的变量就是关注微信公众号的这个用户的编号,微信把它称为OpenID。每一个微信用户就有一个OpenID。把这个OpenID传值给下一个登录程序,我们希望利用这个OpenID来实现免登录。

点击“注册登录”,如果你从未注册过,则进入如图9-12所示的界面,填写注册信息,请注意里面没有OpenID,那是因为OpenID不需要人手工填写,直接传值过来的就是OpenID。我们需要在MySQL数据库中建一个微信用户表(weixinlogin),如图9-13所示。

图示

图示

图9-13 微信用户表

下面我们来看一下这个登录程序(loginwx.php)的局部。

图示

从程序中可以看出,如果关注公众号的人的微信OpenID在这个表中($Count>0),就可以不输入用户名、密码,直接跳转到自己的主界面(app.php)。否则,跳转到regist.php让用户进行注册。

这套程序中除了登录程序(loginwx.php)外,还有conn.php数据库的链接程序、regist.php是注册程序、registsave.php是一个注册存盘程序、app.php是一个登录后的范例应用程序,这五个程序都放在wx文件夹下。最重要的IndexAction.class.php还是放在老地方。细心的读者可能会发现,我们采用明传值的GET方法,loginwx.php传了一个OpenID,由此来实现登录很不安全。我们将在下面解决这个问题。

三、微信单文本回复

图示

如果用户给你的微信公众平台发了一条文字微信,通过程序判断,自动给用户回复一条文本消息,这称为单文本回复。程序如下:

图示

上面的程序,如果你给微信公众平台发一条微信,内容是“1”的话,它会自动给你回复“您输入的数字是1”;如果你发的微信内容是“跨媒体”,它会自动给你回复一个带着跨媒体网站链接的“跨媒体”三个字。

从上一个程序可以看出,“关注事件”信息的类型是“event”,而这个程序信息的类型是“text”。

仔细看程序,可以从$postObj=simplexml_load_string($postArr)隐约发现用户发来的消息内容好像也是XML结构。查看微信公众平台上的菜单“</>开发 — 开发者工具 — 开发者文档 — 接收普通消息”中看到,读者发过来的确实是一套XML结构的数据包。

图示

我们通过$postObj->Content可以收到XML中的微信的文本消息内容。用户发过来的XML在程序中并没有显现,只是存储在$postObj中。后面$template中赋值的我们看得到的xml则是我们要回复给用户的XML,在微信公众平台上的菜单“</>开发 — 开发者工具 — 开发者文档 — 被动回复用户消息”中的回复文本消息里也可以查到。

图示

开发者文档中对这个XML的解释很清楚。并且,我们还看到,可以回复的消息不只有文本消息,还可以回复图片消息、语言消息、视频消息、音乐消息、图文消息等。只要读者能通过开发者文档耐心研究,都能够轻松实现。

四、利用单文本回复改善登录的安全性程序

前面提到,采用明传值的方法用于用户登录是很不安全的。如何才能把用户的OpenID传给自己的网站,而又让人看不到呢?form post的方法在微信上不可行,而微信推荐用的方法订阅号又没有权限。我们想了个办法,在收到用户发的一条短信后,随机生成一个字符串,把这个字符串和OpenID同时存在数据库的一个临时表里。把随机生成的这个字符串用明传值的方法传给下一程序。下一程序登录程序(loginwx.php)接收到这个字符串后,再到数据库中查OpenID。得到OpenID后,删掉这条记录。这个黑客能知道明传值的内容,也无法通过loginwx.php登录我们的网站。

图示

事先在数据库中建一个临时表(weixintemp),表中只设计三个数据项:randid、openid、logindate。接下来就是IndexAction.class.php中接收单文本消息后,产生一个随机字符串;插入发送单文本的人的OpenID、随机字符串,并在传值时把随机字符串传给登录程序(loginwx.php)的程序。产生随机数的方法是,用当时时间通过md5加密,得到一串随机字符串。

图示

图示

下面是登录程序(loginwx.php)的核心部分:

图示

程序最开始的:

图示

判断$_SESSION['crossid']是否存在,如果存在,说明这个用户刚才就登录过,可以让用户直接访问用户的主页。

如果session不存在,则接收上页传值过来的randid,通过randid到weixintemp表中查这个用户的OpenID。如果weixintemp表中有这个randid,则为session赋值,同时要删掉这条randid的记录。然后再到weixinlogin表中查到用户的真名、用户名等信息,跳转到用户主页。

第三节 微信公众平台图文消息跨媒体发布程序的开发

一、PHP回复单图文消息

图示

下面的程序就是用PHP来实现用户发给微信公众号一条单文本消息后,程序给用户回馈的一条单图文消息。

图示

用户发来一条消息,类型还是“text”,判断如果用户发来的微信是“4”,则获取发微信人的OpenID,赋值给$toUser。

$toUser=$postObj->FromUserName;

这句话看上去有点怪,右边应该好理解,是发来消息用户的名字,就是OpenID。但左边为什么叫$toUser呢?因为我们后面要给用户回复消息,所以回复时发给的用户当然可以理解为$toUser了。

后面给一个数组$arr赋了几个值,包括:

Title:相当于单图文的标题;

Description:标题下的描述;

PicUrl:单图文的图片路径;

Url:点击这个单图文时,链接到的网页。

后面的有关XML的大段程序看起来很吓人,但我们一个字都不需要动,直接照搬上去,就可以发单图文消息了。

二、PHP回复多图文消息

图示

当用户发来一条文本消息“5”后,回复多图文的消息的程序如下:

图示

图示

对比回复单图文消息和回复多图文消息的程序我们发现,这两个程序其实就是一个程序,只不过给那个数组多赋值了几套数据。多图文文章数最多10篇。

三、跨媒体发布多图文消息程序开发

图示

下面我们用微信回复多图文的功能做一个跨媒体信息传播的程序。大体思路是,读者想查书中的某个内容,可以给我们的微信公众号发微信。系统收到微信后,由微信传值给我们的查询程序,在我们的数据库中查到相关的条目信息,由于可能含有这一关键字的条目有多条,所以回复时可能会采用多图文的方式回复给用户。

图示

图示

图示

程序分析:

$keywords=trim($postObj->Content);

获取了用户发过来的消息。

$stmt1 = $conn1->query("select * from articlelib where Keywords like '%".$keywords."%' and Openstate=1 order by PublishDate desc");

到表articlelib中查是否含有这个关键字,并按出版时间倒序排序。

<Title><![CDATA[".$title."]]></Title>

从数据库中取出的title赋给图文文章的标题。

<PicUrl><![CDATA[".$imageurl."]]></PicUrl>

把数据库中存的图片路径Image取出赋给微信的<PicUrl>。

<Url><![CDATA[".$titleurl."]]></Url>

$titleurl="http://www.cross-media.cn/book/article_publish_view.php?id=$titleid";

为每篇文章做一个显示程序,把这个显示程序赋给微信的Url。这样库中的内容通过用户发微信就可以自动回复给用户多图文的结果了。

现在在微信上可做的事越来越多,各种各样的信息都通过微信跨媒体传播给读者。