一、为什么需要功能扩展?
企业级网站常需定制化功能,siteserver CMS通过插件机制与开放API,既能快速集成支付/短信等第三方服务,又能开发专属业务模块(如会员积分体系)。实测合理扩展可使开发效率提升50%以上。
二、插件开发前的环境配置
开发工具必备清单
- PHPStorm或VSCode(需安装PHP Intelephense插件)
- Composer(管理依赖包)
- Xdebug(用于断点调试)
目录结构认知
插件必须存放在/Plugins
目录,核心文件命名规则:plugin.json
(声明插件名称/版本/依赖)Plugin.php
(主逻辑入口)install.sql
(数据库初始化脚本)
规避冲突的3条铁律
- 插件类名采用
厂商名_插件名
格式(例:Alibaba_PayPlugin
) - CSS/JS文件添加插件前缀(如
.payplugin-btn
) - 禁止直接修改CMS核心文件
- 插件类名采用
三、7步开发一个基础插件(以短信验证为例)
步骤1:创建插件目录
在/Plugins
下新建文件夹**sAuth
,必须包含plugin.json
:
json**{ "name": "短信验证插件", "version": "1.0", "author": "开发者名称", "dependencies": ["Captcha>=2.3"]}
步骤2:编写主逻辑文件
在Plugin.php
中继承BasePlugin类,重写onInit
方法加载配置:
php**class **sAuth_Plugin extends BasePlugin { public function onInit() { $this->bindEvent('user_registered', 'send**sCode'); }}
步骤3:对接第三方API
使用GuzzleHttp调用服务商接口(以阿里云为例):
php**$client = new \GuzzleHttp\Client();$response = $client->post('https://dy**sapi.aliyuncs.com', [ 'form_params' => [ 'PhoneNumbers' => $mobile, 'SignName' => '您的签名', 'TemplateCode' => '**S_123456' ]]);
步骤4:创建数据库表
在install.sql
中定义短信记录表:
sql**CREATE TABLE `{prefix}**s_log` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `mobile` VARCHAR(20) NOT NULL, `code` CHAR(6) NOT NULL, `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
步骤5:配置参数加密存储
通过系统提供的Settings API保存密钥:
php**Setting::set('**s_access_key', encrypt('您的AccessKey'));Setting::set('**s_access_secret', encrypt('您的AccessSecret'));
步骤6:调试与日志追踪
开启调试模式后,在runtime/logs/
目录查看错误信息:
php**Log::debug("短信发送失败:".$response->getBody());
步骤7:打包与分发
使用php build.php package
生成.spk
安装包,必须包含LICENSE文件。
四、API对接的3种实战场景
场景1:调用CMS内置API
获取最新文章的RESTful接口示例:
bash**curl -X GET "https://域名/api/contents?channelId=1⊤=10" \-H "Authorization: Bearer {access_token}"
场景2:开发自定义API接口
在插件中注册商品库存查询接口:
php**$this->registerApi('getStock', function ($params) { return Product::where('id', $params['id'])->value('stock');});
场景3:Webhook外部系统通知
接收支付成功的回调处理:
php**$this->bindWebhook('payment/success', function ($request) { Order::where('trade_no', $request->input('sn'))->update(['status' => 'paid']);});
五、高频问题排雷指南
问题:插件安装后提示数据库错误?
答:检查SQL语句兼容性:
- 避免使用
TYPE=InnoDB
等过时语法 - 字段注释需用
COMMENT '说明'
格式 - 索引命名不得包含大写字母
问题:API返回403权限错误?
答:三步排查法:
- 确认access_token在Header中正确传递
- 在后台“API管理-权限配置”添加IP白名单
- 检查接口路由是否被防火墙拦截
问题:多插件冲突如何定位?
答:按顺序禁用插件并观察日志,优先排查以下行为:
- 修改公共函数文件(如common.php)
- 重写同一系统事件(如onUserLogin)
- 占用相同cookie或session键名
个人观点
为政府项目开发审计插件时,发现过度依赖全局变量是插件崩溃的主因。曾因在插件中使用$_SESSION['user']
导致登录态冲突,后改用$this->getUser()
方法规避。建议:所有数据交互通过CMS提供的API通道,这比直接操作数据库或全局对象更稳定。
标签: 对接 siteserver 插件