首页 / 教程文章 / WordPress文创产品柔性会员制管理插件开发教程

WordPress文创产品柔性会员制管理插件开发教程

WordPress文创产品柔性会员制管理插件开发教程

一、项目概述与需求分析

在文创产品电商领域,传统的会员制往往过于僵化,无法满足多样化的用户需求。柔性会员制允许用户根据自身需求选择不同的会员等级、权益组合和付费方式,为文创产品提供更灵活的商业变现模式。

本教程将指导您开发一个完整的WordPress柔性会员制管理插件,主要功能包括:

  • 多级会员体系配置
  • 自定义权益包管理
  • 灵活的付费周期设置
  • 会员专属内容保护
  • 自动化会员状态管理

二、插件基础结构与数据库设计

首先创建插件基础文件结构:

<?php
/**
 * Plugin Name: 文创柔性会员管理系统
 * Plugin URI: https://yourwebsite.com/
 * Description: 为文创产品提供柔性会员制管理解决方案
 * Version: 1.0.0
 * Author: 您的名称
 * License: GPL v2 or later
 */

// 防止直接访问
if (!defined('ABSPATH')) {
    exit;
}

// 定义插件常量
define('FMC_PLUGIN_PATH', plugin_dir_path(__FILE__));
define('FMC_PLUGIN_URL', plugin_dir_url(__FILE__));
define('FMC_VERSION', '1.0.0');

// 初始化插件
require_once FMC_PLUGIN_PATH . 'includes/class-core.php';
require_once FMC_PLUGIN_PATH . 'includes/class-database.php';
require_once FMC_PLUGIN_PATH . 'includes/class-membership.php';

// 激活和停用钩子
register_activation_hook(__FILE__, ['FMC_Database', 'create_tables']);
register_deactivation_hook(__FILE__, ['FMC_Core', 'deactivate']);

// 启动插件
add_action('plugins_loaded', ['FMC_Core', 'init']);

创建数据库表结构类:

<?php
// includes/class-database.php

class FMC_Database {
    
    /**
     * 创建插件所需的数据表
     */
    public static function create_tables() {
        global $wpdb;
        
        $charset_collate = $wpdb->get_charset_collate();
        
        // 会员等级表
        $table_levels = $wpdb->prefix . 'fmc_membership_levels';
        $sql_levels = "CREATE TABLE IF NOT EXISTS $table_levels (
            id mediumint(9) NOT NULL AUTO_INCREMENT,
            level_name varchar(100) NOT NULL,
            level_description text,
            price decimal(10,2) NOT NULL DEFAULT '0.00',
            billing_cycle varchar(50) DEFAULT 'monthly',
            trial_days int DEFAULT 0,
            status tinyint(1) DEFAULT 1,
            created_at datetime DEFAULT CURRENT_TIMESTAMP,
            PRIMARY KEY (id)
        ) $charset_collate;";
        
        // 会员权益表
        $table_benefits = $wpdb->prefix . 'fmc_membership_benefits';
        $sql_benefits = "CREATE TABLE IF NOT EXISTS $table_benefits (
            id mediumint(9) NOT NULL AUTO_INCREMENT,
            benefit_name varchar(100) NOT NULL,
            benefit_type varchar(50) NOT NULL,
            benefit_value text,
            level_id mediumint(9) NOT NULL,
            sort_order int DEFAULT 0,
            PRIMARY KEY (id),
            KEY level_id (level_id)
        ) $charset_collate;";
        
        // 用户会员关系表
        $table_user_memberships = $wpdb->prefix . 'fmc_user_memberships';
        $sql_user_memberships = "CREATE TABLE IF NOT EXISTS $table_user_memberships (
            id mediumint(9) NOT NULL AUTO_INCREMENT,
            user_id bigint(20) NOT NULL,
            level_id mediumint(9) NOT NULL,
            start_date datetime NOT NULL,
            end_date datetime,
            status varchar(20) DEFAULT 'active',
            payment_method varchar(50),
            auto_renew tinyint(1) DEFAULT 0,
            last_payment_date datetime,
            next_payment_date datetime,
            notes text,
            PRIMARY KEY (id),
            KEY user_id (user_id),
            KEY level_id (level_id),
            KEY status (status)
        ) $charset_collate;";
        
        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        dbDelta($sql_levels);
        dbDelta($sql_benefits);
        dbDelta($sql_user_memberships);
    }
}

