在数字化交易日益频繁的今天,虚拟商品(如游戏点卡、软件激活码、会员充值卡等)的在线销售需求持续增长。发卡网系统作为连接虚拟商品供应商与消费者的桥梁,通过自动化卡密分发、订单管理和代理分销功能,极大简化了虚拟商品的交易流程。
  发卡网源码:paywks.top/ka
  核心功能模块:
  多角色管理(管理员、代理商、普通用户)
  卡密批量导入/生成与库存管理
  自动化订单处理与支付对接
  代理分销与佣金结算系统
  数据统计与财务报表


  一、技术栈选择理由:
  PHP作为主流的Web开发语言,具备开发效率高、部署成本低、生态成熟等优势;MySQL作为关系型数据库,能高效处理交易数据的存储与关联查询。二者结合的技术架构,既适合中小型团队快速搭建系统,又能满足高并发场景下的性能需求。
  二、系统环境准备与源码获取
  2.1 运行环境要求
  部署发卡网系统需满足以下环境配置:

  | 组件 | 最低版本 | 推荐版本 |
  |------|----------|----------|
  | PHP | 7.2 | 7.4/8.0 |
  | MySQL | 5.6 | 8.0 |
  | Web服务器 | Apache 2.4/Nginx 1.18 | Nginx 1.21 |
  | 扩展依赖 | PDO、OpenSSL、GD库、cURL | 包含上述所有扩展 |
  | 操作系统 | Linux/Windows | CentOS 7/8、Ubuntu 20.04 |


  2.2 源码下载与校验
  获取源码时需通过正规渠道(如开源社区、官方仓库),避免恶意代码植入。推荐通过以下方式获取:


  GitHub/Gitee搜索关键词“发卡网 PHP”,筛选Stars>100的项目
  选择包含完整文档、近期有更新记录的源码包
  下载后通过`md5sum`命令校验文件完整性
  bash
  示例:Linux系统校验源码包完整性
  md5sum card-system-v1.0.zip
  输出对比官方提供的MD5值,确保一致
  三、一键部署教程(附自动化脚本)
  3.1 Linux系统一键部署(CentOS为例)
  以下脚本可自动完成环境安装、数据库配置和系统部署,适用于无技术基础的用户:
  bash
  !/bin/bash
  发卡网系统一键部署脚本 v1.0
  适用系统:CentOS 7/8
  1. 更新系统并安装依赖

  yum update -y
  yum install -y wget vim unzip httpd mysql-server php php-mysql php-gd php-curl php-openssl


  2. 启动服务

  systemctl start httpd
  systemctl start mysqld
  systemctl enable httpd
  systemctl enable mysqld


  3. 配置MySQL(设置root密码、创建数据库)
  mysqladmin -u root password "your_mysql_password"
  mysql -u root -p"your_mysql_password" -e "CREATE DATABASE card_system DEFAULT CHARACTER SET utf8mb4;"
  4. 下载并解压源码(请替换为实际源码地址)
  wget https://example.com/card-system-v1.0.zip -O /var/www/html/card.zip
  cd /var/www/html && unzip card.zip && rm -f card.zip
  5. 配置权限
  chmod -R 775 /var/www/html
  chown -R apache:apache /var/www/html
  6. 导入初始数据库
  mysql -u root -p"your_mysql_password" card_system < /var/www/html/sql/card_system.sql
  echo "部署完成!访问 http://服务器IP 即可进入安装向导"
  3.2 安装向导操作步骤
  1. 访问服务器IP,进入环境检测页面,确保所有依赖项显示“√”
  2. 填写数据库信息(地址:localhost,用户名:root,密码:部署时设置的密码,数据库名:card_system)
  3. 创建管理员账号(用户名、密码、邮箱)
  4. 完成安装后自动跳转至登录页面,输入管理员账号即可进入后台
  四、核心代码模块解析
  4.1 数据库连接类(/inc/db.class.php)

  php
  <?php
  class DB {
  private $host = 'localhost';
  private $user = 'root';
  private $pwd = 'your_mysql_password';
  private $dbname = 'card_system';
  private $conn;
  // 初始化连接
  public function __construct() {
  $this->conn = new mysqli($this->host, $this->user, $this->pwd, $this->dbname);
  if ($this->conn->connect_error) {
  die("数据库连接失败:" . $this->conn->connect_error);
  }
  $this->conn->query("SET NAMES utf8mb4");
  }
  // 执行查询
  public function query($sql) {
  return $this->conn->query($sql);
  }
  // 获取单条数据
  public function getOne($sql) {
  $result = $this->query($sql);
  return $result->fetch_assoc();
  }
  // 获取多条数据
  public function getAll($sql) {
  $result = $this->query($sql);
  $data = [];
  while ($row = $result->fetch_assoc()) {
  $data[] = $row;
  }
  return $data;
  }
  // 析构函数:关闭连接
  public function __destruct() {
  $this->conn->close();
  }
  }
  ?>


  4.2 用户登录验证模块(/api/login.php)

  php
  <?php
  header("Content-Type: application/json; charset=utf-8");
  require_once '../inc/db.class.php';
  $db = new DB();
  // 获取POST数据
  $username = $_POST['username'] ?? '';
  $password = $_POST['password'] ?? '';
  // 数据验证
  if (empty($username) || empty($password)) {
  echo json_encode(['code' => 1001, 'msg' => '用户名或密码不能为空']);
  exit;
  }
  // 查询用户信息
  $user = $db->getOne("SELECT * FROM admin WHERE username = '{$username}' LIMIT 1");
  if (!$user) {
  echo json_encode(['code' => 1002, 'msg' => '用户不存在']);
  exit;
  }
  // 密码验证(实际项目需使用password_hash()加密)
  if (md5($password) != $user['password']) {
  echo json_encode(['code' => 1003, 'msg' => '密码错误']);
  exit;
  }
  // 生成登录凭证(Session或Token)
  session_start();
  $_SESSION['admin_id'] = $user['id'];
  $_SESSION['username'] = $user['username'];
  echo json_encode(['code' => 200, 'msg' => '登录成功', 'data' => ['username' => $user['username']]]);
  ?>


  4.3 卡密管理核心功能(/admin/card_manage.php)

  php
  <?php
  require_once '../inc/db.class.php';
  $db = new DB();
  session_start();
  // 验证管理员登录状态
  if (!isset($_SESSION['admin_id'])) {
  header("Location: login.php");
  exit;
  }
  // 卡密添加处理
  if ($_SERVER['REQUEST_METHOD'] == 'POST' && $_POST['action'] == 'add_card') {
  $card_type = $_POST['card_type'];
  $card_code = $_POST['card_code']; // 可批量导入,每行一个卡密
  $price = $_POST['price'];
  $expire_time = $_POST['expire_time'] ?? '2099-12-31';
  // 拆分多行卡密
  $codes = explode("\n", $card_code);
  $success = 0;
  foreach ($codes as $code) {
  $code = trim($code);
  if (!empty($code)) {
  $sql = "INSERT INTO card (code, type, price, status, add_time, expire_time) 
  VALUES ('{$code}', '{$card_type}', {$price}, 1, NOW(), '{$expire_time}')";
  if ($db->query($sql)) $success++;
  }
  }
  echo "<script>alert('成功添加{$success}个卡密');window.location='card_manage.php';</script>";
  }
  // 卡密列表查询
  $page = $_GET['page'] ?? 1;
  $size = 20;
  $start = ($page 1) * $size;
  $cards = $db->getAll("SELECT * FROM card ORDER BY add_time DESC LIMIT {$start}, {$size}");
  $total = $db->getOne("SELECT COUNT(*) as total FROM card")['total'];
  $pages = ceil($total / $size);
  ?>
  <!-HTML页面部分 -->
  <div class="card-box">
  <h3>卡密管理</h3>
  <form method="post" action="card_manage.php">
  <input type="hidden" name="action" value="add_card">
  <div class="form-group">
  <label>卡密类型</label>
  <select name="card_type" class="form-control">
  <option value="game">游戏点卡</option>
  <option value="software">软件激活码</option>
  <option value="member">会员充值卡</option>
  </select>
  </div>
  <div class="form-group">
  <label>卡密内容(每行一个)</label>
  <textarea name="card_code" class="form-control" rows="10" required></textarea>
  </div>
  <div class="form-group">
  <label>单价(元)</label>
  <input type="number" name="price" class="form-control" step="0.01" min="0.01" required>
  </div>
  <button type="submit" class="btn btn-primary">批量添加</button>
  </form>
  <!-卡密列表展示 -->
  <table class="table table-bordered mt-3">
  <tr>
  <th>ID</th>
  <th>卡密内容</th>
  <th>类型</th>
  <th>单价</th>
  <th>状态</th>
  <th>添加时间</th>
  <th>操作</th>
  </tr>
  <?php foreach ($cards as $card): ?>
  <tr>
  <td><?= $card['id'] ?></td>
  <td><?= $card['code'] ?></td>
  <td><?= $card['type'] ?></td>
  <td><?= $card['price'] ?></td>
  <td><?= $card['status'] == 1 ? '未售出' : '已售出' ?></td>
  <td><?= $card['add_time'] ?></td>
  <td>
  <a href="?action=delete&id=<?= $card['id'] ?>" class="btn btn-danger btn-sm">删除</a>
  </td>
  </tr>
  <?php endforeach; ?>
  </table>
  <!-分页控件 -->
  <nav>
  <ul class="pagination">
  <?php for ($i=1; $i<=$pages; $i++): ?>
  <li class="page-item <?= $i == $page ? 'active' : '' ?>">
  <a class="page-link" href="card_manage.php?page=<?= $i ?>"><?= $i ?></a>
  </li>
  <?php endfor; ?>
  </ul>
  </nav>
  </div>


  五、代理系统核心逻辑


  5.1 代理层级与佣金设置
  发卡网代理系统通过多级分销模式实现收益分配,核心表结构设计如下:

  sql
  -代理表
  CREATE TABLE `agent` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL COMMENT '代理用户名',
  `password` varchar(32) NOT NULL COMMENT '密码(MD5加密)',
  `parent_id` int(11) DEFAULT 0 COMMENT '上级代理ID,0为顶级',
  `level` int(11) DEFAULT 1 COMMENT '代理等级(1-3级)',
  `rate` decimal(5,2) DEFAULT 0.10 COMMENT '佣金比例(10%即0.10)',
  `balance` decimal(10,2) DEFAULT 0.00 COMMENT '可提现余额',
  `status` tinyint(1) DEFAULT 1 COMMENT '状态(1-正常,0-禁用)',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  -佣金记录表
  CREATE TABLE `commission` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `order_id` int(11) NOT NULL COMMENT '关联订单ID',
  `agent_id` int(11) NOT NULL COMMENT '获得佣金的代理ID',
  `amount` decimal(10,2) NOT NULL COMMENT '佣金金额',
  `type` tinyint(1) DEFAULT 1 COMMENT '类型(1-直接推广,2-间接推广)',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


  5.2 代理佣金结算代码示例

  php
  <?php
  // 订单完成后自动计算并发放佣金
  function calculate_commission($order_id, $user_id) {
  global $db;
  // 获取订单信息
  $order = $db->getOne("SELECT * FROM `order` WHERE id = {$order_id}");
  if (!$order) return false;
  // 获取用户所属代理链(上级、上上级)
  $user = $db->getOne("SELECT * FROM user WHERE id = {$user_id}");
  $agent_chain = [];
  $current_agent_id = $user['agent_id']; // 用户绑定的直接代理
  // 最多获取3级代理
  for ($i=0; $i<3; $i++) {
  if ($current_agent_id == 0) break;
  $agent = $db->getOne("SELECT * FROM agent WHERE id = {$current_agent_id}");
  if ($agent) {
  $agent_chain[] = $agent;
  $current_agent_id = $agent['parent_id']; // 向上级追溯
  } else {
  break;
  }
  }
  // 发放佣金(订单金额 × 代理等级对应的比例)
  foreach ($agent_chain as $key => $agent) {
  $level = $key + 1; // 1级、2级、3级
  $commission_amount = $order['amount'] * $agent['rate'];
  // 插入佣金记录
  $db->query("INSERT INTO commission (order_id, agent_id, amount, type) 
  VALUES ({$order_id}, {$agent['id']}, {$commission_amount}, {$level})");
  // 更新代理余额
  $db->query("UPDATE agent SET balance = balance + {$commission_amount} WHERE id = {$agent['id']}");
  }
  return true;
  }
  ?>


  六、二次开发实战指南
  6.1 新增支付方式(以支付宝为例)
  1. 创建支付接口文件(/payment/alipay.php):

  php
  <?php
  class Alipay {
  // 支付宝配置参数
  private $config = [
  'app_id' => '你的APPID',
  'merchant_private_key' => '商户私钥',
  'alipay_public_key' => '支付宝公钥',
  'notify_url' => 'http://你的域名/payment/alipay_notify.php',
  'return_url' => 'http://你的域名/payment/alipay_return.php'
  ];
  // 生成支付链接
  public function create_order($out_trade_no, $total_amount, $subject) {
  require_once 'alipay-sdk/AopClient.php';
  $aop = new AopClient();
  $aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
  $aop->appId = $this->config['app_id'];
  $aop->rsaPrivateKey = $this->config['merchant_private_key'];
  $aop->alipayrsaPublicKey = $this->config['alipay_public_key'];
  $aop->format = "json";
  $aop->signType = "RSA2";
  $request = new AlipayTradePagePayRequest();
  $request->setReturnUrl($this->config['return_url']);
  $request->setNotifyUrl($this->config['notify_url']);
  $bizcontent = json_encode([
  "out_trade_no" => $out_trade_no,
  "total_amount" => $total_amount,
  "subject" => $subject,
  "product_code" => "FAST_INSTANT_TRADE_PAY"
  ]);
  $request->setBizContent($bizcontent);
  return $aop->pageExecute($request);
  }
  // 验证支付通知
  public function verify_notify($data) {
  require_once 'alipay-sdk/AopClient.php';
  $aop = new AopClient();
  $aop->alipayrsaPublicKey = $this->config['alipay_public_key'];
  return $aop->rsaCheckV1($data, null, "RSA2");
  }
  }
  ?>


  2. 在订单提交页面调用支付接口:

  php
  <?php
  if ($_POST['pay_type'] == 'alipay') {
  require_once '../payment/alipay.php';
  $alipay = new Alipay();
  $out_trade_no = 'ORD' . date('YmdHis') . rand(1000, 9999); // 生成唯一订单号
  $total_amount = $_POST['amount'];
  $subject = "虚拟商品购买-" . $out_trade_no;
  // 保存订单信息到数据库
  $db->query("INSERT INTO `order` (out_trade_no, amount, pay_type, status) 
  VALUES ('{$out_trade_no}', {$total_amount}, 'alipay', 0)");
  // 跳转到支付宝支付页面
  echo $alipay->create_order($out_trade_no, $total_amount, $subject);
  }
  ?>


  6.2 模板定制与前端美化
  通过修改`/templates`目录下的HTML文件实现界面个性化:
  替换`/templates/common/header.html`中的LOGO和导航样式
  修改`/templates/css/style.css`自定义颜色方案和布局
  新增`/templates/js/custom.js`实现交互增强(如卡密复制按钮、倒计时功能)
  七、安全加固与性能优化
  7.1 关键安全措施
  1. SQL注入防护:使用预处理语句或PDO参数绑定

  php
  // 错误示例(存在注入风险)
  $sql = "SELECT * FROM user WHERE username = '{$_POST['username']}'";
  // 正确示例(PDO预处理)
  $stmt = $pdo->prepare("SELECT * FROM user WHERE username = :username");
  $stmt->bindParam(':username', $_POST['username']);
  $stmt->execute();


  2. XSS攻击防护:输出数据时进行HTML转义

  php
  echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');


  3. 敏感数据加密:密码使用`password_hash()`加密存储

  php
  // 密码加密
  $password = password_hash($_POST['password'], PASSWORD_DEFAULT);
  // 密码验证
  if (password_verify($_POST['password'], $user['password'])) {
  // 验证通过
  }


  7.2 性能优化建议
  1. 数据库索引优化:为高频查询字段添加索引

  sql
  ALTER TABLE `order` ADD INDEX `idx_out_trade_no` (`out_trade_no`);
  ALTER TABLE `card` ADD INDEX `idx_status` (`status`);


  2. 页面缓存:使用Redis缓存热门商品和分类数据

  php
  $redis = new Redis();
  $redis->connect('127.0.0.1', 6379);
  // 尝试从缓存获取分类列表
  $category_key = 'cache:category_list';
  $categories = $redis->get($category_key);
  if (!$categories) {
  // 缓存未命中,从数据库查询
  $categories = $db->getAll("SELECT * FROM category");
  // 存入缓存(有效期1小时)
  $redis->setex($category_key, 3600, json_encode($categories));
  } else {
  $categories = json_decode($categories, true);
  }


  本文详细介绍了PHP+MySQL发卡网代理系统的部署流程、核心代码与二次开发方法。通过该系统,用户可快速搭建虚拟商品销售平台,并支持多级代理分销模式。
  

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