xibeicity/message

A unified message notification system for ThinkPHP

This package's canonical repository appears to be gone and the package has been frozen as a result.

v1.0.1 2025-03-10 03:53 UTC

This package is auto-updated.

Last update: 2025-04-10 07:18:07 UTC


README

一个统一的消息通知系统,支持ThinkPHP框架,可以方便地发送短信、钉钉、微信等多种消息。

环境要求

  • PHP >= 7.2
  • ThinkPHP >= 6.0

安装

通过Composer安装:

composer require xibeicity/message

配置

  1. 复制配置文件到项目的config目录:
cp vendor/xibeicity/message/config/message.php config/message.php
  1. 在.env文件中配置相关参数:
# 默认消息驱动
MESSAGE_DRIVER=sms

# 阿里云短信配置
ALIYUN_ACCESS_KEY_ID=your-access-key-id
ALIYUN_ACCESS_KEY_SECRET=your-access-key-secret
ALIYUN_SMS_SIGN_NAME=your-sign-name
ALIYUN_SMS_TEMPLATE_CODE=your-template-code
ALIYUN_REGION_ID=cn-hangzhou

# 钉钉配置
DINGTALK_APP_KEY=your-app-key
DINGTALK_APP_SECRET=your-app-secret
DINGTALK_AGENT_ID=your-agent-id

# 钉钉群机器人配置
DINGTALK_ROBOT_WEBHOOK=your-webhook-url
DINGTALK_ROBOT_SECRET=your-secret

# 微信公众号配置
WECHAT_OFFICIAL_ACCOUNT_APP_ID=your-app-id
WECHAT_OFFICIAL_ACCOUNT_APP_SECRET=your-app-secret
WECHAT_OFFICIAL_ACCOUNT_TOKEN=your-token
WECHAT_OFFICIAL_ACCOUNT_AES_KEY=your-aes-key

# 微信小程序配置
WECHAT_MINI_PROGRAM_APP_ID=your-app-id
WECHAT_MINI_PROGRAM_APP_SECRET=your-app-secret

# 企业微信群机器人配置
WECHAT_ROBOT_WEBHOOK=your-webhook-url
  1. 执行数据库迁移(用于消息记录功能):
php think migrate:run

基础使用

阿里云短信

use Xibeicity\Message\MessageManager;

$message = new MessageManager();

// 发送普通短信
$message->driver('sms')->send(['13800138000'], '您的验证码是:123456');

// 使用模板发送短信
$message->driver('sms')->sendTemplate(['13800138000'], 'SMS_123456789', [
    'code' => '123456'
], [
    'sign_name' => '您的签名'
]);

// 批量发送短信
$message->driver('sms')->batchSend([
    ['phone' => '13800138000', 'content' => '验证码:123456'],
    ['phone' => '13800138001', 'content' => '验证码:654321']
]);

// 获取发送状态
$result = $message->driver('sms')->getStatus();
if (!$result['success']) {
    echo $message->driver('sms')->getError();
}

钉钉工作通知

use Xibeicity\Message\MessageManager;

$message = new MessageManager();

// 发送普通消息
$message->driver('dingtalk')->send(['user123'], '这是一条测试消息');

// 发送带链接的消息
$message->driver('dingtalk')->send(['user123'], '请查看详情', [
    'link' => 'https://example.com',
    'title' => '通知标题'
]);

// 批量发送消息
$message->driver('dingtalk')->batchSend([
    ['user_id' => 'user123', 'content' => '消息1'],
    ['user_id' => 'user456', 'content' => '消息2']
]);

钉钉群机器人

use Xibeicity\Message\MessageManager;

$message = new MessageManager();

// 发送文本消息
$message->driver('dingtalk_robot')->send(['@all'], '这是一条测试消息', [
    'at' => ['13800138000'],
    'at_all' => false
]);

// 发送markdown消息
$message->driver('dingtalk_robot')->send(['@all'], '# 标题\n内容', [
    'msg_type' => 'markdown'
]);