三、会员等级管理模块开发

创建会员等级管理类:

<?php
// includes/class-membership-levels.php

class FMC_Membership_Levels {
    
    private $table_name;
    
    public function __construct() {
        global $wpdb;
        $this->table_name = $wpdb->prefix . 'fmc_membership_levels';
    }
    
    /**
     * 添加新的会员等级
     * @param array $data 会员等级数据
     * @return int|false 插入的ID或false
     */
    public function add_level($data) {
        global $wpdb;
        
        $defaults = [
            'level_name' => '',
            'level_description' => '',
            'price' => 0.00,
            'billing_cycle' => 'monthly',
            'trial_days' => 0,
            'status' => 1
        ];
        
        $data = wp_parse_args($data, $defaults);
        
        // 验证必填字段
        if (empty($data['level_name'])) {
            return false;
        }
        
        $result = $wpdb->insert(
            $this->table_name,
            [
                'level_name' => sanitize_text_field($data['level_name']),
                'level_description' => wp_kses_post($data['level_description']),
                'price' => floatval($data['price']),
                'billing_cycle' => sanitize_text_field($data['billing_cycle']),
                'trial_days' => intval($data['trial_days']),
                'status' => intval($data['status'])
            ],
            ['%s', '%s', '%f', '%s', '%d', '%d']
        );
        
        return $result ? $wpdb->insert_id : false;
    }
    
    /**
     * 获取所有会员等级
     * @param bool $active_only 是否只获取激活的等级
     * @return array 会员等级数组
     */
    public function get_all_levels($active_only = true) {
        global $wpdb;
        
        $where = $active_only ? " WHERE status = 1" : "";
        $sql = "SELECT * FROM {$this->table_name}{$where} ORDER BY price ASC";
        
        return $wpdb->get_results($sql, ARRAY_A);
    }
    
    /**
     * 根据ID获取会员等级
     * @param int $level_id 等级ID
     * @return array|null 等级数据或null
     */
    public function get_level_by_id($level_id) {
        global $wpdb;
        
        $sql = $wpdb->prepare(
            "SELECT * FROM {$this->table_name} WHERE id = %d",
            $level_id
        );
        
        return $wpdb->get_row($sql, ARRAY_A);
    }
    
    /**
     * 更新会员等级
     * @param int $level_id 等级ID
     * @param array $data 更新数据
     * @return bool 是否成功
     */
    public function update_level($level_id, $data) {
        global $wpdb;
        
        $level_id = intval($level_id);
        if ($level_id <= 0) {
            return false;
        }
        
        $update_data = [];
        $format = [];
        
        if (isset($data['level_name'])) {
            $update_data['level_name'] = sanitize_text_field($data['level_name']);
            $format[] = '%s';
        }
        
        if (isset($data['price'])) {
            $update_data['price'] = floatval($data['price']);
            $format[] = '%f';
        }
        
        if (isset($data['status'])) {
            $update_data['status'] = intval($data['status']);
            $format[] = '%d';
        }
        
        if (empty($update_data)) {
            return false;
        }
        
        $result = $wpdb->update(
            $this->table_name,
            $update_data,
            ['id' => $level_id],
            $format,
            ['%d']
        );
        
        return $result !== false;
    }
}

四、用户会员管理模块

创建用户会员管理类:

<?php
// includes/class-user-membership.php

class FMC_User_Membership {
    
    private $table_name;
    
    public function __construct() {
        global $wpdb;
        $this->table_name = $wpdb->prefix . 'fmc_user_memberships';
    }
    
    /**
     * 为用户添加会员资格
     * @param int $user_id 用户ID
     * @param int $level_id 会员等级ID
     * @param array $options 选项数组
     * @return int|false 插入的ID或false
     */
    public function add_user_membership($user_id, $level_id, $options = []) {
        global $wpdb;
        
        $user_id = intval($user_id);
        $level_id = intval($level_id);
        
        if ($user_id <= 0 || $level_id <= 0) {
            return false;
        }
        
        $defaults = [
            'start_date' => current_time('mysql'),
            'billing_cycle' => 'monthly',
            'auto_renew' => 0,
            'status' => 'active'
        ];
        
        $options = wp_parse_args($options, $defaults);
        
        // 计算结束日期
        $end_date = $this->calculate_end_date(
            $options['start_date'], 
            $options['billing_cycle']
        );
        
        $result = $wpdb->insert(
            $this->table_name,
            [
                'user_id' => $user_id,
                'level_id' => $level_id,
                'start_date' => $options['start_date'],
                'end_date' => $end_date,
                'status' => $options['status'],
                'auto_renew' => $options['auto_renew'],
                'next_payment_date' => $end_date
            ],
            ['%d', '%d', '%s', '%s', '%s', '%d', '%s']
        );
        
        if ($result) {
            // 更新用户元数据
            update_user_meta($user_id, 'fmc_membership_level', $level_id);
            update_user_meta($user_id, 'fmc_membership_status', $options['status']);
            
            // 触发动作钩子
            do_action('fmc_user_membership_added', $wpdb->insert_id, $user_id, $level_id);
        }
        
        return $result ? $wpdb->insert_id : false;
    }
    
