- 按 docs/renew-code-comment.md 将 PHP 文件头改为带边框的 Author 注释\n- 注释中的 crmeb.com 替换为 uj345.cn(代码字符串中的外链未改)\n- 新增 docs/renew-code-comment.md 说明 Made-with: Cursor
218 lines
6.5 KiB
PHP
218 lines
6.5 KiB
PHP
<?php
|
||
// +----------------------------------------------------------------------
|
||
// | Author: ScottPan Team
|
||
// +----------------------------------------------------------------------
|
||
|
||
namespace crmeb\services\wechat\client\work;
|
||
|
||
|
||
use crmeb\services\wechat\client\BaseClient;
|
||
use crmeb\services\wechat\WechatException;
|
||
use EasyWeChat\Kernel\HttpClient\Response;
|
||
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
|
||
use Symfony\Contracts\HttpClient\ResponseInterface;
|
||
|
||
/**
|
||
* 消息发送
|
||
* Class MessageClient
|
||
* @author 等风来
|
||
* @email 136327134@qq.com
|
||
* @date 2023/10/8
|
||
* @package crmeb\services\wechat\client\work
|
||
*/
|
||
class MessageClient extends BaseClient
|
||
{
|
||
|
||
/**
|
||
* Required attributes.
|
||
*
|
||
* @var array
|
||
*/
|
||
protected array $required = ['content', 'title', 'url', 'pic_media_id', 'appid', 'page'];
|
||
|
||
/**
|
||
* @var array|string[]
|
||
*/
|
||
protected array $textMessage = [
|
||
'content' => '',
|
||
];
|
||
|
||
/**
|
||
* @var array
|
||
*/
|
||
protected array $imageMessage = [
|
||
|
||
];
|
||
|
||
/**
|
||
* @var array|string[]
|
||
*/
|
||
protected array $linkMessage = [
|
||
'title' => '',
|
||
'picurl' => '',
|
||
'desc' => '',
|
||
'url' => '',
|
||
];
|
||
|
||
/**
|
||
* @var array|string[]
|
||
*/
|
||
protected array $miniprogramMessage = [
|
||
'title' => '',
|
||
'pic_media_id' => '',
|
||
'appid' => '',
|
||
'page' => '',
|
||
];
|
||
|
||
/**
|
||
* @param array $message
|
||
* @return Response|ResponseInterface
|
||
* @throws TransportExceptionInterface
|
||
* @author 等风来
|
||
* @email 136327134@qq.com
|
||
* @date 2023/9/15
|
||
*/
|
||
public function send(array $message): ResponseInterface|Response
|
||
{
|
||
return $this->api->postJson('cgi-bin/message/send', $message);
|
||
}
|
||
|
||
/**
|
||
* 添加企业群发消息模板
|
||
* @param array $msg
|
||
* @return Response|ResponseInterface
|
||
* @throws TransportExceptionInterface
|
||
* @author 等风来
|
||
* @email 136327134@qq.com
|
||
* @date 2023/9/15
|
||
*/
|
||
public function submit(array $msg): ResponseInterface|Response
|
||
{
|
||
$params = $this->formatMessage($msg);
|
||
|
||
return $this->api->postJson('cgi-bin/externalcontact/add_msg_template', $params);
|
||
}
|
||
|
||
/**
|
||
* @param array $data
|
||
* @return array
|
||
* @author 等风来
|
||
* @email 136327134@qq.com
|
||
* @date 2023/9/26
|
||
*/
|
||
protected function formatMessage(array $data = [])
|
||
{
|
||
$params = $data;
|
||
|
||
if (!empty($params['text'])) {
|
||
$params['text'] = $this->formatFields($params['text'], $this->textMessage);
|
||
}
|
||
|
||
if (!empty($params['image'])) {
|
||
$params['image'] = $this->formatFields($params['image'], $this->imageMessage);
|
||
}
|
||
|
||
if (!empty($params['link'])) {
|
||
$params['link'] = $this->formatFields($params['link'], $this->linkMessage);
|
||
}
|
||
|
||
if (!empty($params['miniprogram'])) {
|
||
$params['miniprogram'] = $this->formatFields($params['miniprogram'], $this->miniprogramMessage);
|
||
}
|
||
|
||
return $params;
|
||
}
|
||
|
||
/**
|
||
* @param array $data
|
||
* @param array $default
|
||
* @return array
|
||
* @author 等风来
|
||
* @email 136327134@qq.com
|
||
* @date 2023/9/26
|
||
*/
|
||
protected function formatFields(array $data = [], array $default = [])
|
||
{
|
||
$params = array_merge($default, $data);
|
||
foreach ($params as $key => $value) {
|
||
if (in_array($key, $this->required, true) && empty($value) && empty($default[$key])) {
|
||
throw new WechatException(sprintf('Attribute "%s" can not be empty!', $key));
|
||
}
|
||
|
||
$params[$key] = empty($value) ? $default[$key] : $value;
|
||
}
|
||
|
||
return $params;
|
||
}
|
||
|
||
/**
|
||
* @param string $welcomeCode
|
||
* @param array $msg
|
||
* @return ResponseInterface|Response
|
||
* @throws TransportExceptionInterface
|
||
* @author 等风来
|
||
* @email 136327134@qq.com
|
||
* @date 2023/9/26
|
||
*/
|
||
public function sendWelcome(string $welcomeCode, array $msg): ResponseInterface|Response
|
||
{
|
||
$formattedMsg = $this->formatMessage($msg);
|
||
|
||
$params = array_merge($formattedMsg, [
|
||
'welcome_code' => $welcomeCode,
|
||
]);
|
||
|
||
return $this->api->postJson('cgi-bin/externalcontact/send_welcome_msg', $params);
|
||
}
|
||
|
||
/**
|
||
* 获取群发成员发送任务列表
|
||
* @param string $msgId 群发消息的id,通过获取群发记录列表接口返回
|
||
* @param int|null $limit 返回的最大记录数,整型,最大值1000,默认值500,超过最大值时取默认值
|
||
* @param string|null $cursor 用于分页查询的游标,字符串类型,由上一次调用返回,首次调用可不填
|
||
* @return Response|ResponseInterface
|
||
* @throws TransportExceptionInterface
|
||
* @author 等风来
|
||
* @email 136327134@qq.com
|
||
* @date 2023/9/15
|
||
*/
|
||
public function getGroupmsgTask(string $msgId, ?int $limit = null, ?string $cursor = null): ResponseInterface|Response
|
||
{
|
||
$data = [
|
||
'msgid' => $msgId,
|
||
'limit' => $limit,
|
||
'cursor' => $cursor,
|
||
];
|
||
$writableData = array_filter($data, function (string $key) use ($data) {
|
||
return !is_null($data[$key]);
|
||
}, ARRAY_FILTER_USE_KEY);
|
||
return $this->api->postJson('cgi-bin/externalcontact/get_groupmsg_task', $writableData);
|
||
}
|
||
|
||
/**
|
||
* 获取企业群发成员执行结果
|
||
* @param string $msgId 群发消息的id,通过获取群发记录列表接口返回
|
||
* @param string $userid 发送成员userid,通过获取群发成员发送任务列表接口返回
|
||
* @param int|null $limit 返回的最大记录数,整型,最大值1000,默认值500,超过最大值时取默认值
|
||
* @param string|null $cursor 用于分页查询的游标,字符串类型,由上一次调用返回,首次调用可不填
|
||
* @return Response|ResponseInterface
|
||
* @throws TransportExceptionInterface
|
||
* @author 等风来
|
||
* @email 136327134@qq.com
|
||
* @date 2023/9/15
|
||
*/
|
||
public function getGroupmsgSendResult(string $msgId, string $userid, ?int $limit = null, ?string $cursor = null): ResponseInterface|Response
|
||
{
|
||
$data = [
|
||
'msgid' => $msgId,
|
||
'userid' => $userid,
|
||
'limit' => $limit,
|
||
'cursor' => $cursor,
|
||
];
|
||
$writableData = array_filter($data, function (string $key) use ($data) {
|
||
return !is_null($data[$key]);
|
||
}, ARRAY_FILTER_USE_KEY);
|
||
return $this->api->postJson('cgi-bin/externalcontact/get_groupmsg_send_result', $writableData);
|
||
}
|
||
}
|