* * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace EasyWeChat\OfficialAccount\TemplateMessage; use EasyWeChat\Kernel\BaseClient; use EasyWeChat\Kernel\Exceptions\InvalidArgumentException; use ReflectionClass; /** * Class Client. * * @author overtrue */ class Client extends BaseClient { public const API_SEND = 'cgi-bin/message/template/send'; /** * Attributes. * * @var array */ protected $message = [ 'touser' => '', 'template_id' => '', 'url' => '', 'data' => [], 'miniprogram' => '', ]; /** * Required attributes. * * @var array */ protected $required = ['touser', 'template_id']; /** * Set industry. * * @param int $industryOne * @param int $industryTwo * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function setIndustry($industryOne, $industryTwo) { $params = [ 'industry_id1' => $industryOne, 'industry_id2' => $industryTwo, ]; return $this->httpPostJson('cgi-bin/template/api_set_industry', $params); } /** * Get industry. * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getIndustry() { return $this->httpPostJson('cgi-bin/template/get_industry'); } /** * Add a template and get template ID. * * @param string $shortId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function addTemplate($shortId) { $params = ['template_id_short' => $shortId]; return $this->httpPostJson('cgi-bin/template/api_add_template', $params); } /** * Get private templates. * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function getPrivateTemplates() { return $this->httpPostJson('cgi-bin/template/get_all_private_template'); } /** * Delete private template. * * @param string $templateId * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function deletePrivateTemplate($templateId) { $params = ['template_id' => $templateId]; return $this->httpPostJson('cgi-bin/template/del_private_template', $params); } /** * Send a template message. * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function send(array $data = []) { $params = $this->formatMessage($data); $this->restoreMessage(); return $this->httpPostJson(static::API_SEND, $params); } /** * Send template-message for subscription. * * @return \Psr\Http\Message\ResponseInterface|\EasyWeChat\Kernel\Support\Collection|array|object|string * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException * @throws \GuzzleHttp\Exception\GuzzleException */ public function sendSubscription(array $data = []) { $params = $this->formatMessage($data); $this->restoreMessage(); return $this->httpPostJson('cgi-bin/message/template/subscribe', $params); } /** * @return array * * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException */ protected function formatMessage(array $data = []) { $params = array_merge($this->message, $data); foreach ($params as $key => $value) { if (in_array($key, $this->required, true) && empty($value) && empty($this->message[$key])) { throw new InvalidArgumentException(sprintf('Attribute "%s" can not be empty!', $key)); } $params[$key] = empty($value) ? $this->message[$key] : $value; } $params['data'] = $this->formatData($params['data'] ?? []); return $params; } /** * @return array */ protected function formatData(array $data) { $formatted = []; foreach ($data as $key => $value) { if (is_array($value)) { if (\array_key_exists('value', $value)) { $formatted[$key] = $value; continue; } if (count($value) >= 2) { $value = [ 'value' => $value[0], 'color' => $value[1], ]; } } else { $value = [ 'value' => strval($value), ]; } $formatted[$key] = $value; } return $formatted; } /** * Restore message. */ protected function restoreMessage() { $this->message = (new ReflectionClass(static::class))->getDefaultProperties()['message']; } }