    /**
     * 计算会员结束日期
     * @param string $start_date 开始日期
     * @param string $billing_cycle 计费周期
     * @return string 结束日期
     */
    private function calculate_end_date($start_date, $billing_cycle) {
        $start_timestamp = strtotime($start_date);
        
        switch ($billing_cycle) {
            case 'daily':
                $end_timestamp = strtotime('+1 day', $start_timestamp);
                break;
            case 'weekly':
                $end_timestamp = strtotime('+1 week', $start_timestamp);
                break;
            case 'yearly':
                $end_timestamp = strtotime('+1 year', $start_timestamp);
                break;
            case 'monthly':
            default:
                $end_timestamp = strtotime('+1 month', $start_timestamp);
                break;
        }
        
        return date('Y-m-d H:i:s', $end_timestamp);
    }
    
    /**
     * 检查用户会员状态
     * @param int $user_id 用户ID
     * @return array 会员状态信息
     */
    public function check_user_membership($user_id) {
        global $wpdb;
        
        $user_id = intval($user_id);
        
        $sql = $wpdb->prepare(
            "SELECT um.*, ml.level_name, ml.price 
             FROM {$this->table_name} um
             LEFT JOIN {$wpdb->prefix}fmc_membership_levels ml ON um.level_id = ml.id
             WHERE um.user_id = %d AND um.status = 'active'
             ORDER BY um.end_date DESC LIMIT 1",
            $user_id
        );
        
        $membership = $wpdb->get_row($sql, ARRAY_A);
        
        if (!$membership) {
            return [
                'has_membership' => false,
                'message' => '无有效会员资格'
            ];
        }
        
        // 检查是否过期
        $current_time = current_time('mysql');
        $is_expired = strtotime($membership['end_date']) < strtotime($current_time);
        
        if ($is_expired) {
            $this->expire_membership($membership['id']);
            
            return [
                'has_membership' => false,
                'message' => '会员已过期'
            ];
        }
        
        return [
            'has_membership' => true,
            'data' => $membership,
            'days_remaining' => $this->calculate_days_remaining($membership['end_date'])
        ];
    }
    
    /**
     * 使会员资格过期
     * @param int $membership_id 会员ID
     * @return bool 是否成功
     */
    public function expire_membership($membership_id) {
        global $wpdb;
        
        $result = $wpdb->update(
            $this->table_name,
            ['status' => 'expired'],
            ['id' => $membership_id],
            ['%s'],
            ['%d']
        );
        
        if ($result) {
            $membership = $this->get_membership_by_id($membership_id);
            if ($membership) {
                update_user_meta($membership['user_id'], 'fmc_membership_status', 'expired');
                do_action('fmc_membership_expired', $membership_id, $membership['user_id']);
            }
        }
        
        return $result !== false;
    }
    
    /**
     * 计算剩余天数
     * @param string $end_date 结束日期
     * @return int 剩余天数
     */
    private function calculate_days_remaining($end_date) {
        $current_time = time();
        $end_timestamp = strtotime($end_date);
        
        $seconds_remaining = $end_timestamp - $current_time;
        $days_remaining = floor($seconds_remaining / (60 * 60 * 24));
        
        return max(0, $days_remaining);
    }
}

五、内容保护与权限控制

创建内容保护类,用于限制非会员访问特定内容:

<?php
// includes/class-content-protection.php

class FMC_Content_Protection {
    
    /**
     * 初始化内容保护钩子
     */
    public static function init() {
        // 保护文章内容
        add_filter('the_content', [__CLASS__, 'protect_post_content']);
        
        // 保护页面
        add_action('template_redirect', [__CLASS__, 'protect_page_access']);
        
        // 短代码支持
        add_shortcode('members_only', [__CLASS__, 'members_only_shortcode']);
    }
    