// 发送带链接的消息
$message->driver('dingtalk_robot')->send(['@all'], '请查看详情', [
    'msg_type' => 'link',
    'title' => '通知标题',
    'link' => 'https://example.com'
]);

微信公众号

use Xibeicity\Message\MessageManager;

$message = new MessageManager();

// 发送普通模板消息
$message->driver('wechat_official_account')->send(['OPENID'], '您有一条新通知');

// 发送完整模板消息
$message->driver('wechat_official_account')->sendTemplate(['OPENID'], 'template-id', [
    'first' => '您有一条新通知',
    'keyword1' => '通知内容',
    'keyword2' => '2024-01-01 12:00:00',
    'remark' => '请及时查看'
], [
    'url' => 'https://example.com'
]);

// 批量发送模板消息
$message->driver('wechat_official_account')->batchSend([
    ['openid' => 'OPENID1', 'content' => '通知1'],
    ['openid' => 'OPENID2', 'content' => '通知2']
]);

微信小程序

use Xibeicity\Message\MessageManager;

$message = new MessageManager();

// 发送订阅消息
$message->driver('wechat_mini_program')->send(['OPENID'], '商品已发货', [
    'template_id' => 'template-id',
    'page' => 'pages/index/index',
    'data' => [
        'thing1' => ['value' => '商品名称'],
        'amount2' => ['value' => '89.90'],
        'date3' => ['value' => '2024-01-01 12:00:00']
    ]
]);

// 使用预设模板发送订阅消息
$message->driver('wechat_mini_program')->sendTemplate(['OPENID'], 'template-id', [
    'thing1' => '商品名称',
    'amount2' => '89.90',
    'date3' => '2024-01-01 12:00:00'
], [
    'page' => 'pages/index/index'
]);

企业微信群机器人

use Xibeicity\Message\MessageManager;

$message = new MessageManager();

// 发送文本消息
$message->driver('wechat_robot')->send(['@all'], '这是一条测试消息', [
    'mentioned_list' => ['wangwu', 'lisi'],
    'mentioned_mobile_list' => ['13800138000']
]);

// 发送markdown消息
$message->driver('wechat_robot')->send(['@all'], '# 标题\n内容', [
    'msg_type' => 'markdown'
]);

// 发送图片消息
$message->driver('wechat_robot')->send(['@all'], '', [
    'msg_type' => 'image',
    'base64' => 'base64编码的图片内容',
    'md5' => '图片内容的md5值'
]);

错误处理

所有驱动都支持错误处理:

use Xibeicity\Message\MessageManager;

$message = new MessageManager();

$result = $message->driver('sms')->send(['13800138000'], '验证码:123456');
if (!$result['success']) {
    // 获取错误信息
    $error = $message->driver('sms')->getError();
    // 处理错误
    echo "发送失败:{$error}";
}

高级特性

自定义消息驱动

  1. 创建自定义驱动类,实现MessageInterface接口:
use Xibeicity\Message\Contracts\MessageInterface;

class CustomDriver implements MessageInterface
{
    public function send(array $to, string $content, array $options = []): array
    {
        // 实现发送逻辑
        return [
            'success' => true,
            'message_id' => 'xxx'
        ];
    }

    public function sendTemplate(array $to, string $templateCode, array $templateParams = [], array $options = []): array
    {
        // 实现模板消息发送逻辑
        return [
            'success' => true,
            'message_id' => 'xxx'
        ];
    }

    public function batchSend(array $messages): array
    {
        // 实现批量发送逻辑
        return [
            'success' => true,
            'message_id' => 'xxx'
        ];
    }

    public function getStatus(): array
    {
        // 返回发送状态
        return [
            'success' => true,
            'message_id' => 'xxx'
        ];
    }

    public function getError(): ?string
    {
        // 返回错误信息
        return null;
    }
}
  1. 注册自定义驱动:
use Xibeicity\Message\MessageManager;

$message = new MessageManager();
$message->extend('custom', function () {
    return new CustomDriver();
});

// 使用自定义驱动发送消息
$message->driver('custom')->send(['user123'], '这是一条测试消息');