返回首页

授权守护与加密交付

授权中心通过「插件授权守护 + 交付时加密 + 水印追踪」三道机制保障付费应用的版权与运行可控。本节面向应用开发者,说明如何在自己的插件 / 模板里正确接入授权守护,以及交付后的基础运行表现。

授权中心的签名密钥、水印盐值、加密算法实现是非公开运维细节,开发者无需也无法直接读取。本章仅介绍接入与表现,足以完成对接和排错。

三层防护示意

客户端站点
├── PluginLicense::verify('my_plugin') # ① 授权状态校验
├── 授权守护库 # ② 运行环境完整性保护
└── 加密交付的插件主文件 # ③ 按授权信息交付和追踪

一、PluginLicense::verify() 接入

付费应用(插件 / 模板)必须在主文件最上方调用授权守护,未通过授权时主动 return,避免业务代码继续执行。

插件最小接入示例

<?php
/*
Plugin Name: 我的付费插件
Version: 1.0.0
Description: 示例
Ui: Layui
*/
defined('DC_ROOT') || exit('access denied!');

$__slug = 'my_plugin';

// 防止改目录名绕过授权
if (basename(__DIR__) !== $__slug) {
    return;
}

require_once DC_ROOT . '/include/lib/plugin_license.php';
if (!PluginLicense::verify($__slug)) {
    return; // 未授权、过期、封禁、被篡改时不加载任何业务逻辑
}

// 以下为业务代码……
function my_plugin_init() { /* ... */ }
addAction('init', 'my_plugin_init');

verify() 返回值

返回含义建议处理
true授权有效(含 valid / trial / preinstall / local 状态)正常加载业务
false未授权、月付/试用过期、封禁或被检测篡改主文件 return,不要 die,避免影响其它模块加载
不要绕过授权守护:请只调用官方 PluginLicense::verify(),不要复制、替换或改写授权库。内部缓存、远程刷新和异常处理由系统统一完成。

二、付费模板授权

独立支付模板、首页模板等可通过统一接口验证域名授权。

调用方式

// 在模板的设置入口 / 关键页面加入:
$resp = @file_get_contents(
    'https://dcshop.xzsc.cc/api.php?action=verify_pay_template'
    . '&template=' . urlencode('my_pay_template')
    . '&domain='   . urlencode($_SERVER['HTTP_HOST'])
);
$data = json_decode($resp, true);
if (!$data || empty($data['data']['authorized'])) {
    // 未授权:建议提示用户去授权中心购买,不要直接 die
}

授权中心返回字段

  • authorized:是否授权(布尔)。
  • template:模板 slug。
  • expire_time:到期时间(月付 / 试用)。
  • cache_ttl:建议的客户端缓存秒数,请遵守,避免高频请求触发频率限制。

三、加密交付与水印

当应用开启加密或水印交付时,授权中心会在下载时按授权信息处理压缩包,再交付给客户端。

开关说明

字段说明建议
水印追踪写入授权相关追踪信息,不影响正常运行付费应用建议开启
源码保护对 PHP 源码做保护处理大型业务插件可选;调试阶段不要开

开发期注意

加密后 __FILE__ / __DIR__ 行为:加密器会在解密阶段把魔术常量改写为原始路径,所以 basename(__DIR__) !== $slug 这类授权守护写法依然有效,开发者不需要特殊处理。

水印 / 加密不修改插件头注释Plugin Name / Version / Description 等头注释会被保留,后台依然能正确识别应用。

常见接入问题

现象可能原因处理
插件加载后立刻 return未购买 / 月付过期 / 试用结束 / 目录被改名检查后台「我的已购」和插件目录名是否与 slug 一致
本地开发也提示未授权本地域名未绑定到任何授权码用本地域名先到授权中心绑定一个测试授权或申请试用