消息

我把微信的 API 里的所有“消息”都按类型抽象出来了,也就是说,你不用区分它是回复消息还是主动推送消息,免去了你去手动拼装微信的 XML 以及乱七八糟命名不统一的 JSON 了。

在阅读以下内容时请忽略是 接收消息 还是 回复消息,后面我会给你讲它们的区别。

消息类型

消息分为以下几种:文本图片视频声音链接坐标图文文章 和一种特殊的 原始消息

另外还有一种特殊的消息类型:素材消息,用于群发或者客服时发送已有素材用。

{warning} 注意:回复消息与客服消息里的图文类型为:图文,群发与素材中的图文为文章

所有的消息类都在 EasyWeChat\Kernel\Messages 这个命名空间下, 下面我们来分开讲解:

文本消息

属性列表:

  1. - content 文本内容
  1. use EasyWeChat\Kernel\Messages\Text;
  2. $text = new Text('您好!overtrue。');
  3. // or
  4. $text = new Text();
  5. $text->content = '您好!overtrue。';
  6. // or
  7. $text = new Text();
  8. $text->setAttribute('content', '您好!overtrue。');

图片消息

属性列表:

  1. - media_id 媒体资源 ID
  1. use EasyWeChat\Kernel\Messages\Image;
  2. $image = new Image($mediaId);

视频消息

属性列表:

  1. - title 标题
  2. - description 描述
  3. - media_id 媒体资源 ID
  4. - thumb_media_id 封面资源 ID
  1. use EasyWeChat\Kernel\Messages\Video;
  2. $video = new Video($mediaId, [
  3. 'title' => $title,
  4. 'description' => '...',
  5. ]);

声音消息

属性列表:

  1. - media_id 媒体资源 ID
  1. use EasyWeChat\Kernel\Messages\Voice;
  2. $voice = new Voice($mediaId);

链接消息

{warning} 微信目前不支持回复链接消息

坐标消息

{warning} 微信目前不支持回复坐标消息

图文消息

图文消息分为 NewsItemNewsNewsItem 为图文内容条目。

NewsItem 属性:

  1. - title 标题
  2. - description 描述
  3. - image 图片链接
  4. - url 链接 URL
  1. use EasyWeChat\Kernel\Messages\News;
  2. use EasyWeChat\Kernel\Messages\NewsItem;
  3. $items = [
  4. new NewsItem([
  5. 'title' => $title,
  6. 'description' => '...',
  7. 'url' => $url,
  8. 'image' => $image,
  9. // ...
  10. ]),
  11. new NewsItem([...]),
  12. new NewsItem([...]),
  13. // ...
  14. ];
  15. $news = new News($items);

文章

属性列表:

  1. - title 标题
  2. - author 作者
  3. - content 具体内容
  4. - thumb_media_id 图文消息的封面图片素材id(必须是永久mediaID
  5. - digest 图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空
  6. - source_url 来源 URL
  7. - show_cover 是否显示封面,0 false,即不显示,1 true,即显示
  1. use EasyWeChat\Kernel\Messages\Article;
  2. $article = new Article([
  3. 'title' => 'EasyWeChat',
  4. 'author' => 'overtrue',
  5. 'content' => 'EasyWeChat 是一个开源的微信 SDK,它... ...',
  6. // ...
  7. ]);
  8. // or
  9. $article = new Article();
  10. $article->title = 'EasyWeChat';
  11. $article->author = 'overtrue';
  12. $article->content = '微信 SDK ...';
  13. // ...

素材消息

素材消息用于群发与客服消息时使用。

素材消息不支持被动回复,如需被动回复素材消息,首先组装后,再 News 方法返回。

属性就一个:media_id

在构造时有两个参数:

  • $type 素材类型,目前只支持:mpnewsmpvideovoiceimage 等。
  • $mediaId 素材 ID,从接口查询或者上传后得到。
  1. use EasyWeChat\Kernel\Messages\Media;
  2. $media = new Media($mediaId, 'mpnews');

以上呢,是所有微信支持的基本消息类型。

{warning} 需要注意的是,你不需要关心微信的消息字段叫啥,因为这里我们使用了更标准的命名,然后最终在中间做了转换,所以你不需要关注。

原始消息

原始消息是一种特殊的消息,它的场景是:你不想使用其它消息类型,你想自己手动拼消息。比如,回复消息时,你想自己拼 XML,那么你就直接用它就可以了:

  1. use EasyWeChat\Kernel\Messages\Raw;
  2. $message = new Raw('<xml>
  3. <ToUserName><![CDATA[toUser]]></ToUserName>
  4. <FromUserName><![CDATA[fromUser]]></FromUserName>
  5. <CreateTime>12345678</CreateTime>
  6. <MsgType><![CDATA[image]]></MsgType>
  7. <Image>
  8. <MediaId><![CDATA[media_id]]></MediaId>
  9. </Image>
  10. </xml>');

比如,你要用于客服消息(客服消息是JSON结构):

  1. use EasyWeChat\Kernel\Messages\Raw;
  2. $message = new Raw('{
  3. "touser":"OPENID",
  4. "msgtype":"text",
  5. "text":
  6. {
  7. "content":"Hello World"
  8. }
  9. }');

总之,就是直接写微信接口要求的格式内容就好,此类型消息在 SDK 中不存在转换行为,所以请注意不要写错格式。

在 SDK 中使用消息

在服务端回复消息

服务端 一节中,我们讲了回复消息的写法:

  1. // ... 前面部分省略
  2. $app->server->push(function ($message) {
  3. return "您好!欢迎关注我!";
  4. });
  5. $response = $server->serve();

上面 return 了一句普通的文本内容,这里只是为了方便大家,实际上最后会有一个隐式转换为 Text 类型的动作。

如果你要回复其它类型的消息,就需要返回一个具体的实例了,比如回复一个图片类型的消息:

  1. use EasyWeChat\Kernel\Messages\Image;
  2. // ...
  3. $app->server->push(function ($message) {
  4. return new Image('media-id');
  5. });
  6. // ...

回复多图文消息

多图文消息其实就是单图文消息的一个数组而已了:

  1. use EasyWeChat\Kernel\Messages\News;
  2. use EasyWeChat\Kernel\Messages\NewsItem;
  3. // ...
  4. $app->server->push(function ($message) {
  5. $news1 = new NewsItem(...);
  6. $news2 = new NewsItem(...);
  7. $news3 = new NewsItem(...);
  8. $news4 = new NewsItem(...);
  9. return new News([$news1, $news2, $news3, $news4]);
  10. });
  11. // ...

作为客服消息发送

在客服消息里的使用也一样,都是直接传入消息实例即可:

  1. use EasyWeChat\Kernel\Messages\Text;
  2. $message = new Text('Hello world!');
  3. $result = $app->customer_service->message($message)->to($openId)->send();
  4. //...

发送多图文消息

多图文消息其实就是单图文消息组成的一个 News 对象而已:

  1. $news1 = new NewsItem(...);
  2. $news2 = new NewsItem(...);
  3. $news3 = new NewsItem(...);
  4. $news4 = new NewsItem(...);
  5. $news = new News([$news1, $news2, $news3, $news4]);
  6. $app->customer_service->message($news)->to($openId)->send();

群发消息

请参考:群发消息

消息转发给客服系统

参见:多客服消息转发