记一次不太愉快的微信公众平台开发之旅

喜你入骨 提交于 2020-02-03 01:41:06

第一步 申请微信公众平台

点击 或复制 https://mp.weixin.qq.com/可直接跳转。

申请过程略。

第二步 申请测试账号

找到开发者工具中的公众平台测试号,这个测试号可以调用所有接口。

公众平台测试账号

接着扫码登录,会进入测试号管理界面,如图:

在这里插入图片描述

在此处我们进行我们的服务器配置,可以先不填,我们先进行开发,然后填上去后进行验证(我验证的时候,一直说配置失败,但是刷新该页面后发现已经配置服务器成功)。

第三步 安装EasyWechat

在开始之前,请确保你足够了解Composer闭包,接下来我们可能会用到很多它的知识。

按照作者提供的信息,我们使用Composer进行安装,在撰写本文时,EasyWechat的版本已经为4.2,但是在EasyWechat文档中给出的安装仍为4.0,因此我建议执行命令行:

composer require "overtrue/wechat:^4.2" -vvv

当然,你最好能先配置一下中国的镜像,否则安装的速度会很慢,另外提一下,我这里并没有使用任何的框架。

我给出的方案是修改当前项目的composer.json,你可以执行命令行:

composer config repo.packagist composer https://packagist.phpcomposer.com

当然也可以主动在composer.json的末尾添加镜像信息:

"repositories": {
    "packagist": {
        "type": "composer",
        "url": "https://packagist.phpcomposer.com"
    }
}

当你完成后,它应该是这样的:

Composer.json

第四步 编写一个简单可以通过微信接口配置的服务器

<?php

use EasyWeChat\Factory;

$options = [
    'app_id'    => 'your_appId',
    'secret'    => 'your_secret',
    'token'     => 'your_token',
    'log' => [
        'level' => 'debug',
        'file'  => '/tmp/easywechat.log',
    ],
    // ...
];

$app = Factory::officialAccount($options);

$server = $app->server;
$user = $app->user;

$server->push(function($message) use ($user) {
    $fromUser = $user->get($message['FromUserName']);

    return "{$fromUser->nickname} 您好!欢迎关注 overtrue!";
});

$server->serve()->send();

对于作者给出的代码,我将一一讲诉。

在开始我们的服务端之前,我们先引入了EasyWechat的Factory帮助我们构造一个Server,即

use EasyWeChat\Factory; 

如果你对此有疑问,那么请回去好好补补命名空间的课吧。

然后我们编写一个服务器的配置信息,即变量options

$options = [
    'app_id'    => 'your_appId',
    'secret'    => 'your_secret',
    'token'     => 'your_token',
    'log' => [
        'level' => 'debug',
        'file'  => '/tmp/easywechat.log',
    ],
    // ...
];

你理应将app_idsecret按照测试号信息填写无误,然后再测试号管理页面键入你自己设定的Token,并将该Token填入options当中。至于log部分,我将不对其关注。

紧接着,我们使用Factory开始构造我们的公众号应用:

$app = Factory::officialAccount($options);

接着我们获取了app当中的serveruser,其中server提供了服务的接口,user提供了对用户操作的接口,即:

$server = $app->server;
$user = $app->user;

然后,我们使用:

$server->push(callable $callback)

来设置消息处理器。

实例代码是:

$server->push(function($message) use ($user) {
    $fromUser = $user->get($message['FromUserName']);
    return "{$fromUser->nickname} 您好!欢迎关注 overtrue!";
});

给大家提个醒,我在我的options中设置了response_typearray,因此这里不可以使用箭头访问,如果没有设置response_type,则可以使用箭头访问。在这里被坑惨了。

接着,我们执行serverserve函数,执行服务端业务,这个函数返回值是一个Symfony\Component\HttpFoundation\Response实例,在一些框架中,你可以直接返回该实例,如果你和我一样没有使用任何框架,那么我们可以直接调用send函数输出。即:

$server->serve()->send();

到这里,我们一个简单的服务端就写好了,配置完成后,去关注你的公众号,你会得到类似这样的信息:

在这里插入图片描述

噢,这里的昵称不要在意,有了女票昵称还能自己定吗?

那么如果我们要复杂一点呢?

比如我们想只在关注的时候发送欢迎关注,在用户发送文字消息的时候发送一些另外的东西呢?

第五步 注册不同的消息处理器

我们可以不断地调用serverpush函数添加消息处理器,请注意这个消息处理器同样是Closure,假如我们需要注册一个消息处理器,它在用户订阅的时候被调用,那么我们的注册就是:

use EasyWeChat\Kernel\Messages\Message;

$app->server->push(function($mes) use ($user){
	switch ($mes['Event']){
		case 'subscribe':
			$fromUser = $user->get($mes['FromUserName']);
            $nickname = $fromUser['nickname'];
            return "$nickname 您好!欢迎关注 overtrue!";
            break;
    }
}, Message::EVENT);

此处我们指定该消息处理器仅处理Message::EVENT(要使用它,我们必须先use EasyWeChat\Kernel\Messages\Message;
),然后在处理器内部我们再仅对事件subscribe进行了处理,这样,我们就注册了一个用户订阅的消息处理器。

这里我必须告诉你,消息(即传入处理权的变量mes)都拥有以下基本属性:

  • ToUserName 接收方账号(即公众号ID)
  • FromUserName 发送方账号(OpenID,代表用户的唯一标识)
  • CreateTime 消息创建时间(时间戳)
  • MsgId 消息ID(64位整型)

对于Message::TEXT,它还有:

  • MsgType text
  • Content 文本消息内容

对于Message::IMAGE,它还有:

  • MsgType image
  • MediaId 图片消息媒体id,可以调用多媒体文件下载接口拉取数据。
  • PicUrl 图片链接

对于Message::VOICE,它还有:

  • MsgType voice
  • MediaId 语音消息媒体id,可以调用多媒体文件下载接口拉取数据。
  • Format 语音格式,如amr,speex等
  • Recognition * 开通语音识别后才有

对于Message::VIDEO,它还有:

  • MsyType video
  • MediaId 视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
  • ThumbMediaId 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。

对于Message::SHORT_VIDEO,它还有:

  • MsgType shortvideo
  • MediaId 视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
  • ThumbMediaId 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。

对于Message::EVENT,它还有:

  • MsgType event
  • Event 事件类型 (如:subscribe(订阅)、unsubscribe(取消订阅)…, CLICK等)

如果你想同时为多种类型进行注册消息处理器,那么只需要使用按位或连接即可,例如:

$app->server->push(MediaMessageHandler::class, Message::VOICE|Message::VIDEO|Message::SHORT_VIDEO);
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!