    /**
     * 保护文章内容
     * @param string $content 原始内容
     * @return string 处理后的内容
     */
    public static function protect_post_content($content) {
        global $post;
        
        // 如果不是文章或页面,直接返回
        if (!is_singular() || !isset($post->ID)) {
            return $content;
        }
        
        // 检查是否需要保护
        $is_protected = get_post_meta($post->ID, '_fmc_protected', true);
        $required_level = get_post_meta($post->ID, '_fmc_required_level', true);
        
        if (!$is_protected || empty($required_level)) {
            return $content;
        }
        
        // 检查用户权限
        $user_id = get_current_user_id();
        $has_access = self::check_user_access($user_id, $required_level);
        
        if ($has_access) {
            return $content;
        }
        
        // 显示保护信息
        $message = self::get_protection_message($required_level);
        return $message;
    }
    
    /**
     * 检查用户访问权限
     * @param int $user_id 用户ID
     * @param int $required_level 所需等级ID
     * @return bool 是否有权限
     */
    private static function check_user_access($user_id, $required_level) {
        if ($user_id <= 0) {
            return false;
        }
        
        $user_membership = new FMC_User_Membership();
        $membership_info = $user_membership->check_user_membership($user_id);
        
        if (!$membership_info['has_membership']) {
            return false;
        }
        
        // 获取用户当前等级
        $user_level = get_user_meta($user_id, 'fmc_membership_level', true);
        
        // 检查等级是否足够
        $levels_manager = new FMC_Membership_Levels();
        $user_level_data = $levels_manager->get_level_by_id($user_level);
        $required_level_data = $levels_manager->get_level_by_id($required_level);
        
        if (!$user_level_data || !$required_level_data) {
            return false;
        }
        
        // 比较价格(假设价格越高,等级越高)
        return floatval($user_level_data['price']) >= floatval($required_level_data['price']);
    }
    
    /**
     * 获取保护信息
     * @param int $required_level 所需等级ID
    /**
     * 获取保护信息
     * @param int $required_level 所需等级ID
     * @return string 保护信息HTML
     */
    private static function get_protection_message($required_level) {
        $levels_manager = new FMC_Membership_Levels();
        $level_data = $levels_manager->get_level_by_id($required_level);
        
        $level_name = $level_data ? $level_data['level_name'] : '特定会员';
        
        $message = '<div class="fmc-protected-content">';
        $message .= '<h3>🔒 会员专属内容</h3>';
        $message .= '<p>此内容仅对 <strong>' . esc_html($level_name) . '</strong> 会员开放</p>';
        
        if (is_user_logged_in()) {
            $message .= '<p>您当前的会员等级无法访问此内容,请升级您的会员资格。</p>';
            $message .= '<a href="' . esc_url(get_permalink(get_page_by_path('membership-plans'))) . '" class="fmc-upgrade-button">立即升级</a>';
        } else {
            $message .= '<p>请登录并订阅相应会员计划以查看此内容。</p>';
            $message .= '<a href="' . esc_url(wp_login_url(get_permalink())) . '" class="fmc-login-button">登录/注册</a>';
        }
        
        $message .= '</div>';
        
        return $message;
    }
    
    /**
     * 保护页面访问
     */
    public static function protect_page_access() {
        if (!is_page()) {
            return;
        }
        
        global $post;
        $is_protected = get_post_meta($post->ID, '_fmc_protected', true);
        $required_level = get_post_meta($post->ID, '_fmc_required_level', true);
        
        if (!$is_protected || empty($required_level)) {
            return;
        }
        
        $user_id = get_current_user_id();
        $has_access = self::check_user_access($user_id, $required_level);
        
        if (!$has_access) {
            wp_redirect(home_url('/membership-required/'));
            exit;
        }
    }
    
