
简介这是一套2024年最新发布的彩虹易支付PHP网站源码面向Web开发者、中小型网站运营者及PHP后端学习者用于快速搭建安全、可定制的在线支付对接平台。资源包含1040个文件主体为527个PHP业务逻辑与接口文件辅以274个PNG图标资源、60个CSS样式文件、45个JS交互脚本及31个JPG素材另有SQL数据库结构、SSL证书.cer/.pem、配置文档.md/.yml和前端字体资源.woff/.ttf整体包体仅8.85MB轻量且结构完整。目前已有635人学习下载说明其在实际部署场景中具备较高验证度。用户可直接部署运行获得含商户后台、支付网关、订单管理、多通道对接如微信/支付宝模拟及HTTPS证书集成的全功能支付系统雏形并通过清晰的目录划分如css/app.min.css、js/bootstrap.min.js等快速理解前后端协作逻辑与安全配置要点。1. 彩虹易支付不是「支付接口」而是一套可本地部署的 PHP 收款中转系统很多人第一次看到“彩虹易支付”会误以为是类似支付宝或微信的官方支付通道其实它本质是一个轻量级、面向中小商户的 PHP 收款聚合前端 后端管理框架。它的核心价值不在于对接银行或持牌机构而在于把微信扫码、支付宝转账、QQ红包等离线收款方式通过网页表单、二维码生成、订单状态轮询和后台手动核销封装成一套可快速上线的收款闭环。2024 最新版源码已适配 PHP 8.0 环境移除了旧版中依赖track_errors的错误处理逻辑避免出现fatal error: directive track_errors is no longer available in php并重构了 CSS 加载顺序解决多版本style.css冲突导致的样式错乱问题。适合个人站长、线下小店、培训课程报名页、小型活动收款页等场景——不需要申请支付牌照也不依赖第三方 SDK只要能跑 PHP MySQL 的服务器宝塔、XAMPP、Docker 均可30 分钟内就能搭起一个带订单管理、二维码下载、资金流水导出的收款页面。这套源码不是“黑产工具”也不是“绕过监管”的方案它严格遵循“用户主动扫码付款 → 商户后台手动确认 → 订单状态更新”的离线资金流逻辑所有交易数据仅存于本地数据库不触碰任何支付清结算链路。如果你正在为一个临时活动页、内部报名系统或测试环境找一个免审核、免签约、纯前端可控的收款展示方案它比写个静态 HTML 手动记账本更可靠但若你需要实时到账、分账、电子发票或对接银联它就不在适用范围内。技术栈上它用原生 PHP无 Laravel/ThinkPHP 框架、MySQL 5.7、Bootstrap 4.6 前端对 PHP 运算符、数组对象处理、JSON 序列化中文支持做了兼容性加固也规避了php json 转string 报错[object object]这类常见前端传参陷阱。提示该源码不含任何支付通道的 API 密钥或商户号配置项所有“支付成功”状态均由管理员在后台点击【核销】触发属于典型的“伪实时”收款流程。部署前请确认你已理解其离线核销机制避免误用于需强一致性资金流的业务场景。2. 部署前必须完成的三项环境校验与配置剥离2.1 PHP 版本与扩展检查避开track_errors和mysql_*兼容性雷区彩虹易支付 2024 版明确要求 PHP ≥ 8.0且禁用已被移除的track_errors指令常见于旧版php.ini中。若你在宝塔面板或本地 XAMPP 环境中启动时报错Fatal error: directive track_errors is no longer available in php说明 PHP 配置文件仍保留废弃指令。需定位到对应 PHP 版本的php.ini文件宝塔路径通常为/www/server/php/80/etc/php.ini执行以下操作# 1. 备份原配置 cp /www/server/php/80/etc/php.ini /www/server/php/80/etc/php.ini.bak # 2. 删除 track_errors 行注意不是注释是彻底删除 sed -i /track_errors/d /www/server/php/80/etc/php.ini # 3. 确保必需扩展已启用尤其 mysqli 和 gd grep -E ^(extension|;extension) /www/server/php/80/etc/php.ini | grep -E mysqli|gd|curl|json|mbstring输出应包含extensionmysqli.so、extensiongd.so等行且无;开头的注释符号。若mysqli被注释需取消注释并重启 PHP 服务# 取消 mysqli 扩展注释使用 sed 自动替换 sed -i s/;extensionmysqli.so/extensionmysqli.so/g /www/server/php/80/etc/php.ini # 重启 PHP宝塔命令 /www/server/php/80/bin/php-fpm -t systemctl reload php-fpm-80注意该源码不使用已废弃的mysql_*函数族全部改用mysqli_*或 PDO 方式连接数据库。若你从旧版迁移需检查config.php中数据库连接代码是否含mysql_connect()如有必须替换为new mysqli()实例化方式否则将触发Call to undefined function mysql_connect()致命错误。2.2 数据库初始化与敏感配置剥离从sand.cer到businessgate.cer的密钥逻辑项目正文列出的sand.cer和businessgate.cer并非 SSL 证书而是彩虹易支付自定义的“环境标识文件”用于区分沙箱sandbox与生产business模式。它们本质是空文件或含简单字符串的文本但源码中通过file_exists()判断来切换配置// config.php 片段 if (file_exists(sand.cer)) { $db_host 127.0.0.1; $db_name caihong_sandbox; $debug_mode true; } else if (file_exists(businessgate.cer)) { $db_host localhost; $db_name caihong_prod; $debug_mode false; } else { die(请放置 sand.cer 或 businessgate.cer 以选择运行环境); }这意味着部署时你必须手动创建其中一个文件不能直接上传解压即用。推荐首次部署用sand.cer# 进入网站根目录如 /www/wwwroot/pay.example.com touch sand.cer # 创建沙箱数据库MySQL 命令行 mysql -u root -p -e CREATE DATABASE caihong_sandbox DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;接着导入 SQL 结构文件通常位于install/或sql/目录下名为database.sql或init.sqlmysql -u root -p caihong_sandbox /www/wwwroot/pay.example.com/install/database.sql提示database.sql中的admin表包含默认后台账号密码通常为明文123456或经md5()加密的e10adc3949ba59abbe56e057f20f883e。首次登录后务必在后台修改避免被暴力扫描。不要在config.php中硬编码数据库密码应通过宝塔面板的「数据库管理」功能设置独立账号并在config.php中填入该账号而非 root。2.3 CSS 与静态资源加载冲突排查解决style.css多版本覆盖问题项目正文列出多个 CSS 文件app.min.css、bootstrap.min.css、app.css、style.css、common_1107.css、animate.min.css、style.css重复两次。这并非冗余而是不同模块的样式层叠策略——bootstrap.min.css提供基础栅格与组件animate.min.css控制动画效果common_1107.css是 2024 年新增的响应式断点适配而两个style.css分别位于/static/css/和/public/css/后者优先级更高。实际加载顺序由index.php或header.php中link标签顺序决定。若发现页面布局错乱如按钮变形、二维码溢出容器需检查 HTML 源码中 CSS 引入顺序是否符合以下优先级!-- 必须按此顺序引入 -- link relstylesheet href/static/css/bootstrap.min.css link relstylesheet href/static/css/animate.min.css link relstylesheet href/static/css/app.min.css link relstylesheet href/public/css/common_1107.css link relstylesheet href/public/css/style.css !-- 此文件最终覆盖所有样式 --若style.css被提前加载会导致common_1107.css中的.qr-code-container { max-width: 100vw; }生效失败。修复方法是在header.php中调整link位置或直接删除/static/css/style.css保留/public/css/style.css即可。3. 核心收款流程的三步代码级实现与参数控制3.1 二维码生成逻辑基于php图片生成能力的动态渲染彩虹易支付的收款二维码并非调用外部 API而是使用 PHP 原生 GD 库 qrcode类通常位于/include/qrcode.php在服务端实时生成 PNG。关键参数控制在pay.php或create_qr.php中// create_qr.php 核心片段 require_once ./include/qrcode.php; $amount $_GET[amount] ?? 0.01; // 金额单位元支持小数点后两位 $remark $_GET[remark] ?? 未备注; // 订单备注用于后台显示 $trade_no PAY . date(ymdHis) . rand(1000, 9999); // 本地生成交易号 // 生成微信/支付宝兼容的收款链接格式weixin://... 或 alipay://... $qr_content weixin://wxpay/bizpayurl?pr . urlencode($trade_no) . amount . $amount; // 创建 QRCode 实例参数内容、纠错等级L/M/Q/H、尺寸像素、边距 $qr new QRcode(); $qr-png($qr_content, false, QR_ECLEVEL_L, 8, 2); // 输出为 PNG浏览器直接渲染 header(Content-Type: image/png); exit();其中QR_ECLEVEL_L表示最低纠错等级约 7% 容错适合打印场景8是每个模块module的像素大小2是边框宽度单位module。若需适配手机端扫码建议将8改为122改为4生成更大更清晰的二维码$qr-png($qr_content, false, QR_ECLEVEL_M, 12, 4); // 中等纠错 更大尺寸注意GD 库必须启用且php.ini中disable_functions不能包含imagepng、imagecreate等函数。若报错Call to undefined function imagecreate()需在宝塔「PHP 设置」→「禁用函数」中移除相关项并重启 PHP。3.2 订单状态轮询机制用php接口数组对象实现无刷新查询前端页面通过 AJAX 轮询check_order.php接口判断用户是否已完成扫码付款。该接口返回标准 JSON 数组对象结构如下{ code: 200, msg: 支付成功, data: { status: success, trade_no: PAY2405201030123456, pay_time: 2024-05-20 10:30:45, amount: 19.90 } }check_order.php的核心逻辑是查询数据库中该trade_no的status字段// check_order.php $trade_no $_GET[trade_no] ?? ; if (empty($trade_no)) { echo json_encode([code400, msg缺少 trade_no]); exit; } // 使用 mysqli 防注入查询非拼接 SQL $stmt $mysqli-prepare(SELECT status, pay_time, amount FROM orders WHERE trade_no ?); $stmt-bind_param(s, $trade_no); $stmt-execute(); $result $stmt-get_result(); if ($result-num_rows 0) { $row $result-fetch_assoc(); if ($row[status] success) { echo json_encode([ code200, msg支付成功, data[ statussuccess, trade_no$trade_no, pay_time$row[pay_time], amount$row[amount] ] ]); } else { echo json_encode([code201, msg等待支付, data[statuspending]]); } } else { echo json_encode([code404, msg订单不存在]); }前端 JavaScript 轮询间隔设为 3 秒最大重试 20 次共 60 秒超时后提示“请手动联系客服核对”。此设计避免了长连接或 WebSocket 的复杂度符合轻量级定位。3.3 后台手动核销的 PHP 实现php错误处理与事务边界控制管理员在后台点击【核销】按钮时触发admin/verify.php其核心是开启 MySQL 事务确保订单状态更新与操作日志写入原子性// admin/verify.php $trade_no $_POST[trade_no] ?? ; if (empty($trade_no)) { die(json_encode([code400, msg参数错误])); } // 开启事务 $mysqli-begin_transaction(); try { // 1. 更新订单状态为 success $stmt1 $mysqli-prepare(UPDATE orders SET status ?, pay_time NOW() WHERE trade_no ? AND status ?); $stmt1-bind_param(ssi, $status, $trade_no, $pending_status); $status success; $pending_status pending; $stmt1-execute(); // 2. 写入操作日志 $admin_id $_SESSION[admin_id] ?? 0; $stmt2 $mysqli-prepare(INSERT INTO admin_log (admin_id, action, target, created_at) VALUES (?, verify_order, ?, NOW())); $stmt2-bind_param(is, $admin_id, $trade_no); $stmt2-execute(); $mysqli-commit(); echo json_encode([code200, msg核销成功]); } catch (Exception $e) { $mysqli-rollback(); error_log(核销失败 trade_no{$trade_no}: . $e-getMessage()); echo json_encode([code500, msg核销失败请重试]); }提示若admin_log表不存在需在database.sql中补全建表语句。事务回滚能防止“订单已更新但日志丢失”的数据不一致。error_log()记录便于排查php 错误处理场景下的异常分支。4. 宝塔环境下 Nginx 伪静态与跨域配置实操4.1 Nginx 重写规则让php路由更干净避免?gwapmvoteavxsendzid类长 URL彩虹易支付默认使用index.php?gpaymorderacreate这类传统 GET 参数路由但宝塔用户常希望启用 PATH_INFO 模式使 URL 变为/pay/order/create。需在宝塔「网站」→「设置」→「配置文件」中于location ~ \.php$块内添加fastcgi_param并启用重写# 在 server {} 块内添加 location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s$1 last; } } location ~ \.php$ { # 原有 fastcgi_pass 配置保持不变 fastcgi_pass unix:/tmp/php-cgi-80.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 关键传递 PATH_INFO 给 PHP fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_split_path_info ^(.\.php)(/.)$; }保存后重启 Nginx。此时 PHP 可通过$_SERVER[PATH_INFO]获取/pay/order/create再用explode(/, trim($_SERVER[PATH_INFO], /))解析模块、控制器、动作替代原始$_GET[g]、$_GET[m]、$_GET[a]。4.2 跨域请求配置解决php跨域jsonp之外的现代方案若前端 H5 页面如 Vue SPA与彩虹易支付后端域名不同需在 Nginx 中显式允许跨域location ~ \.php$ { # ... 其他 fastcgi 配置 ... # 添加跨域头生产环境请限制 origin add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods GET, POST, OPTIONS, DELETE; add_header Access-Control-Allow-Headers DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization; add_header Access-Control-Expose-Headers Content-Length,Content-Range; # 预检请求直接返回 204 if ($request_method OPTIONS) { add_header Access-Control-Max-Age 1728000; add_header Content-Type text/plain charsetUTF-8; add_header Content-Length 0; return 204; } }注意Access-Control-Allow-Origin: *仅适用于开发或内网环境。生产环境应替换为具体域名如https://your-h5-domain.com否则存在安全风险。此配置替代了老旧的php跨域jsonp方案支持fetch和axios的现代 Promise 接口。5. 二维码防失效与订单自动清理的进阶技巧5.1 二维码有效期控制用php时间戳实现 15 分钟自动失效默认情况下生成的二维码永久有效但实际业务中需防范重复扫码或过期支付。可在create_qr.php中加入时间戳签名与校验// 生成带时间戳的 trade_no15 分钟有效期 $timestamp time(); $trade_no PAY . date(ymdHis) . rand(1000, 9999) . _ . $timestamp; // 存入数据库时同时记录 create_time $stmt $mysqli-prepare(INSERT INTO orders (trade_no, amount, remark, create_time, status) VALUES (?, ?, ?, ?, ?)); $stmt-bind_param(sdssi, $trade_no, $amount, $remark, $timestamp, $pending_status); $stmt-execute(); // 前端轮询时check_order.php 需验证时间 // SELECT * FROM orders WHERE trade_no ? AND status pending AND create_time ? // $expire_time time() - 900; // 15*60 秒这样即使二维码被截图保存超过 15 分钟后check_order.php查询将返回“订单不存在”引导用户重新发起支付。5.2 订单自动清理脚本用php队列思想做定时归档长期运行会产生大量pending订单占用数据库空间。可编写cleanup_orders.php脚本通过宝塔计划任务每日凌晨执行?php // cleanup_orders.php require_once config.php; // 加载数据库配置 // 归档 7 天前的 pending 订单到 history 表 $seven_days_ago date(Y-m-d H:i:s, time() - 7 * 24 * 3600); $stmt $mysqli-prepare(INSERT INTO orders_history SELECT * FROM orders WHERE status pending AND create_time ?); $stmt-bind_param(s, $seven_days_ago); $stmt-execute(); // 删除已归档的 pending 订单 $stmt $mysqli-prepare(DELETE FROM orders WHERE status pending AND create_time ?); $stmt-bind_param(s, $seven_days_ago); $stmt-execute(); echo 已清理 . $mysqli-affected_rows . 条过期 pending 订单\n; ?在宝塔「计划任务」中添加任务类型Shell 脚本运行周期每天 02:00脚本内容/usr/bin/php /www/wwwroot/pay.example.com/cleanup_orders.php /www/wwwroot/pay.example.com/logs/cleanup.log 21此方案模拟了php队列的异步清理思想避免在用户支付时同步执行耗时操作提升前台响应速度。5.3 敏感文件访问控制屏蔽php源码泄露风险项目中的config.php、database.sql、.env如有等文件一旦被直接访问将导致数据库凭据泄露。需在 Nginx 配置中禁止访问# 在 server {} 块内添加 location ~ ^/(config|database|\.env|\.git|\.svn) { deny all; } location ~ \.(bak|sql|log|sh|bash|ini|inc|swp|swo|git|svn) { deny all; }同时检查robots.txt是否已屏蔽敏感路径User-agent: * Disallow: /config.php Disallow: /install/ Disallow: /sql/ Disallow: /logs/这些措施能有效防御php 代码审计中常见的路径遍历与源码泄露攻击向量。本文还有配套的精品资源点击获取