| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- <?php
- /*
- * This file is part of the overtrue/wechat.
- *
- * (c) overtrue <i@overtrue.me>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
- /**
- * MessageBuilder.php.
- *
- * @author overtrue <i@overtrue.me>
- * @copyright 2015 overtrue <i@overtrue.me>
- *
- * @see https://github.com/overtrue
- * @see http://overtrue.me
- */
- namespace EasyWeChat\Broadcast;
- use EasyWeChat\Core\Exceptions\InvalidArgumentException;
- use EasyWeChat\Core\Exceptions\RuntimeException;
- /**
- * Class MessageBuilder.
- */
- class MessageBuilder
- {
- /**
- * Message target user or group.
- *
- * @var mixed
- */
- protected $to;
- /**
- * Message type.
- *
- * @var string
- */
- protected $msgType;
- /**
- * Message.
- *
- * @var mixed
- */
- protected $message;
- /**
- * Message types.
- *
- * @var array
- */
- private $msgTypes = [
- Broadcast::MSG_TYPE_TEXT,
- Broadcast::MSG_TYPE_NEWS,
- Broadcast::MSG_TYPE_IMAGE,
- Broadcast::MSG_TYPE_VIDEO,
- Broadcast::MSG_TYPE_VOICE,
- Broadcast::MSG_TYPE_CARD,
- ];
- /**
- * Preview bys.
- *
- * @var array
- */
- private $previewBys = [
- Broadcast::PREVIEW_BY_OPENID,
- Broadcast::PREVIEW_BY_NAME,
- ];
- /**
- * Set message type.
- *
- * @param string $msgType
- *
- * @return MessageBuilder
- *
- * @throws InvalidArgumentException
- */
- public function msgType($msgType)
- {
- if (!in_array($msgType, $this->msgTypes, true)) {
- throw new InvalidArgumentException('This message type not exist.');
- }
- $this->msgType = $msgType;
- return $this;
- }
- /**
- * Set message.
- *
- * @param string|array $message
- *
- * @return MessageBuilder
- */
- public function message($message)
- {
- $this->message = $message;
- return $this;
- }
- /**
- * Set target user or group.
- *
- * @param mixed $to
- *
- * @return MessageBuilder
- */
- public function to($to)
- {
- $this->to = $to;
- return $this;
- }
- /**
- * Build message.
- *
- * @return bool
- *
- * @throws RuntimeException
- */
- public function build()
- {
- if (empty($this->msgType)) {
- throw new RuntimeException('message type not exist.');
- }
- if (empty($this->message)) {
- throw new RuntimeException('No message content to send.');
- }
- // 群发视频消息给用户列表时,视频消息格式需要另外处理,具体见文档
- if (Broadcast::MSG_TYPE_VIDEO === $this->msgType) {
- if (is_array($this->message)) {
- $this->message = array_shift($this->message);
- }
- $this->msgType = 'mpvideo';
- }
- $content = (new Transformer($this->msgType, $this->message))->transform();
- $group = isset($this->to) ? $this->to : null;
- $message = array_merge($this->buildGroup($group), $content);
- return $message;
- }
- /**
- * Build preview message.
- *
- * @param string $by
- *
- * @return array
- *
- * @throws RuntimeException
- * @throws InvalidArgumentException
- */
- public function buildPreview($by)
- {
- if (!in_array($by, $this->previewBys, true)) {
- throw new InvalidArgumentException('This preview by not exist.');
- }
- if (empty($this->msgType)) {
- throw new RuntimeException('Message type not exist.');
- } elseif (Broadcast::MSG_TYPE_VIDEO === $this->msgType) {
- if (is_array($this->message)) {
- $this->message = array_shift($this->message);
- }
- $this->msgType = 'mpvideo';
- }
- if (empty($this->message)) {
- throw new RuntimeException('No message content to send.');
- }
- if (empty($this->to)) {
- throw new RuntimeException('No to.');
- }
- $content = (new Transformer($this->msgType, $this->message))->transform();
- $message = array_merge($this->buildTo($this->to, $by), $content);
- return $message;
- }
- /**
- * Build group.
- *
- * @param mixed $group
- *
- * @return array
- */
- private function buildGroup($group)
- {
- if (is_null($group)) {
- $group = [
- 'filter' => [
- 'is_to_all' => true,
- ],
- ];
- } elseif (is_array($group)) {
- $group = [
- 'touser' => $group,
- ];
- } else {
- $group = [
- 'filter' => [
- 'is_to_all' => false,
- 'group_id' => $group,
- ],
- ];
- }
- return $group;
- }
- /**
- * Build to.
- *
- * @param string $to
- * @param string $by
- *
- * @return array
- */
- private function buildTo($to, $by)
- {
- return [
- $by => $to,
- ];
- }
- /**
- * Return property.
- *
- * @param string $property
- *
- * @return mixed
- */
- public function __get($property)
- {
- if (property_exists($this, $property)) {
- return $this->$property;
- }
- }
- }
|