    /**
     * 会员专属短代码
     * @param array $atts 短代码属性
     * @param string $content 短代码内容
     * @return string 处理后的内容
     */
    public static function members_only_shortcode($atts, $content = null) {
        $atts = shortcode_atts([
            'level' => '',
            'message' => '此内容仅对会员可见'
        ], $atts, 'members_only');
        
        $user_id = get_current_user_id();
        
        if (empty($atts['level'])) {
            // 检查是否有任何会员资格
            $user_membership = new FMC_User_Membership();
            $membership_info = $user_membership->check_user_membership($user_id);
            
            if ($membership_info['has_membership']) {
                return do_shortcode($content);
            }
        } else {
            // 检查特定等级
            $has_access = self::check_user_access($user_id, intval($atts['level']));
            if ($has_access) {
                return do_shortcode($content);
            }
        }
        
        return '<div class="fmc-members-only-message">' . esc_html($atts['message']) . '</div>';
    }
}

六、管理界面开发

创建管理菜单和设置页面:

<?php
// admin/class-admin-menu.php

class FMC_Admin_Menu {
    
    /**
     * 初始化管理菜单
     */
    public static function init() {
        add_action('admin_menu', [__CLASS__, 'add_admin_menus']);
        add_action('admin_enqueue_scripts', [__CLASS__, 'enqueue_admin_scripts']);
    }
    
    /**
     * 添加管理菜单
     */
    public static function add_admin_menus() {
        // 主菜单
        add_menu_page(
            '柔性会员管理',
            '文创会员',
            'manage_options',
            'fmc-dashboard',
            [__CLASS__, 'render_dashboard_page'],
            'dashicons-groups',
            30
        );
        
        // 子菜单
        add_submenu_page(
            'fmc-dashboard',
            '会员等级管理',
            '会员等级',
            'manage_options',
            'fmc-levels',
            [__CLASS__, 'render_levels_page']
        );
        
        add_submenu_page(
            'fmc-dashboard',
            '会员管理',
            '会员管理',
            'manage_options',
            'fmc-members',
            [__CLASS__, 'render_members_page']
        );
        
        add_submenu_page(
            'fmc-dashboard',
            '设置',
            '设置',
            'manage_options',
            'fmc-settings',
            [__CLASS__, 'render_settings_page']
        );
    }
    
    /**
     * 加载管理端脚本和样式
     */
    public static function enqueue_admin_scripts($hook) {
        if (strpos($hook, 'fmc-') === false) {
            return;
        }
        
        wp_enqueue_style(
            'fmc-admin-style',
            FMC_PLUGIN_URL . 'assets/css/admin-style.css',
            [],
            FMC_VERSION
        );
        
        wp_enqueue_script(
            'fmc-admin-script',
            FMC_PLUGIN_URL . 'assets/js/admin-script.js',
            ['jquery', 'jquery-ui-sortable'],
            FMC_VERSION,
            true
        );
        
        wp_localize_script('fmc-admin-script', 'fmc_admin', [
            'ajax_url' => admin_url('admin-ajax.php'),
            'nonce' => wp_create_nonce('fmc_admin_nonce'),
            'confirm_delete' => '确定要删除此项吗?此操作不可撤销。'
        ]);
    }
    
    /**
     * 渲染仪表盘页面
     */
    public static function render_dashboard_page() {
        ?>
        <div class="wrap fmc-dashboard">
            <h1 class="wp-heading-inline">文创柔性会员管理系统</h1>
            
            <div class="fmc-stats-container">
                <div class="fmc-stat-card">
                    <h3>总会员数</h3>
                    <p class="stat-number"><?php echo self::get_total_members(); ?></p>
                </div>
                
                <div class="fmc-stat-card">
                    <h3>活跃会员</h3>
                    <p class="stat-number"><?php echo self::get_active_members(); ?></p>
                </div>
                
                <div class="fmc-stat-card">
                    <h3>本月收入</h3>
                    <p class="stat-number">¥<?php echo self::get_monthly_revenue(); ?></p>
                </div>
                
                <div class="fmc-stat-card">
                    <h3>会员等级</h3>
                    <p class="stat-number"><?php echo self::get_level_count(); ?></p>
                </div>
            </div>
            
            <div class="fmc-recent-activity">
                <h2>最近活动</h2>
                <?php self::display_recent_activity(); ?>
            </div>
        </div>
        <?php
    }
    
    /**
     * 渲染会员等级管理页面
     */
    public static function render_levels_page() {
        $action = isset($_GET['action']) ? sanitize_text_field($_GET['action']) : 'list';
        $level_id = isset($_GET['level_id']) ? intval($_GET['level_id']) : 0;
        
        switch ($action) {
            case 'edit':
                self::render_edit_level_form($level_id);
                break;
            case 'add':
                self::render_add_level_form();
                break;
            default:
                self::render_levels_list();
                break;
        }
    }
    
