文章目录
-
- 在数字文创产业蓬勃发展的今天,创作者需要一个灵活、安全的数字资产授权与交易解决方案。本教程将指导您开发一个WordPress插件,实现数字内容(如电子书、图片、音频等)的柔性授权管理和在线交易功能。 核心功能需求: 数字资产上传与管理 多层级授权模式(个人使用、商业使用、独家授权等) 安全交易与支付集成 授权证书生成与验证 销售数据统计与分析
- 首先,我们创建插件的基本框架: <?php /** * Plugin Name: 文创数字资产柔性授权与交易系统 * Plugin URI: https://yourwebsite.com/ * Description: 为WordPress网站提供数字资产授权管理与交易功能 * Version: 1.0.0 * Author: 您的名称 * License: GPL v2 or later */ // 防止直接访问 if (!defined('ABSPATH')) { exit; } // 定义插件常量 define('DIGITAL_ASSET_PLUGIN_PATH', plugin_dir_path(__FILE__)); define('DIGITAL_ASSET_PLUGIN_URL', plugin_dir_url(__FILE__)); define('DIGITAL_ASSET_VERSION', '1.0.0'); // 初始化插件 class DigitalAssetPlugin { private static $instance = null; public static function get_instance() { if (null === self::$instance) { self::$instance = new self(); } return self::$instance; } private function __construct() { $this->init_hooks(); } private function init_hooks() { // 激活/停用钩子 register_activation_hook(__FILE__, array($this, 'activate_plugin')); register_deactivation_hook(__FILE__, array($this, 'deactivate_plugin')); // 初始化 add_action('init', array($this, 'init_plugin')); // 管理菜单 add_action('admin_menu', array($this, 'add_admin_menu')); // 加载脚本和样式 add_action('wp_enqueue_scripts', array($this, 'enqueue_frontend_assets')); add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_assets')); } public function activate_plugin() { // 创建必要的数据库表 $this->create_database_tables(); // 设置默认选项 $this->set_default_options(); // 刷新重写规则 flush_rewrite_rules(); } public function deactivate_plugin() { // 清理临时数据 flush_rewrite_rules(); } public function init_plugin() { // 注册自定义文章类型 $this->register_digital_asset_post_type(); // 注册短代码 $this->register_shortcodes(); } // 其他方法将在后续部分实现 } // 启动插件 DigitalAssetPlugin::get_instance(); ?>
- 创建专门用于管理数字资产的自定义文章类型: // 在DigitalAssetPlugin类中添加以下方法 /** * 注册数字资产自定义文章类型 */ public function register_digital_asset_post_type() { $labels = array( 'name' => '数字资产', 'singular_name' => '数字资产', 'menu_name' => '数字资产', 'add_new' => '添加新资产', 'add_new_item' => '添加新数字资产', 'edit_item' => '编辑数字资产', 'new_item' => '新数字资产', 'view_item' => '查看数字资产', 'search_items' => '搜索数字资产', 'not_found' => '未找到数字资产', 'not_found_in_trash' => '回收站中无数字资产' ); $args = array( 'labels' => $labels, 'public' => true, 'publicly_queryable' => true, 'show_ui' => true, 'show_in_menu' => true, 'query_var' => true, 'rewrite' => array('slug' => 'digital-asset'), 'capability_type' => 'post', 'has_archive' => true, 'hierarchical' => false, 'menu_position' => 20, 'menu_icon' => 'dashicons-media-document', 'supports' => array('title', 'editor', 'thumbnail', 'excerpt'), 'show_in_rest' => true // 支持Gutenberg编辑器 ); register_post_type('digital_asset', $args); // 注册自定义分类法:授权类型 $this->register_license_taxonomy(); } /** * 注册授权类型分类法 */ private function register_license_taxonomy() { $labels = array( 'name' => '授权类型', 'singular_name' => '授权类型', 'search_items' => '搜索授权类型', 'all_items' => '所有授权类型', 'parent_item' => '父授权类型', 'parent_item_colon' => '父授权类型:', 'edit_item' => '编辑授权类型', 'update_item' => '更新授权类型', 'add_new_item' => '添加新授权类型', 'new_item_name' => '新授权类型名称', 'menu_name' => '授权类型', ); $args = array( 'hierarchical' => true, 'labels' => $labels, 'show_ui' => true, 'show_admin_column' => true, 'query_var' => true, 'rewrite' => array('slug' => 'license-type'), 'show_in_rest' => true, ); register_taxonomy('license_type', array('digital_asset'), $args); }
- 创建资产元数据框,用于设置价格、授权选项等: // 在init_hooks方法中添加 add_action('add_meta_boxes', array($this, 'add_digital_asset_metaboxes')); add_action('save_post_digital_asset', array($this, 'save_digital_asset_metadata')); /** * 添加数字资产元数据框 */ public function add_digital_asset_metaboxes() { add_meta_box( 'digital_asset_pricing_meta', '定价与授权设置', array($this, 'render_pricing_metabox'), 'digital_asset', 'normal', 'high' ); add_meta_box( 'digital_asset_file_meta', '数字文件管理', array($this, 'render_file_metabox'), 'digital_asset', 'normal', 'high' ); } /** * 渲染定价元数据框 */ public function render_pricing_metabox($post) { // 添加安全验证 wp_nonce_field('digital_asset_meta_save', 'digital_asset_meta_nonce'); // 获取现有值 $base_price = get_post_meta($post->ID, '_digital_asset_base_price', true); $personal_price = get_post_meta($post->ID, '_digital_asset_personal_price', true); $commercial_price = get_post_meta($post->ID, '_digital_asset_commercial_price', true); $exclusive_price = get_post_meta($post->ID, '_digital_asset_exclusive_price', true); ?> <div class="digital-asset-pricing"> <p> <label for="base_price">基础价格 (默认授权):</label> <input type="number" step="0.01" min="0" id="base_price" name="digital_asset_base_price" value="<?php echo esc_attr($base_price ?: '0.00'); ?>" /> </p> <p> <label for="personal_price">个人使用授权价格:</label> <input type="number" step="0.01" min="0" id="personal_price" name="digital_asset_personal_price" value="<?php echo esc_attr($personal_price ?: ''); ?>" /> <span class="description">留空则使用基础价格</span> </p> <p> <label for="commercial_price">商业使用授权价格:</label> <input type="number" step="0.01" min="0" id="commercial_price" name="digital_asset_commercial_price" value="<?php echo esc_attr($commercial_price ?: ''); ?>" /> </p> <p> <label for="exclusive_price">独家授权价格:</label> <input type="number" step="0.01" min="0" id="exclusive_price" name="digital_asset_exclusive_price" value="<?php echo esc_attr($exclusive_price ?: ''); ?>" /> </p> <p> <label for="max_downloads">最大下载次数:</label> <input type="number" min="0" id="max_downloads" name="digital_asset_max_downloads" value="<?php echo esc_attr(get_post_meta($post->ID, '_digital_asset_max_downloads', true) ?: '5'); ?>" /> <span class="description">0表示无限制</span> </p> </div> <?php } /** * 保存元数据 */ public function save_digital_asset_metadata($post_id) { // 安全检查 if (!isset($_POST['digital_asset_meta_nonce']) || !wp_verify_nonce($_POST['digital_asset_meta_nonce'], 'digital_asset_meta_save')) { return; } // 检查自动保存 if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return; } // 检查权限 if (!current_user_can('edit_post', $post_id)) { return; } // 保存价格数据 $price_fields = array( 'digital_asset_base_price', 'digital_asset_personal_price', 'digital_asset_commercial_price', 'digital_asset_exclusive_price', 'digital_asset_max_downloads' ); foreach ($price_fields as $field) { if (isset($_POST[$field])) { update_post_meta($post_id, '_' . $field, sanitize_text_field($_POST[$field])); } } }
- 创建交易处理类,处理购买和授权流程: // 创建新文件:includes/class-transaction-handler.php <?php class DigitalAssetTransactionHandler { private $db; public function __construct() { global $wpdb; $this->db = $wpdb; } /** * 处理购买请求 * @param int $asset_id 资产ID * @param string $license_type 授权类型 * @param int $user_id 用户ID * @return array 处理结果 */ public function process_purchase($asset_id, $license_type, $user_id = null) { // 验证资产 $asset = get_post($asset_id); if (!$asset || $asset->post_type !== 'digital_asset') { return array( 'success' => false, 'message' => '无效的数字资产' ); } // 获取用户ID if (!$user_id) { $user_id = get_current_user_id(); } if (!$user_id) { return array( 'success' => false, 'message' => '请先登录' ); } // 计算价格 $price = $this->calculate_price($asset_id, $license_type); // 创建订单 $order_id = $this->create_order(array( 'asset_id' => $asset_id, 'user_id' => $user_id, 'license_type' => $license_type, 'price' => $price, 'status' => 'pending' )); // 处理支付(这里以模拟支付为例) $payment_result = $this->process_payment($order_id, $price); if ($payment_result['success']) { // 更新订单状态 $this->update_order_status($order_id, 'completed'); // 生成授权证书 $license_key = $this->generate_license_key($asset_id, $user_id, $license_type); // 发送下载链接 $this->send_download_link($user_id, $asset_id, $license_key); return array( 'success' => true, 'order_id' => $order_id, 'license_key' => $license_key, 'message' => '购买成功!' ); } return array( 'success' => false, 'message' => '支付失败: ' . $payment_result['message'] ); } /** * 计算价格 */ private function calculate_price($asset_id, $license_type) { $base_price = get_post_meta($asset_id, '_digital_asset_base_price', true); switch ($license_type) { case 'personal': $price = get_post_meta($asset_id, '_digital_asset_personal_price', true); break; case 'commercial': $price = get_post_meta($asset_id, '_digital_asset_commercial_price', true); break; case 'exclusive': $price = get_post_meta($asset_id, '_digital_asset_exclusive_price', true); break; default: $price = $base_price; } return $price ?: $base_price; } /** * 创建订单 */ private function create_order($order_data) { $table_name = $this->db->prefix . 'digital_asset_orders'; $this->db->insert($table_name, array( 'asset_id' => $order_data['asset_id'], 'user_id' => $order_data['user_id'], 'license_type' => $order_data['license_type'], 'price' => $order_data['price'], 'status' => $order_data['status'], 'created_at' => current_time('mysql'), 'updated_at' => current_time('mysql') )); return $this->db->insert_id; } /** * 生成授权密钥 */ private function generate_license_key($asset_id, $user_id, $license_type) { $data = $asset_id . $user_id . $license_type . time(); return 'LIC-' . strtoupper(md5($data)); } /** * 模拟支付处理 */ private function process_payment($order_id, $amount) { // 这里应集成真实的支付网关 // 例如:PayPal、Stripe、支付宝等 // 模拟支付成功 return array( 'success' => true, 'transaction_id' => 'TXN_' . uniqid(), 'message' => '支付成功' ); } } ?>
- 创建短代码,在前端展示数字资产和购买选项: // 在DigitalAssetPlugin类中添加短代码注册 /** * 注册短代码 */ private function register_shortcodes() { add_shortcode('digital_asset_store', array($this, 'render_asset_store')); add_shortcode('digital_asset_detail', array($this, 'render_asset_detail')); } /** * 渲染资产商店 */ public function render_asset_store($atts) { $atts = shortcode_atts(array( 'category' => '', 'limit' => 12, 'columns' => 3 ), $atts); // 查询数字资产 $args = array( 'post_type' => 'digital_asset', 'posts_per_page' => intval($atts['limit']), 'post_status' => 'publish' ); if (!empty($atts['category'])) { $args['tax_query'] = array( array( 'taxonomy' => 'license_type', 'field' => 'slug', 'terms' => $atts['category'] ) ); } $assets = new WP_Query($args); ob_start(); if ($assets->have_posts()) { echo '<div class="digital-asset-store columns-' . esc_attr($atts['columns']) . '">'; while ($assets->have_posts()) { $assets->the_post(); $asset_id = get_the_ID(); $base_price = get_post_meta($asset_id, '_digital_asset_base_price', true); ?> <div class="digital-asset-item"> <div class="asset-thumbnail"> <?php if (has_post_thumbnail()) : ?> <a href="<?php the_permalink(); ?>"> <?php the_post_thumbnail('medium'); ?> </a> <?php endif; ?> </div> <div class="asset-info"> <h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3> <div class="asset-excerpt"><?php the_excerpt(); ?></div> <div class="asset-pricing"> <span class="price">¥<?php echo number_format($base_price, 2); ?></span> <a href="<?php echo add_query_arg('asset_id', $asset_id, get_permalink()); ?>" class="buy-button"> 查看详情 </a> </div> </div> <?php } echo '</div>'; // 分页 if ($assets->max_num_pages > 1) { echo '<div class="asset-pagination">'; echo paginate_links(array( 'total' => $assets->max_num_pages, 'current' => max(1, get_query_var('paged')) )); echo '</div>'; } wp_reset_postdata(); } else { echo '<p>暂无数字资产</p>'; } return ob_get_clean(); } /** 渲染资产详情页 */ public function render_asset_detail($atts) { $asset_id = isset($_GET['asset_id']) ? intval($_GET['asset_id']) : get_the_ID(); if (!$asset_id || get_post_type($asset_id) !== 'digital_asset') { return '<p>无效的数字资产</p>'; } $asset = get_post($asset_id); $base_price = get_post_meta($asset_id, '_digital_asset_base_price', true); $personal_price = get_post_meta($asset_id, '_digital_asset_personal_price', true); $commercial_price = get_post_meta($asset_id, '_digital_asset_commercial_price', true); $exclusive_price = get_post_meta($asset_id, '_digital_asset_exclusive_price', true); ob_start(); ?> <div class="digital-asset-detail"> <div class="asset-header"> <h1><?php echo esc_html($asset->post_title); ?></h1> <div class="asset-meta"> <span class="author">作者: <?php echo get_the_author_meta('display_name', $asset->post_author); ?></span> <span class="date">发布时间: <?php echo get_the_date('', $asset); ?></span> </div> </div> <div class="asset-content"> <div class="asset-image"> <?php if (has_post_thumbnail($asset_id)) : ?> <?php echo get_the_post_thumbnail($asset_id, 'large'); ?> <?php endif; ?> </div> <div class="asset-description"> <?php echo apply_filters('the_content', $asset->post_content); ?> </div> </div> <div class="asset-licensing"> <h3>选择授权类型</h3> <form id="digital-asset-purchase-form" method="post"> <?php wp_nonce_field('digital_asset_purchase', 'purchase_nonce'); ?> <input type="hidden" name="asset_id" value="<?php echo $asset_id; ?>"> <div class="license-options"> <div class="license-option"> <input type="radio" id="license_personal" name="license_type" value="personal" checked> <label for="license_personal"> <h4>个人使用授权</h4> <p>仅限个人非商业用途</p> <div class="license-price"> ¥<?php echo number_format($personal_price ?: $base_price, 2); ?> </div> </label> </div> <div class="license-option"> <input type="radio" id="license_commercial" name="license_type" value="commercial"> <label for="license_commercial"> <h4>商业使用授权</h4> <p>可用于商业项目</p> <div class="license-price"> ¥<?php echo number_format($commercial_price ?: $base_price * 2, 2); ?> </div> </label> </div> <div class="license-option"> <input type="radio" id="license_exclusive" name="license_type" value="exclusive"> <label for="license_exclusive"> <h4>独家授权</h4> <p>获得独家使用权</p> <div class="license-price"> ¥<?php echo number_format($exclusive_price ?: $base_price * 5, 2); ?> </div> </label> </div> </div> <div class="purchase-action"> <button type="submit" class="purchase-button"> 立即购买 </button> <div class="license-terms"> <input type="checkbox" id="agree_terms" required> <label for="agree_terms">我已阅读并同意<a href="#">授权协议</a></label> </div> </div> </form> </div> <div class="asset-specs"> <h3>技术规格</h3> <ul> <li>文件格式: <?php echo esc_html(get_post_meta($asset_id, '_file_format', true) ?: '多种格式'); ?></li> <li>分辨率: <?php echo esc_html(get_post_meta($asset_id, '_resolution', true) ?: '可定制'); ?></li> <li>最大下载次数: <?php echo esc_html(get_post_meta($asset_id, '_digital_asset_max_downloads', true) ?: '5'); ?></li> </ul> </div> </div> <script> jQuery(document).ready(function($) { $('#digital-asset-purchase-form').on('submit', function(e) { e.preventDefault(); if (!$('#agree_terms').is(':checked')) { alert('请先同意授权协议'); return; } var formData = $(this).serialize(); $.ajax({ url: '<?php echo admin_url('admin-ajax.php'); ?>', type: 'POST', data: formData + '&action=process_digital_asset_purchase', beforeSend: function() { $('.purchase-button').prop('disabled', true).text('处理中...'); }, success: function(response) { if (response.success) { window.location.href = response.redirect_url; } else { alert(response.message); $('.purchase-button').prop('disabled', false).text('立即购买'); } }, error: function() { alert('请求失败,请重试'); $('.purchase-button').prop('disabled', false).text('立即购买'); } }); }); }); </script> <?php return ob_get_clean(); } ## 七、AJAX处理与数据库操作 创建AJAX处理函数和数据库表结构: // 在DigitalAssetPlugin类中添加AJAX处理 /** 初始化AJAX处理 */ private function init_ajax_handlers() { add_action('wp_ajax_process_digital_asset_purchase', array($this, 'ajax_process_purchase')); add_action('wp_ajax_nopriv_process_digital_asset_purchase', array($this, 'ajax_process_purchase')); add_action('wp_ajax_generate_license_certificate', array($this, 'ajax_generate_certificate')); add_action('wp_ajax_download_digital_asset', array($this, 'ajax_download_asset')); } /** 创建数据库表 */ private function create_database_tables() { global $wpdb; $charset_collate = $wpdb->get_charset_collate(); $table_prefix = $wpdb->prefix; // 订单表 $orders_table = $table_prefix . 'digital_asset_orders'; $orders_sql = "CREATE TABLE IF NOT EXISTS $orders_table ( id bigint(20) NOT NULL AUTO_INCREMENT, asset_id bigint(20) NOT NULL, user_id bigint(20) NOT NULL, license_type varchar(50) NOT NULL, price decimal(10,2) NOT NULL, license_key varchar(100) NOT NULL, transaction_id varchar(100), status varchar(20) DEFAULT 'pending', download_count int(11) DEFAULT 0, max_downloads int(11) DEFAULT 5, created_at datetime DEFAULT CURRENT_TIMESTAMP, updated_at datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY asset_id (asset_id), KEY user_id (user_id), KEY license_key (license_key) ) $charset_collate;"; // 授权证书表 $licenses_table = $table_prefix . 'digital_asset_licenses'; $licenses_sql = "CREATE TABLE IF NOT EXISTS $licenses_table ( id bigint(20) NOT NULL AUTO_INCREMENT, order_id bigint(20) NOT NULL, license_key varchar(100) NOT NULL, asset_id bigint(20) NOT NULL, user_id bigint(20) NOT NULL, license_type varchar(50) NOT NULL, valid_from date NOT NULL, valid_to date, is_active tinyint(1) DEFAULT 1, terms text, certificate_data longtext, created_at datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY license_key (license_key), KEY order_id (order_id), KEY asset_id (asset_id), KEY user_id (user_id) ) $charset_collate;"; require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); dbDelta($orders_sql); dbDelta($licenses_sql); } /** AJAX处理购买请求 */ public function ajax_process_purchase() { // 验证nonce if (!isset($_POST['purchase_nonce']) || !wp_verify_nonce($_POST['purchase_nonce'], 'digital_asset_purchase')) { wp_send_json_error('安全验证失败'); } // 验证用户 if (!is_user_logged_in()) { wp_send_json_error('请先登录'); } $asset_id = intval($_POST['asset_id']); $license_type = sanitize_text_field($_POST['license_type']); $user_id = get_current_user_id(); // 实例化交易处理器 require_once DIGITAL_ASSET_PLUGIN_PATH . 'includes/class-transaction-handler.php'; $transaction_handler = new DigitalAssetTransactionHandler(); $result = $transaction_handler->process_purchase($asset_id, $license_type, $user_id); if ($result['success']) { // 创建订单成功页面URL $order_page_id = get_option('digital_asset_order_page'); $redirect_url = add_query_arg(array( 'order_id' => $result['order_id'], 'license_key' => $result['license_key'] ), get_permalink($order_page_id)); wp_send_json_success(array( 'message' => $result['message'], 'redirect_url' => $redirect_url )); } else { wp_send_json_error($result['message']); } } /** 生成授权证书 */ public function ajax_generate_certificate() { $license_key = sanitize_text_field($_POST['license_key']); global $wpdb; $table_name = $wpdb->prefix . 'digital_asset_licenses'; $license = $wpdb->get_row($wpdb->prepare( "SELECT * FROM $table_name WHERE license_key = %s", $license_key )); if (!$license) { wp_send_json_error('无效的授权密钥'); } // 生成PDF证书 $certificate_data = $this->generate_pdf_certificate($license); wp_send_json_success(array( 'certificate' => $certificate_data, 'download_url' => add_query_arg(array( 'action' => 'download_certificate', 'license_key' => $license_key, 'nonce' => wp_create_nonce('download_certificate_' . $license_key) ), admin_url('admin-ajax.php')) )); } /** 生成PDF证书 */ private function generate_pdf_certificate($license) { // 这里应该集成PDF生成库,如TCPDF或mPDF // 由于篇幅限制,这里返回HTML格式的证书 $asset = get_post($license->asset_id); $user = get_userdata($license->user_id); $html = ' <div class="license-certificate"> <div class="certificate-header"> <h1>数字资产授权证书</h1> <div class="certificate-id">证书编号: ' . $license->license_key . '</div> </div> <div class="certificate-body"> <p>兹证明 <strong>' . esc_html($user->display_name) . '</strong> 已获得以下数字资产的合法授权:</p> <div class="asset-info"> <h3>' . esc_html($asset->post_title) . '</h3> <p>授权类型: ' . $this->get_license_type_name($license->license_type) . '</p> <p>授权期限: ' . date('Y年m月d日', strtotime($license->valid_from)) . ' 至 ' . ($license->valid_to ? date('Y年m月d日', strtotime($license->valid_to)) : '永久') . '</p> </div> <div class="license-terms"> <h4>授权条款</h4> <p>' . nl2br(esc_html($license->terms)) . '</p> </div> <div class="signatures"> <div class="issuer-signature"> <p>发行方: ' . get_bloginfo('name') . '</p> <p>签发日期: ' . date('Y年m月d日') . '</p> </div> </div> </div> <div class="certificate-footer"> <p>验证地址: ' . home_url('/verify-license?key=' . $license->license_key) . '</p> </div> </div>'; return $html; } ## 八、安全与验证系统 实现授权验证和下载保护: /** 验证授权密钥 */ public function verify_license_key($license_key, $asset_id = null) { global $wpdb; $table_name = $wpdb->prefix . 'digital_asset_licenses'; $query = "SELECT * FROM $table_name WHERE license_key = %s AND is_active = 1"; $params = array($license_key); if ($asset_id) { $query .= " AND asset_id = %d"; $params[] = $asset_id; } $license = $wpdb->get_row($wpdb->prepare($query, $params)); if (!$license) { return false; } // 检查有效期 if ($license->valid_to && strtotime($license->valid_to) < current_time('timestamp')) { return false; } return $license; } /** 安全下载文件 */ public function secure_file_download($file_path, $license_key) { // 验证授权 $license = $this->verify_license_key($license_key); if (!$license) { wp_die('无效的授权或授权已过期'); } // 检查下载次数限制 if ($license->max_downloads > 0 && $license->download_count >= $license->max_downloads) { wp_die('已达到最大下载次数'); } // 更新下载计数 $this->increment_download_count($license->id); // 发送文件 if (file_exists($file_path)) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="' . basename($file_path) . '"'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file_path)); readfile($file_path); exit; } else { wp_die('文件不存在'); } } /** 增加下载计数 */ private function increment_download_count($license_id) { global $wpdb; $table_name = $wpdb->prefix . 'digital_asset_licenses'; $wpdb->query($wpdb->prepare( "UPDATE $table_name SET download_count = download_count + 1 WHERE id = %d", $license_id )); } /** 添加水印(针对图片资产) */ public function add_watermark_to_image($image_path, $license_key) { // 获取授权信息 $license = $this->verify_license_key($license_key); if (!$license || $license->license_type === 'personal') { // 个人授权添加水印 $watermark_text = "个人使用授权 - " . $license_key; // 使用GD库添加水印 $image = imagecreatefromstring(file_get_contents($image_path)); $text_color = imagecolorallocatealpha($image, 255, 255, 255, 60); $font_size = 20; // 计算文字位置 $text_box = imagettfbbox($font_size, 0, $this->get_font_path(), $watermark_text); $text_width = $text_box[2] - $text_box[0]; $text_height = $text_box[7] - $text_box[1]; $x = (imagesx($image) - $text_width) / 2; $y = (imagesy($image) - $text_height) / 2; // 添加文字水印 imagettftext($image, $font_size, 0, $x, $y, $text_color, $this->get_font_path(), $watermark_text); // 输出图像 imagepng($image, $image_path . '_watermarked'); imagedestroy($image); return $image_path . '_watermarked'; } return $image_path; }
在数字文创产业蓬勃发展的今天,创作者需要一个灵活、安全的数字资产授权与交易解决方案。本教程将指导您开发一个WordPress插件,实现数字内容(如电子书、图片、音频等)的柔性授权管理和在线交易功能。
核心功能需求:
- 数字资产上传与管理
- 多层级授权模式(个人使用、商业使用、独家授权等)
- 安全交易与支付集成
- 授权证书生成与验证
- 销售数据统计与分析
首先,我们创建插件的基本框架:
<?php
/**
* Plugin Name: 文创数字资产柔性授权与交易系统
* Plugin URI: https://yourwebsite.com/
* Description: 为WordPress网站提供数字资产授权管理与交易功能
* Version: 1.0.0
* Author: 您的名称
* License: GPL v2 or later
*/
// 防止直接访问
if (!defined('ABSPATH')) {
exit;
}
// 定义插件常量
define('DIGITAL_ASSET_PLUGIN_PATH', plugin_dir_path(__FILE__));
define('DIGITAL_ASSET_PLUGIN_URL', plugin_dir_url(__FILE__));
define('DIGITAL_ASSET_VERSION', '1.0.0');
// 初始化插件
class DigitalAssetPlugin {
private static $instance = null;
public static function get_instance() {
if (null === self::$instance) {
self::$instance = new self();
}
return self::$instance;
}
private function __construct() {
$this->init_hooks();
}
private function init_hooks() {
// 激活/停用钩子
register_activation_hook(__FILE__, array($this, 'activate_plugin'));
register_deactivation_hook(__FILE__, array($this, 'deactivate_plugin'));
// 初始化
add_action('init', array($this, 'init_plugin'));
// 管理菜单
add_action('admin_menu', array($this, 'add_admin_menu'));
// 加载脚本和样式
add_action('wp_enqueue_scripts', array($this, 'enqueue_frontend_assets'));
add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_assets'));
}
public function activate_plugin() {
// 创建必要的数据库表
$this->create_database_tables();
// 设置默认选项
$this->set_default_options();
// 刷新重写规则
flush_rewrite_rules();
}
public function deactivate_plugin() {
// 清理临时数据
flush_rewrite_rules();
}
public function init_plugin() {
// 注册自定义文章类型
$this->register_digital_asset_post_type();
// 注册短代码
$this->register_shortcodes();
}
// 其他方法将在后续部分实现
}
// 启动插件
DigitalAssetPlugin::get_instance();
?>
创建专门用于管理数字资产的自定义文章类型:
// 在DigitalAssetPlugin类中添加以下方法
/**
* 注册数字资产自定义文章类型
*/
public function register_digital_asset_post_type() {
$labels = array(
'name' => '数字资产',
'singular_name' => '数字资产',
'menu_name' => '数字资产',
'add_new' => '添加新资产',
'add_new_item' => '添加新数字资产',
'edit_item' => '编辑数字资产',
'new_item' => '新数字资产',
'view_item' => '查看数字资产',
'search_items' => '搜索数字资产',
'not_found' => '未找到数字资产',
'not_found_in_trash' => '回收站中无数字资产'
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array('slug' => 'digital-asset'),
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => 20,
'menu_icon' => 'dashicons-media-document',
'supports' => array('title', 'editor', 'thumbnail', 'excerpt'),
'show_in_rest' => true // 支持Gutenberg编辑器
);
register_post_type('digital_asset', $args);
// 注册自定义分类法:授权类型
$this->register_license_taxonomy();
}
/**
* 注册授权类型分类法
*/
private function register_license_taxonomy() {
$labels = array(
'name' => '授权类型',
'singular_name' => '授权类型',
'search_items' => '搜索授权类型',
'all_items' => '所有授权类型',
'parent_item' => '父授权类型',
'parent_item_colon' => '父授权类型:',
'edit_item' => '编辑授权类型',
'update_item' => '更新授权类型',
'add_new_item' => '添加新授权类型',
'new_item_name' => '新授权类型名称',
'menu_name' => '授权类型',
);
$args = array(
'hierarchical' => true,
'labels' => $labels,
'show_ui' => true,
'show_admin_column' => true,
'query_var' => true,
'rewrite' => array('slug' => 'license-type'),
'show_in_rest' => true,
);
register_taxonomy('license_type', array('digital_asset'), $args);
}
创建资产元数据框,用于设置价格、授权选项等:
// 在init_hooks方法中添加
add_action('add_meta_boxes', array($this, 'add_digital_asset_metaboxes'));
add_action('save_post_digital_asset', array($this, 'save_digital_asset_metadata'));
/**
* 添加数字资产元数据框
*/
public function add_digital_asset_metaboxes() {
add_meta_box(
'digital_asset_pricing_meta',
'定价与授权设置',
array($this, 'render_pricing_metabox'),
'digital_asset',
'normal',
'high'
);
add_meta_box(
'digital_asset_file_meta',
'数字文件管理',
array($this, 'render_file_metabox'),
'digital_asset',
'normal',
'high'
);
}
/**
* 渲染定价元数据框
*/
public function render_pricing_metabox($post) {
// 添加安全验证
wp_nonce_field('digital_asset_meta_save', 'digital_asset_meta_nonce');
// 获取现有值
$base_price = get_post_meta($post->ID, '_digital_asset_base_price', true);
$personal_price = get_post_meta($post->ID, '_digital_asset_personal_price', true);
$commercial_price = get_post_meta($post->ID, '_digital_asset_commercial_price', true);
$exclusive_price = get_post_meta($post->ID, '_digital_asset_exclusive_price', true);
?>
<div class="digital-asset-pricing">
<p>
<label for="base_price">基础价格 (默认授权):</label>
<input type="number" step="0.01" min="0" id="base_price"
name="digital_asset_base_price"
value="<?php echo esc_attr($base_price ?: '0.00'); ?>" />
</p>
<p>
<label for="personal_price">个人使用授权价格:</label>
<input type="number" step="0.01" min="0" id="personal_price"
name="digital_asset_personal_price"
value="<?php echo esc_attr($personal_price ?: ''); ?>" />
<span class="description">留空则使用基础价格</span>
</p>
<p>
<label for="commercial_price">商业使用授权价格:</label>
<input type="number" step="0.01" min="0" id="commercial_price"
name="digital_asset_commercial_price"
value="<?php echo esc_attr($commercial_price ?: ''); ?>" />
</p>
<p>
<label for="exclusive_price">独家授权价格:</label>
<input type="number" step="0.01" min="0" id="exclusive_price"
name="digital_asset_exclusive_price"
value="<?php echo esc_attr($exclusive_price ?: ''); ?>" />
</p>
<p>
<label for="max_downloads">最大下载次数:</label>
<input type="number" min="0" id="max_downloads"
name="digital_asset_max_downloads"
value="<?php echo esc_attr(get_post_meta($post->ID, '_digital_asset_max_downloads', true) ?: '5'); ?>" />
<span class="description">0表示无限制</span>
</p>
</div>
<?php
}
/**
* 保存元数据
*/
public function save_digital_asset_metadata($post_id) {
// 安全检查
if (!isset($_POST['digital_asset_meta_nonce']) ||
!wp_verify_nonce($_POST['digital_asset_meta_nonce'], 'digital_asset_meta_save')) {
return;
}
// 检查自动保存
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
// 检查权限
if (!current_user_can('edit_post', $post_id)) {
return;
}
// 保存价格数据
$price_fields = array(
'digital_asset_base_price',
'digital_asset_personal_price',
'digital_asset_commercial_price',
'digital_asset_exclusive_price',
'digital_asset_max_downloads'
);
foreach ($price_fields as $field) {
if (isset($_POST[$field])) {
update_post_meta($post_id, '_' . $field, sanitize_text_field($_POST[$field]));
}
}
}
创建交易处理类,处理购买和授权流程:
// 创建新文件:includes/class-transaction-handler.php
<?php
class DigitalAssetTransactionHandler {
private $db;
public function __construct() {
global $wpdb;
$this->db = $wpdb;
}
/**
* 处理购买请求
* @param int $asset_id 资产ID
* @param string $license_type 授权类型
* @param int $user_id 用户ID
* @return array 处理结果
*/
public function process_purchase($asset_id, $license_type, $user_id = null) {
// 验证资产
$asset = get_post($asset_id);
if (!$asset || $asset->post_type !== 'digital_asset') {
return array(
'success' => false,
'message' => '无效的数字资产'
);
}
// 获取用户ID
if (!$user_id) {
$user_id = get_current_user_id();
}
if (!$user_id) {
return array(
'success' => false,
'message' => '请先登录'
);
}
// 计算价格
$price = $this->calculate_price($asset_id, $license_type);
// 创建订单
$order_id = $this->create_order(array(
'asset_id' => $asset_id,
'user_id' => $user_id,
'license_type' => $license_type,
'price' => $price,
'status' => 'pending'
));
// 处理支付(这里以模拟支付为例)
$payment_result = $this->process_payment($order_id, $price);
if ($payment_result['success']) {
// 更新订单状态
$this->update_order_status($order_id, 'completed');
// 生成授权证书
$license_key = $this->generate_license_key($asset_id, $user_id, $license_type);
// 发送下载链接
$this->send_download_link($user_id, $asset_id, $license_key);
return array(
'success' => true,
'order_id' => $order_id,
'license_key' => $license_key,
'message' => '购买成功!'
);
}
return array(
'success' => false,
'message' => '支付失败: ' . $payment_result['message']
);
}
/**
* 计算价格
*/
private function calculate_price($asset_id, $license_type) {
$base_price = get_post_meta($asset_id, '_digital_asset_base_price', true);
switch ($license_type) {
case 'personal':
$price = get_post_meta($asset_id, '_digital_asset_personal_price', true);
break;
case 'commercial':
$price = get_post_meta($asset_id, '_digital_asset_commercial_price', true);
break;
case 'exclusive':
$price = get_post_meta($asset_id, '_digital_asset_exclusive_price', true);
break;
default:
$price = $base_price;
}
return $price ?: $base_price;
}
/**
* 创建订单
*/
private function create_order($order_data) {
$table_name = $this->db->prefix . 'digital_asset_orders';
$this->db->insert($table_name, array(
'asset_id' => $order_data['asset_id'],
'user_id' => $order_data['user_id'],
'license_type' => $order_data['license_type'],
'price' => $order_data['price'],
'status' => $order_data['status'],
'created_at' => current_time('mysql'),
'updated_at' => current_time('mysql')
));
return $this->db->insert_id;
}
/**
* 生成授权密钥
*/
private function generate_license_key($asset_id, $user_id, $license_type) {
$data = $asset_id . $user_id . $license_type . time();
return 'LIC-' . strtoupper(md5($data));
}
/**
* 模拟支付处理
*/
private function process_payment($order_id, $amount) {
// 这里应集成真实的支付网关
// 例如:PayPal、Stripe、支付宝等
// 模拟支付成功
return array(
'success' => true,
'transaction_id' => 'TXN_' . uniqid(),
'message' => '支付成功'
);
}
}
?>
创建短代码,在前端展示数字资产和购买选项:
// 在DigitalAssetPlugin类中添加短代码注册
/**
* 注册短代码
*/
private function register_shortcodes() {
add_shortcode('digital_asset_store', array($this, 'render_asset_store'));
add_shortcode('digital_asset_detail', array($this, 'render_asset_detail'));
}
/**
* 渲染资产商店
*/
public function render_asset_store($atts) {
$atts = shortcode_atts(array(
'category' => '',
'limit' => 12,
'columns' => 3
), $atts);
// 查询数字资产
$args = array(
'post_type' => 'digital_asset',
'posts_per_page' => intval($atts['limit']),
'post_status' => 'publish'
);
if (!empty($atts['category'])) {
$args['tax_query'] = array(
array(
'taxonomy' => 'license_type',
'field' => 'slug',
'terms' => $atts['category']
)
);
}
$assets = new WP_Query($args);
ob_start();
if ($assets->have_posts()) {
echo '<div class="digital-asset-store columns-' . esc_attr($atts['columns']) . '">';
while ($assets->have_posts()) {
$assets->the_post();
$asset_id = get_the_ID();
$base_price = get_post_meta($asset_id, '_digital_asset_base_price', true);
?>
<div class="digital-asset-item">
<div class="asset-thumbnail">
<?php if (has_post_thumbnail()) : ?>
<a href="<?php the_permalink(); ?>">
<?php the_post_thumbnail('medium'); ?>
</a>
<?php endif; ?>
</div>
<div class="asset-info">
<h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
<div class="asset-excerpt"><?php the_excerpt(); ?></div>
<div class="asset-pricing">
<span class="price">¥<?php echo number_format($base_price, 2); ?></span>
<a href="<?php echo add_query_arg('asset_id', $asset_id, get_permalink()); ?>"
class="buy-button">
查看详情
</a>
</div>
</div>
<?php
}
echo '</div>';
// 分页
if ($assets->max_num_pages > 1) {
echo '<div class="asset-pagination">';
echo paginate_links(array(
'total' => $assets->max_num_pages,
'current' => max(1, get_query_var('paged'))
));
echo '</div>';
}
wp_reset_postdata();
} else {
echo '<p>暂无数字资产</p>';
}
return ob_get_clean();
}
/**
- 渲染资产详情页
*/
public function render_asset_detail($atts) {
$asset_id = isset($_GET['asset_id']) ? intval($_GET['asset_id']) : get_the_ID();
if (!$asset_id || get_post_type($asset_id) !== 'digital_asset') {
return '<p>无效的数字资产</p>';
}
$asset = get_post($asset_id);
$base_price = get_post_meta($asset_id, '_digital_asset_base_price', true);
$personal_price = get_post_meta($asset_id, '_digital_asset_personal_price', true);
$commercial_price = get_post_meta($asset_id, '_digital_asset_commercial_price', true);
$exclusive_price = get_post_meta($asset_id, '_digital_asset_exclusive_price', true);
ob_start();
?>
<div class="digital-asset-detail">
<div class="asset-header">
<h1><?php echo esc_html($asset->post_title); ?></h1>
<div class="asset-meta">
<span class="author">作者: <?php echo get_the_author_meta('display_name', $asset->post_author); ?></span>
<span class="date">发布时间: <?php echo get_the_date('', $asset); ?></span>
</div>
</div>
<div class="asset-content">
<div class="asset-image">
<?php if (has_post_thumbnail($asset_id)) : ?>
<?php echo get_the_post_thumbnail($asset_id, 'large'); ?>
<?php endif; ?>
</div>
<div class="asset-description">
<?php echo apply_filters('the_content', $asset->post_content); ?>
</div>
</div>
<div class="asset-licensing">
<h3>选择授权类型</h3>
<form id="digital-asset-purchase-form" method="post">
<?php wp_nonce_field('digital_asset_purchase', 'purchase_nonce'); ?>
<input type="hidden" name="asset_id" value="<?php echo $asset_id; ?>">
<div class="license-options">
<div class="license-option">
<input type="radio" id="license_personal" name="license_type" value="personal" checked>
<label for="license_personal">
<h4>个人使用授权</h4>
<p>仅限个人非商业用途</p>
<div class="license-price">
¥<?php echo number_format($personal_price ?: $base_price, 2); ?>
</div>
</label>
</div>
<div class="license-option">
<input type="radio" id="license_commercial" name="license_type" value="commercial">
<label for="license_commercial">
<h4>商业使用授权</h4>
<p>可用于商业项目</p>
<div class="license-price">
¥<?php echo number_format($commercial_price ?: $base_price * 2, 2); ?>
</div>
</label>
</div>
<div class="license-option">
<input type="radio" id="license_exclusive" name="license_type" value="exclusive">
<label for="license_exclusive">
<h4>独家授权</h4>
<p>获得独家使用权</p>
<div class="license-price">
¥<?php echo number_format($exclusive_price ?: $base_price * 5, 2); ?>
</div>
</label>
</div>
</div>
<div class="purchase-action">
<button type="submit" class="purchase-button">
立即购买
</button>
<div class="license-terms">
<input type="checkbox" id="agree_terms" required>
<label for="agree_terms">我已阅读并同意<a href="#">授权协议</a></label>
</div>
</div>
</form>
</div>
<div class="asset-specs">
<h3>技术规格</h3>
<ul>
<li>文件格式: <?php echo esc_html(get_post_meta($asset_id, '_file_format', true) ?: '多种格式'); ?></li>
<li>分辨率: <?php echo esc_html(get_post_meta($asset_id, '_resolution', true) ?: '可定制'); ?></li>
<li>最大下载次数: <?php echo esc_html(get_post_meta($asset_id, '_digital_asset_max_downloads', true) ?: '5'); ?></li>
</ul>
</div>
</div>
<script>
jQuery(document).ready(function($) {
$('#digital-asset-purchase-form').on('submit', function(e) {
e.preventDefault();
if (!$('#agree_terms').is(':checked')) {
alert('请先同意授权协议');
return;
}
var formData = $(this).serialize();
$.ajax({
url: '<?php echo admin_url('admin-ajax.php'); ?>',
type: 'POST',
data: formData + '&action=process_digital_asset_purchase',
beforeSend: function() {
$('.purchase-button').prop('disabled', true).text('处理中...');
},
success: function(response) {
if (response.success) {
window.location.href = response.redirect_url;
} else {
alert(response.message);
$('.purchase-button').prop('disabled', false).text('立即购买');
}
},
error: function() {
alert('请求失败,请重试');
$('.purchase-button').prop('disabled', false).text('立即购买');
}
});
});
});
</script>
<?php
return ob_get_clean();
}
## 七、AJAX处理与数据库操作
创建AJAX处理函数和数据库表结构:
// 在DigitalAssetPlugin类中添加AJAX处理
/**
- 初始化AJAX处理
*/
private function init_ajax_handlers() {
add_action('wp_ajax_process_digital_asset_purchase', array($this, 'ajax_process_purchase'));
add_action('wp_ajax_nopriv_process_digital_asset_purchase', array($this, 'ajax_process_purchase'));
add_action('wp_ajax_generate_license_certificate', array($this, 'ajax_generate_certificate'));
add_action('wp_ajax_download_digital_asset', array($this, 'ajax_download_asset'));
}
/**
- 创建数据库表
*/
private function create_database_tables() {
global $wpdb;
$charset_collate = $wpdb->get_charset_collate();
$table_prefix = $wpdb->prefix;
// 订单表
$orders_table = $table_prefix . 'digital_asset_orders';
$orders_sql = "CREATE TABLE IF NOT EXISTS $orders_table (
id bigint(20) NOT NULL AUTO_INCREMENT,
asset_id bigint(20) NOT NULL,
user_id bigint(20) NOT NULL,
license_type varchar(50) NOT NULL,
price decimal(10,2) NOT NULL,
license_key varchar(100) NOT NULL,
transaction_id varchar(100),
status varchar(20) DEFAULT 'pending',
download_count int(11) DEFAULT 0,
max_downloads int(11) DEFAULT 5,
created_at datetime DEFAULT CURRENT_TIMESTAMP,
updated_at datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY asset_id (asset_id),
KEY user_id (user_id),
KEY license_key (license_key)
) $charset_collate;";
// 授权证书表
$licenses_table = $table_prefix . 'digital_asset_licenses';
$licenses_sql = "CREATE TABLE IF NOT EXISTS $licenses_table (
id bigint(20) NOT NULL AUTO_INCREMENT,
order_id bigint(20) NOT NULL,
license_key varchar(100) NOT NULL,
asset_id bigint(20) NOT NULL,
user_id bigint(20) NOT NULL,
license_type varchar(50) NOT NULL,
valid_from date NOT NULL,
valid_to date,
is_active tinyint(1) DEFAULT 1,
terms text,
certificate_data longtext,
created_at datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY license_key (license_key),
KEY order_id (order_id),
KEY asset_id (asset_id),
KEY user_id (user_id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($orders_sql);
dbDelta($licenses_sql);
}
/**
- AJAX处理购买请求
*/
public function ajax_process_purchase() {
// 验证nonce
if (!isset($_POST['purchase_nonce']) ||
!wp_verify_nonce($_POST['purchase_nonce'], 'digital_asset_purchase')) {
wp_send_json_error('安全验证失败');
}
// 验证用户
if (!is_user_logged_in()) {
wp_send_json_error('请先登录');
}
$asset_id = intval($_POST['asset_id']);
$license_type = sanitize_text_field($_POST['license_type']);
$user_id = get_current_user_id();
// 实例化交易处理器
require_once DIGITAL_ASSET_PLUGIN_PATH . 'includes/class-transaction-handler.php';
$transaction_handler = new DigitalAssetTransactionHandler();
$result = $transaction_handler->process_purchase($asset_id, $license_type, $user_id);
if ($result['success']) {
// 创建订单成功页面URL
$order_page_id = get_option('digital_asset_order_page');
$redirect_url = add_query_arg(array(
'order_id' => $result['order_id'],
'license_key' => $result['license_key']
), get_permalink($order_page_id));
wp_send_json_success(array(
'message' => $result['message'],
'redirect_url' => $redirect_url
));
} else {
wp_send_json_error($result['message']);
}
}
/**
- 生成授权证书
*/
public function ajax_generate_certificate() {
$license_key = sanitize_text_field($_POST['license_key']);
global $wpdb;
$table_name = $wpdb->prefix . 'digital_asset_licenses';
$license = $wpdb->get_row($wpdb->prepare(
"SELECT * FROM $table_name WHERE license_key = %s",
$license_key
));
if (!$license) {
wp_send_json_error('无效的授权密钥');
}
// 生成PDF证书
$certificate_data = $this->generate_pdf_certificate($license);
wp_send_json_success(array(
'certificate' => $certificate_data,
'download_url' => add_query_arg(array(
'action' => 'download_certificate',
'license_key' => $license_key,
'nonce' => wp_create_nonce('download_certificate_' . $license_key)
), admin_url('admin-ajax.php'))
));
}
/**
- 生成PDF证书
*/
private function generate_pdf_certificate($license) {
// 这里应该集成PDF生成库,如TCPDF或mPDF
// 由于篇幅限制,这里返回HTML格式的证书
$asset = get_post($license->asset_id);
$user = get_userdata($license->user_id);
$html = '
<div class="license-certificate">
<div class="certificate-header">
<h1>数字资产授权证书</h1>
<div class="certificate-id">证书编号: ' . $license->license_key . '</div>
</div>
<div class="certificate-body">
<p>兹证明 <strong>' . esc_html($user->display_name) . '</strong> 已获得以下数字资产的合法授权:</p>
<div class="asset-info">
<h3>' . esc_html($asset->post_title) . '</h3>
<p>授权类型: ' . $this->get_license_type_name($license->license_type) . '</p>
<p>授权期限: ' . date('Y年m月d日', strtotime($license->valid_from)) . ' 至 ' .
($license->valid_to ? date('Y年m月d日', strtotime($license->valid_to)) : '永久') . '</p>
</div>
<div class="license-terms">
<h4>授权条款</h4>
<p>' . nl2br(esc_html($license->terms)) . '</p>
</div>
<div class="signatures">
<div class="issuer-signature">
<p>发行方: ' . get_bloginfo('name') . '</p>
<p>签发日期: ' . date('Y年m月d日') . '</p>
</div>
</div>
</div>
<div class="certificate-footer">
<p>验证地址: ' . home_url('/verify-license?key=' . $license->license_key) . '</p>
</div>
</div>';
return $html;
}
## 八、安全与验证系统
实现授权验证和下载保护:
/**
- 验证授权密钥
*/
public function verify_license_key($license_key, $asset_id = null) {
global $wpdb;
$table_name = $wpdb->prefix . 'digital_asset_licenses';
$query = "SELECT * FROM $table_name WHERE license_key = %s AND is_active = 1";
$params = array($license_key);
if ($asset_id) {
$query .= " AND asset_id = %d";
$params[] = $asset_id;
}
$license = $wpdb->get_row($wpdb->prepare($query, $params));
if (!$license) {
return false;
}
// 检查有效期
if ($license->valid_to && strtotime($license->valid_to) < current_time('timestamp')) {
return false;
}
return $license;
}
/**
- 安全下载文件
*/
public function secure_file_download($file_path, $license_key) {
// 验证授权
$license = $this->verify_license_key($license_key);
if (!$license) {
wp_die('无效的授权或授权已过期');
}
// 检查下载次数限制
if ($license->max_downloads > 0 && $license->download_count >= $license->max_downloads) {
wp_die('已达到最大下载次数');
}
// 更新下载计数
$this->increment_download_count($license->id);
// 发送文件
if (file_exists($file_path)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($file_path) . '"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file_path));
readfile($file_path);
exit;
} else {
wp_die('文件不存在');
}
}
/**
- 增加下载计数
*/
private function increment_download_count($license_id) {
global $wpdb;
$table_name = $wpdb->prefix . 'digital_asset_licenses';
$wpdb->query($wpdb->prepare(
"UPDATE $table_name SET download_count = download_count + 1 WHERE id = %d",
$license_id
));
}
/**
- 添加水印(针对图片资产)
*/
public function add_watermark_to_image($image_path, $license_key) {
// 获取授权信息
$license = $this->verify_license_key($license_key);
if (!$license || $license->license_type === 'personal') {
// 个人授权添加水印
$watermark_text = "个人使用授权 - " . $license_key;
// 使用GD库添加水印
$image = imagecreatefromstring(file_get_contents($image_path));
$text_color = imagecolorallocatealpha($image, 255, 255, 255, 60);
$font_size = 20;
// 计算文字位置
$text_box = imagettfbbox($font_size, 0, $this->get_font_path(), $watermark_text);
$text_width = $text_box[2] - $text_box[0];
$text_height = $text_box[7] - $text_box[1];
$x = (imagesx($image) - $text_width) / 2;
$y = (imagesy($image) - $text_height) / 2;
// 添加文字水印
imagettftext($image, $font_size, 0, $x, $y, $text_color, $this->get_font_path(), $watermark_text);
// 输出图像
imagepng($image, $image_path . '_watermarked');
imagedestroy($image);
return $image_path . '_watermarked';
}
return $image_path;
}


