彩虹易支付源码搭建全攻略:从环境配置到支付回调排障
简介彩虹易支付最新版源码是一套面向个人开发者和站长的免签支付系统一站式接入微信、QQ、支付宝等多种主流支付渠道帮助解决个人收款门槛高、接口申请难等常见问题。内置24个支付插件支持轮训支付、订单风控、随机增减金额等功能既能保障交易稳定也适合灵活的商业场景。压缩包包含1018个文件、约27.68MB核心为530个PHP文件辅以PNG图标、CSS样式、JS脚本及SQL数据库文件等前端界面与后端逻辑齐全可支撑完整支付流程。附带保姆级搭建教程从服务器与域名准备、宝塔面板环境配置、源码导入解压到数据库安装、后台初始化均有说明并给出默认账号密码即使经验不足也能按步骤完成部署。目前已有275人学习/下载适合需要快速搭建个人免签支付平台或学习支付系统原理的开发者。1. 彩虹易支付源码它到底解决什么问题谁才真正需要自建一套如果一个人站点一年流水不到几千块直接用微信支付官方商户号或第三方收款链接就够了根本不用碰易支付这类系统。真正需要自己搭一套彩虹易支付的场景是你手上同时有好几个业务站点要收钱品类多、发货逻辑各不相同受够了第三方平台按笔抽成和动不动冻结余额才愿意把支付能力掌握在自己手里。彩虹易支付本质上是一个用 PHP 写的支付聚合网关上游接支付宝、微信的官方商户接口或第三方支付通道下游给其他站点提供统一的下单、异步通知和查单 API。你搭好之后任何业务站都能通过这个网关发起支付支付结果由回调自动回到业务站订单状态不再依赖人工核对。适合手里有服务器、有合法商户资质、愿意亲自维护这套系统的站长也适合做资源站、小程序商城的技术型卖家。下面从环境准备一路写到上线验证和排障正文里的命令都在我自己的测试机上跑过。2. 搭建前准备服务器环境、PHP版本与三个容易忽略的硬前提在把源码拿到手之前建议先花十分钟把环境清单过一次。彩虹易支付的整体技术栈是 PHP MySQL Nginx任何一个版本不对都可能让你在装完之后反复排查白屏和回调失败。这一章把环境相关的几件事讲清楚后面就能放心开始装系统。2.1 服务器规格怎么定2核4G起步流量再大也不慌我自己的习惯是生产环境至少 2 核 4G云硬盘 40G 以上系统用 Debian 11 或 Ubuntu 20.04。很多新手图便宜选了 1 核 2G装上宝塔面板、MySQL 5.7 和 PHP-FPM 之后内存长期在 2G 边缘徘徊一旦有爬虫或支付回调并发进来MySQL 直接被 OOM 杀掉页面显示数据库连接错误而你毫无头绪。相比之下4G 内存能让 MySQL 的 buffer pool 多分一点PHP-FPM 也能开足进程整套系统明显更稳。如果你打算用宝塔面板选择系统镜像时直接挑带宝塔的官方镜像或者先装好系统再执行宝塔安装脚本。装完面板之后第一件事不是去下载源码而是把 PHP 版本换成 7.4 或 8.0这一步千万别省。网上流传的很多易支付源码包是基于 PHP 5.6 写的直接跑在 PHP 8 上会报一堆方法不存在、魔术方法签名不匹配的致命错误比如 mysql_* 系列函数已经被移除。我自己长期在 7.4 上跑没有遇到兼容性问题建议你优先选这个版本。2.2 PHP扩展与运行参数缺哪个会让支付链路断掉彩虹易支付运行时依赖的 PHP 扩展主要是 PDO、pdo_mysql、curl、openssl、fileinfo、mbstring、gd。宝塔安装 PHP 时默认带了一部分但你仍要在“软件商店 → PHP 设置 → 安装扩展”里确认 fileinfo 和 gd 是开启的。缺了 gd后台生成支付二维码时会直接报 “Call to undefined function imagecreatefromstring”支付流程走到一半就停住缺了 curl系统发不起对上游支付接口的请求下单接口一直超时缺了 openssl涉及 RSA 签名的回调校验全部过不了。这五个扩展一个都不能少。还要留意两个 PHP 参数post_max_size 和 upload_max_filesize。易支付系统本身不传大文件但后台如果要上传支付宝商户证书 apiclient_cert.pem 或微信支付的 apiclient_key.pem默认 2M 上限完全不够用上传会报 413 或显示成功实际没存上。我一般把这两个参数都调到 20M。另外在 PHP-FPM 配置里打开 request_slowlog_timeout 并设为 10支付回调如果超过 10 秒就能从慢日志看到具体卡在哪个文件哪一行这对排查回调超时非常有价值。2.3 域名、SSL证书与安全组入站规则三项缺一不可易支付的支付回调要求回调地址必须是 HTTPS 域名用裸 IP 走不通。所以开工之前先把域名解析到服务器 IP等待生效后用宝塔“网站 → SSL”申请一个 Let’s Encrypt 证书并开启强制 HTTPS。支付宝和微信官方支付接口在配置回调域名时会校验 HTTPS 证书证书有问题支付平台发的异步通知会直接失败你的订单会一直停在“未支付”。另外不要忽略云服务商的安全组。常见情况是安全组只放行了 80 和 22443 端口没开结果 HTTPS 根本访问不了付款页直接打不开。我一般会在安全组里放行 22、80、443以及宝塔面板管理端口默认 8888。如果用了宝塔还需要在面板安全页面把端口加进放行列表双层防火墙缺一个都不行。这个环节最容易造成“看起来没问题实际到处失败”的尴尬局面。2.4 数据库创建与编码选择utf8mb4 让订单备注不再乱码在安装系统之前数据库可以手动建好也可以在安装向导里自动建两种方式都行。我更建议手动建因为可以顺手把编码定死。以 root 身份登录 MySQL 后执行CREATE DATABASE IF NOT EXISTS epay_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER epay_userlocalhost IDENTIFIED BY 这里填一个强密码; GRANT ALL PRIVILEGES ON epay_db.* TO epay_userlocalhost; FLUSH PRIVILEGES;这套 SQL 的逻辑很简单第一行建库并约定 utf8mb4 编码后面的语句创建专用账号只把 epay_db 库的权限交给它。这里提一个很多人踩过的坑数据库密码里如果带了 # 或 这种特殊字符安装向导生成的配置文件会解析出错导致页面反复提示数据库连接失败。为了省事数据库密码最好只用大小写字母和数字别夹带特殊符号。创建完数据库后把服务器的时间时区也顺手统一执行timedatectl set-timezone Asia/Shanghai。支付系统的回调验签和订单超时判断严重依赖正确时间服务器时间偏差超过 5 分钟微信支付可能直接回执验签失败这是最容易忽略的细节。3. 源码部署与安装向导从压缩包到能打开后台的完整命令环境准备就绪后就可以开始部署。这一章尽量把每一条命令写全包括命令的作用和参数说明照着敲即可。3.1 拿到源码后先检查文件结构判断这份源码是否完整网上搜“彩虹易支付源码”能找到大量压缩包很多只是改了版本号。拿到压缩包先别急着上传在本地解压后检查以下文件是否存在这是判断源码完整性的最快方法index.php、submit.php、notify.php、api.php这几个入口文件必须存在install安装目录存在template或templates模板目录存在config配置目录存在。如果关键文件缺失后续访问会出现 404。检查完结构后注意 install 目录是否自带锁文件。部分版本在安装完成后会自动生成install.lock这个文件是安装向导判断“系统已安装”的标志。如果你再次覆盖源码后想重装需要手动删除它否则安装向导会提示“已经安装过了”。3.2 上传解压与目录权限让 PHP 能写文件但不给多余权限我习惯将源码放在/www/wwwroot/epay目录。在本地下载的 zip 包可以通过宝塔的文件管理器上传也可以直接用命令处理mkdir -p /www/wwwroot/epay cd /www/wwwroot/epay unzip epay.zip # 如果压缩包内有一层嵌套目录先展开到当前目录 mv epay/* . 2/dev/null; rmdir epay 2/dev/null chown -R www:www /www/wwwroot/epay chmod -R 755 /www/wwwroot/epay这里解释一下命令的作用mkdir 创建站点根目录unzip 解压源码mv 和 rmdir 处理压缩包内部多一层目录的常见情况把嵌套内容提到站点根目录chown -R www:www把整个目录归属给 Nginx 运行用户这样 PHP-FPM 才有权限在目录下写缓存和日志chmod 设置 755 让目录可读可执行但普通文件不开放写权限。注意不要图省事直接 chmod 777会给服务器留下安全隐患被挂马的风险高很多。3.3 Nginx 站点配置与 ThinkPHP 伪静态规则不配会直接 404大多数较新版本的彩虹易支付基于 ThinkPHP 框架开发Nginx 必须开启 pathinfo 模式或伪静态规则否则所有非根路径都会 404。如果你用宝塔操作路径是“网站 → 添加站点 → 域名填你的域名 → 根目录指向 /www/wwwroot/epay → 伪静态选择 thinkphp”宝塔会自动生成 rewrite 规则。手写 Nginx 配置的话核心 location 这样写server { listen 80; server_name pay.example.com; root /www/wwwroot/epay/public; index index.php index.html; location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s$1 last; break; } } location ~ \.php$ { include fastcgi_params; fastcgi_pass unix:/run/php/php7.4-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } }这段配置里最关键的是root /www/wwwroot/epay/public很多人装完打不开页面就是因为根目录指错了指到了项目外层导致框架入口没有被正确加载。如果你的源码没有 public 目录、入口直接在项目根目录root 就要改成/www/wwwroot/epay。具体看你手里这份源码的实际结构不要盲目照抄。伪静态规则的作用是把/order/123这类 URL 交给 index.php 路由解析而不是交给 Nginx 去找一个不存在的文件。如果不配打开订单页会直接 404这类问题在宝塔环境里尤其常见。3.4 执行安装向导建库、管理员信息与配置文件生成站点和伪静态都配置好之后在浏览器访问你的域名应该能看到系统首页或安装向导。多数版本的安装入口是/install.php或/install/index.php如果首页直接显示安装引导按引导操作即可。安装向导会依次要求填写数据库地址默认 localhost、数据库名、数据库用户名、数据库密码以及管理员账号和管理员密码。安装完成后有一个重要的安全操作删除服务器上的 install 目录。我在生产环境中会把/www/wwwroot/epay/install整个目录删掉避免别人通过访问安装页面重置系统。这个习惯我保持了很久也建议你保留。接着登录后台。常见的后台地址是/index.php/admin/index/login或/admin.php取决于版本。用刚才设置的管理员账号登录后第一件事不是去配支付接口而是进入系统设置把站点名称、回调域名、默认费率等基础信息检查一遍然后在后台点一次“清除缓存”。框架的 runtime 缓存如果不清理可能出现修改配置后不生效的怪问题。4. 后台初始配置与支付通道接入下单测试到回调落库系统装完只是开始能不能真正收到钱取决于后台配置和一次完整的回调链路验证。这一章把最核心的三个环节讲透通道配置完成后一定要跑通一个 0.01 元的测试单。4.1 基础设置与商户号创建一个商户、一套密钥对应一个业务站进入后台后先打开“系统设置”把站点名称改掉回调域名填上你的完整域名。回调域名必须和 SSL 证书绑定的域名一致否则支付平台回调时会校验失败。接着在“商户列表”里新建一个商户填写商户名和备注提交后系统会生成商户 IDpid和商户密钥key。如果你只有一个业务站就建这一个商户如果有多个独立业务站建议一个站点对应一个商户号方便日后分别查看订单和结算。商户密钥是签名计算的核心材料不要明文写在网页源码里。密钥万一丢失可以在后台重新生成但一旦重新生成老签名立即失效所有正在运行的业务站都必须同步更新密钥。4.2 支付通道配置官方直连与上游易支付接口两条路支付通道配置决定系统向哪个上游发起真实扣款常见做法有两种。第一种是官方直连适用于有支付宝或微信官方商户号的场景。以支付宝为例需要在通道设置里填写 app_id、应用私钥、支付宝公钥、回调地址并把证书文件上传到后台。这种方式的优势是资金直接进入你自己的账户链路短、费率透明劣势是需要企业资质、申请周期长。第二种是接入上游易支付通道适合已有现成合作方的场景。你需要从上游拿到网关地址、商户号、密钥三个信息然后在后台添加一个支付通道类型选择“易支付”填好这三个信息。这样当用户发起支付时系统会把请求转发给上游由上游完成实际扣款再把结果回调回来。这里的“易支付”指的是它对接的第三方支付接口规范不是彩虹易支付本身两个概念容易搞混先把这层关系理清。无论选哪种配置好后都要做一个 0.01 元测试订单。支付宝和微信都要求单笔金额大于等于 0.01所以这是全流程唯一需要花真钱的地方也是最低成本的验证方式。不要直接上真实订单而跳过测试否则很容易在支付成功后才发现问题。4.3 构造下单请求与签名计算把 API 调通的动手环节配置完成后我们用一个 curl 请求模拟业务站发起支付。易支付体系通用的下单接口是submit.php异步通知接口是notify.php。先写一段 PHP 脚本构造请求参数并计算签名?php $pid 1001; // 后台商户列表里的商户ID $key 你的商户密钥; // 从后台复制别硬编码在业务代码里 $params [ pid $pid, type alipay, // 支付方式: alipay / wxpay / qqpay out_trade_no TEST . time(), // 业务站自己的订单号 notify_url https://pay.example.com/notify.php, return_url https://pay.example.com/return.php, name 测试商品, money 0.01, ]; // 签名规则: 除去 sign、sign_type 和空值按参数名ASCII升序排列 ksort($params); $link ; foreach ($params as $k $v) { if ($v || $k sign || $k sign_type) { continue; } $link . $k . . $v . ; } $link trim($link, ); $sign md5($link . $key); $params[sign] $sign; $params[sign_type] MD5; // 拼接完整URL发起请求 $url https://pay.example.com/submit.php? . http_build_query($params); echo $url . PHP_EOL;这段代码的核心是签名生成规则也就是易支付接口通用的那个逻辑参与签名的参数按名称 ASCII 码升序排列用keyvalue加连接成字符串末尾拼上商户密钥再做一次 MD5。代码里 ksort 是做字典序排序trim 去掉末尾多余的 notify_url指向本地系统的 notify 入口支付平台在用户完成付款后会向这个地址发异步通知。把脚本跑起来得到完整 URL 后粘贴到浏览器访问应该会跳转到对应的支付页面或二维码页。此时不做任何付款如果数十秒后看不到二维码或跳转失败说明 submit 请求本身有问题回头查通道配置和 URL 参数。确认支付页正常以后用支付宝或微信扫码付掉这 0.01 元然后观察两个地方浏览器跳转回 return_url 后订单应立即显示已支付同时进入易支付后台“订单列表”确认订单状态变为已支付。notify 的异步通知日志可以在 runtime 日志里看到具体路径通常是/www/wwwroot/epay/runtime/log/日期.log。5. 搭建常见问题排查五条高频踩坑现象、原因与解决以下几条是我在多个交付项目里攒下的血泪经验每条都按现象、原因、解决三步写清楚遇到类似问题可以直接对照处理。5.1 安装界面白屏PHP 错误被完全隐藏现象浏览器访问安装地址页面一片空白查看源代码没有任何输出F12 里的响应状态是 200响应体却是空的。原因PHP 配置把 display_errors 关闭了程序中的致命错误没有输出到页面只有日志里有记录。多数情况是高版本 PHP 不兼容老代码某个函数被移除比如 php7.0 之后 mysql_* 函数被彻底删除老代码一执行就 fatal error。解决在宝塔“PHP 设置 → 配置修改”里临时打开 display_errors 设为 On同时把 error_reporting 改成 E_ALL保存后重载 PHP。再次刷新安装页屏幕上会直接显示错误信息。看到具体错误后再决定改版本还是改代码。我自己处理过多次这类问题后最干脆的办法是直接把 PHP 降到 7.4因为易支付的大多数版本就是在 7.4 上验证过的不要在 8.1 兼容性问题上挣扎。5.2 支付成功但订单状态一直显示“未支付”现象用户完成付款支付页面跳转正常但易支付后台和业务站的订单状态都没变。原因异步通知链路断了。支付平台在扣款后调用 notify_url这个地址要么被防火墙挡了要么 SSL 证书过期导致带证书的请求失败要么 Nginx 重定向规则把 POST 请求转成了 302导致回调方收到非 success 响应。还有一种常见情况是服务器时区不准支付平台回调数据里的时间戳和本地时间对不上验签通过但订单状态判断异常。解决先确认服务器时间与标准时间偏差不超过 5 分钟然后在支付平台商户后台查看当笔交易的通知记录看发送了几次、每次的响应码是什么接着手动用 curl 模拟 POST 到 notify 地址curl -X POST -d ... https://pay.example.com/notify.php观察返回内容。正常响应是纯文本success如果返回其他内容说明系统在处理逻辑里抛了异常。排查时可以临时打开日志记录把 notify 收到的原始请求打出来对照。5.3 签名总是验不过怎么算都觉得没错现象调用 submit.php 或 notify.php系统一直返回签名错误。原因签名规则没对齐。易支付体系的签名规则在不同版本有几处容易打架的细节参与签名的参数是否包含 sign_type排序时是否过滤了空参数MD5 输出后是保留小写还是转成大写拼接字符串末尾是否少了 key商户密钥 这一段。任何一处不一致结果都是一个无效签名。解决把本地计算 sign 的脚本和系统的调试输出放在一起对比。先在后台开启调试模式或在控制文件里临时打印系统计算出来的签名再把两边逐字符对齐。我的经验是先统一成最通用的规则排除 sign 和 sign_type剩余参数 ksort 后按 keyvalue 用 连接末尾拼接 key 参数的值md5 输出 32 位小写。如果仍然失败检查是不是复制密钥时把空格或不可见字符带进去了。5.4 回调请求进不来Nginx 日志里完全没有记录现象上游通知日志显示它已经发了请求且响应超时但你服务器的 access.log 里根本没有对应条目。原因被服务器防火墙或安全组策略拦截。许多云主机默认安全组只放行了 22 和部分端口而通知回调里来自支付平台的源 IP 可能被误判为扫描 IP被宝塔的 DDOS 保护或系统防火墙拦截。另一种情形是宝塔面板的 IP 或 UA 限制规则误伤把支付平台异步通知的请求特征给 ban 了。解决进入宝塔“安全”页面检查拦截日志里是否有支付平台来源 IP 的直接命中有就在 IP 白名单里加进去。同时去云控制台确认安全组规则入方向保证 80 和 443 放行。如果做了 UA 拦截把支付平台常用的 UA 加到白名单。整个过程操作不难麻烦的是你要先想到去看防火墙日志而不是盯着应用日志干瞪眼。5.5 伪静态配置不对订单页 404 二维码出不来现象首页能打开但访问/order/{id}或后台某些列表页直接 404。原因Nginx 没有加载 ThinkPHP 框架的 rewrite 规则请求交给静态文件查找了找不到文件就返回 404。有些用户误选成了 WordPress 或其他框架的伪静态规则导致 pathinfo 解析失败。另一种相关问题是入口文件被配置到 public 子目录但 root 没跟上所有路由都失效。解决在宝塔站点“伪静态”里重新选择 thinkphp 模板保存后刷新页面。如果仍 404检查站点根目录是否指向 public 目录以及 index.php 是否存在。改完配置后记得在系统后台清理 runtime 缓存否则路由缓存仍按旧配置运行。6. 上线前的收尾工作对账脚本、网站备份与一条“后悔药”习惯系统能正常收钱了正式运营前还有三件事值得做好。第一件是定时对账。支付回调和人工确认之间永远可能因为网络问题出现漏单所以我每天凌晨让服务器自动拉一遍订单汇总和数据库里的已支付订单核对。#!/bin/bash # 每天2点执行对账导出近24小时已支付订单 mysql -uepay_user -p密码 epay_db -e SELECT out_trade_no, money, status, create_time FROM orders WHERE status1 AND create_time DATE_SUB(NOW(), INTERVAL 24 HOUR); \ /root/epay_check_$(date %F).log 21这段脚本把前一天状态为已支付的订单导出成文件你只需要核对字段即可。cron 里写一行0 2 * * * /root/epay_check.sh就能每天自动执行。第二件是备份。我一般直接在宝塔计划任务里加两项每周末全量备份数据库每月备份站点目录。命令行方式也给你参考mysqldump -uepay_user -p密码 epay_db | gzip /backup/epay_db_$(date %F).sql.gz tar czf /backup/epay_site_$(date %F).tar.gz -C /www/wwwroot epay恢复时先解压 tar 包覆盖站点目录再用mysql -uepay_user -p密码 epay_db epay_db_xxx.sql导回数据库。只要目录和数据库两份备份在手任何一次改错代码后都能把系统恢复到出事之前。第三件事是我这些年攒下的一条习惯改代码之前先备份改完先清缓存再测试测试跑完再删备份。听起来像废话但它真的救过我。有一次我在二次开发支付通知模块时删掉了一行看起来多余的日志代码结果导致整条回调链路异常用户订单全部收不到通知幸好有当日备份花十分钟恢复了。从那以后“先备份、再改动、后测试”成了我碰所有支付系统的默认动作。这套流程希望能帮到你。本文还有配套的精品资源点击获取