    /**
     * 渲染等级列表
     */
    private static function render_levels_list() {
        $levels_manager = new FMC_Membership_Levels();
        $levels = $levels_manager->get_all_levels(false);
        ?>
        <div class="wrap">
            <h1 class="wp-heading-inline">会员等级管理</h1>
            <a href="<?php echo admin_url('admin.php?page=fmc-levels&action=add'); ?>" class="page-title-action">添加新等级</a>
            
            <table class="wp-list-table widefat fixed striped">
                <thead>
                    <tr>
                        <th>ID</th>
                        <th>等级名称</th>
                        <th>价格</th>
                        <th>计费周期</th>
                        <th>试用天数</th>
                        <th>状态</th>
                        <th>操作</th>
                    </tr>
                </thead>
                <tbody>
                    <?php foreach ($levels as $level): ?>
                    <tr>
                        <td><?php echo $level['id']; ?></td>
                        <td>
                            <strong><?php echo esc_html($level['level_name']); ?></strong>
                            <p class="description"><?php echo esc_html($level['level_description']); ?></p>
                        </td>
                        <td>¥<?php echo number_format($level['price'], 2); ?></td>
                        <td><?php echo self::get_billing_cycle_label($level['billing_cycle']); ?></td>
                        <td><?php echo $level['trial_days']; ?>天</td>
                        <td>
                            <span class="fmc-status-badge fmc-status-<?php echo $level['status'] ? 'active' : 'inactive'; ?>">
                                <?php echo $level['status'] ? '激活' : '停用'; ?>
                            </span>
                        </td>
                        <td>
                            <a href="<?php echo admin_url('admin.php?page=fmc-levels&action=edit&level_id=' . $level['id']); ?>" class="button button-small">编辑</a>
                            <button class="button button-small button-delete-level" data-level-id="<?php echo $level['id']; ?>">删除</button>
                        </td>
                    </tr>
                    <?php endforeach; ?>
                </tbody>
            </table>
        </div>
        <?php
    }
    
    /**
     * 渲染添加等级表单
     */
    private static function render_add_level_form() {
        ?>
        <div class="wrap">
            <h1>添加会员等级</h1>
            
            <form method="post" action="<?php echo admin_url('admin-post.php'); ?>">
                <input type="hidden" name="action" value="fmc_save_level">
                <?php wp_nonce_field('fmc_save_level_nonce', 'fmc_nonce'); ?>
                
                <table class="form-table">
                    <tr>
                        <th scope="row"><label for="level_name">等级名称</label></th>
                        <td>
                            <input type="text" id="level_name" name="level_name" class="regular-text" required>
                            <p class="description">例如:基础会员、高级会员、尊享会员</p>
                        </td>
                    </tr>
                    
                    <tr>
                        <th scope="row"><label for="level_description">等级描述</label></th>
                        <td>
                            <textarea id="level_description" name="level_description" rows="3" class="large-text"></textarea>
                            <p class="description">简要描述此等级的特权和优势</p>
                        </td>
                    </tr>
                    
                    <tr>
                        <th scope="row"><label for="price">价格</label></th>
                        <td>
                            <input type="number" id="price" name="price" step="0.01" min="0" value="0" required>
                            <p class="description">设置会员价格,0表示免费</p>
                        </td>
                    </tr>
                    
                    <tr>
                        <th scope="row"><label for="billing_cycle">计费周期</label></th>
                        <td>
                            <select id="billing_cycle" name="billing_cycle">
                                <option value="monthly">月付</option>
                                <option value="yearly">年付</option>
                                <option value="weekly">周付</option>
                                <option value="daily">日付</option>
                                <option value="lifetime">一次性终身</option>
                            </select>
                        </td>
                    </tr>
                    
                    <tr>
                        <th scope="row"><label for="trial_days">试用天数</label></th>
                        <td>
                            <input type="number" id="trial_days" name="trial_days" min="0" value="0">
                            <p class="description">设置免费试用天数,0表示不提供试用</p>
                        </td>
                    </tr>
                    
                    <tr>
                        <th scope="row"><label for="status">状态</label></th>
                        <td>
                            <select id="status" name="status">
                                <option value="1">激活</option>
                                <option value="0">停用</option>
                            </select>
                        </td>
                    </tr>
                </table>
                
                <p class="submit">
                    <button type="submit" class="button button-primary">保存等级</button>
                    <a href="<?php echo admin_url('admin.php?page=fmc-levels'); ?>" class="button">取消</a>
                </p>
            </form>
        </div>
        <?php
    }
    
    /**
     * 获取计费周期标签
     */
    private static function get_billing_cycle_label($cycle) {
        $labels = [
            'daily' => '日付',
            'weekly' => '周付',
            'monthly' => '月付',
            'yearly' => '年付',
            'lifetime' => '终身'
        ];
        
        return isset($labels[$cycle]) ? $labels[$cycle] : $cycle;
    }
}

七、支付集成与Webhook处理

创建支付处理类(以支付宝为例):

<?php
// includes/class-payment-processor.php

class FMC_Payment_Processor {
    
    /**
     * 初始化支付处理器
     */
    public static function init() {
        add_action('init', [__CLASS__, 'register_payment_endpoints']);
        add_action('fmc_process_payment', [__CLASS__, 'process_payment'], 10, 3);
    }
    
    /**
     * 注册支付回调端点
     */
    public static function register_payment_endpoints() {
        add_rewrite_rule(
            '^fmc-payment/alipay-callback/?$',
            'index.php?fmc_payment_callback=alipay',
            'top'
        );
        
        add_rewrite_rule(
            '^fmc-payment/wechat-callback/?$',
            'index.php?fmc_payment_callback=wechat',
            'top'
        );
        
        add_filter('query_vars', function($vars) {
            $vars[] = 'fmc_payment_callback';
            return $vars;
        });
        
        add_action('template_redirect', [__CLASS__, 'handle_payment_callback']);
    }
    
    /**
     * 处理支付回调
     */
    public static function handle_payment_callback() {
        $callback_type = get_query_var('fmc_payment_callback');
        
        if (empty($callback_type)) {
            return;
        }
        
        switch ($callback_type) {
            case 'alipay':
                self::handle_alipay_callback();
                break;
            case 'wechat':
                self::handle_wechat_callback();
                break;
        }
        
        exit;
    }
    
    /**
     * 处理支付宝回调
     */
    private static function handle_alipay_callback() {
        // 验证签名
        if (!self::verify_alipay_signature($_POST)) {
            wp_die('签名验证失败', '支付错误', ['response' => 400]);
        }
        
        $order_id = sanitize_text_field($_POST['out_trade_no']);
        $trade_status = sanitize_text_field($_POST['trade_status']);
        
        // 更新订单状态
        self::update_order_status($order_id, $trade_status);
        
        // 返回成功响应
        echo 'success';
    }
    
    /**
     * 创建支付订单
     * @param int $user_id 用户ID
     * @param int $level_id 会员等级ID
     * @param string $payment_method 支付方式
     * @return array 支付信息
     */
    public static function create_payment_order($user_id, $level_id, $payment_method = 'alipay') {
        $levels_manager = new FMC_Membership_Levels();
        $level = $levels_manager->get_level_by_id($level_id);
        
        if (!$level) {
            return [
                'success' => false,
                'message' => '无效的会员等级'
            ];
        }
        
        // 生成订单号
        $order_id = 'FMC' . date('YmdHis') . mt_rand(1000, 9999);
        
        // 保存订单到数据库
        global $wpdb;
        $wpdb->insert(
            $wpdb->prefix . 'fmc_orders',
            [
                'order_id' => $order_id,
                'user_id' => $user_id,
                'level_id' => $level_id,
                'amount' => $level['price'],
                'payment_method' => $payment_method,
                'status' => 'pending',
                'created_at' => current_time('mysql')
            ],
            ['%s', '%d', '%d', '%f', '%s', '%s', '%s']
        );
        
        // 根据支付方式生成支付参数
        switch ($payment_method) {
            case 'alipay':
                $payment_data = self::generate_alipay_params($order_id, $level);
                break;
            case 'wechat':
                $payment_data = self::generate_wechat_params($order_id, $level);
                break;
            default:
                return [
                    'success' => false,
                    'message' => '不支持的支付方式'
                ];
        }
        
        return [
            'success' => true,
            'order_id' => $order_id,
            'payment_data' => $payment_data
        ];
本文来自网络,不代表柔性供应链服务中心立场,转载请注明出处:https://mall.org.cn/6207.html

EXCHANGES®作者

上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@exchanges.center

工作时间:周一至周五,9:00-17:30,节假日休息
返回顶部