简介:本资源是一款专为彩虹易支付系统定制的USDT-TRC20收款插件,面向使用原版彩虹易支付的开发者与站长,解决其接入稳定、去中心化加密货币收款能力的问题,尤其适用于需绕过第三方托管、直收至自有TRON钱包的跨境支付或数字商品交易场景。压缩包共6个文件(9KB),含3个核心PHP文件(usdt_plugin.php负责插件注册、pay.php处理支付请求、cron.php实现订单状态轮询)、1份README.md说明文档、1个HTML 404页面及1份LICENSE授权文件,结构精简,部署路径明确。已有247人学习下载,体现了中小开发者对轻量级USDT收款方案的实际需求。用户可直接获得开箱即用的TRC20收款能力,包含自动汇率获取(支持AUTO调用外部接口)与手动配置选项、可调超时机制(默认20分钟),以及宝塔环境下基于PHP CLI的回调监控脚本配置指南,显著降低部署门槛与运维复杂度。
1. 彩虹易支付 USDT-TRC20 插件:不走第三方、直充钱包的收款闭环,到底稳不稳?
你有没有试过在彩虹易支付后台加一个“USDT 收款”选项,填完地址、密钥、回调地址,结果用户扫码付了 TRC20-USDT,钱却卡在中间商账户里,三天才到账,还扣 0.5% 手续费?这不是玄学,是绝大多数现成插件的默认路径。而这个epay_usdt-main插件,从文件结构到 cron 调度逻辑,全程绕开任何中转平台——用户扫你生成的 TRC20 地址付款,区块确认后(通常 1~3 分钟),资金直接落进你本地 TRON 钱包,后台订单状态同步更新,连「代收账户」字段都不存在。它不是把 USDT 当作“虚拟商品”来卖,而是真正在 Web 支付层打通 TRON 链的原生资产收付。适合中小电商、知识付费、会员系统等需要快速回款、拒绝资金池沉淀的场景;不适合高频小额(<1 USDT)或需法币自动结算的业务。核心价值就一条:链上可验证、到账即终局、无中间托管风险。如果你正被“USDT 到账慢”“回调失败率高”“密钥配置像猜谜”折磨,这个插件不是锦上添花,是换掉整条支付链路的底层替换方案。
2. 插件结构与部署:从 rar 解压到后台启用,6 步落地不翻车
2.1 文件清单与角色分工:每个文件为什么不能少?
epay_usdt-main.rar是压缩包,解压后得到epay_usdt-main/目录,其下文件并非随意堆砌,而是构成完整支付闭环的最小必要单元:
| 文件名 | 类型 | 核心职责 | 关键依赖 |
|---|---|---|---|
pay.php | PHP 入口脚本 | 渲染支付二维码、生成 TRC20 地址、写入待确认订单 | usdt_plugin.php、TRON RPC 接口 |
usdt_plugin.php | 主插件类 | 实现彩虹易支付 SDK 的PayPlugin接口,定义getPayUrl()、verifyCallback()等方法 | cron.php、LICENSE |
cron.php | 定时轮询脚本 | 每分钟主动查询 TRON 链上该地址的最新交易,比对订单哈希,触发状态更新 | phpCLI 环境、TRON JSON-RPC 节点 |
LICENSE | 许可声明 | MIT 协议,允许商用但需保留版权声明 | — |
README.md | 配置指南 | 包含密钥说明、汇率设置、宝塔计划任务示例 | — |
404.html | 静态兜底页 | 防止未授权访问插件目录时暴露路径 | — |
提示:
pay.php和usdt_plugin.php必须放在同一级目录,且usdt_plugin.php中的类名UsdtPlugin与彩虹易支付框架约定强绑定,改名会导致后台无法识别插件。
2.2 部署四步法:重命名、上传、刷新、配置缺一不可
部署不是简单复制粘贴,每一步都有隐性校验点:
解压并重命名
unzip epay_usdt-main.rar mv epay_usdt-main usdt注意:必须重命名为
usdt(全小写),这是彩虹易支付插件加载机制的硬编码规则——框架会扫描plugins/下所有子目录名,匹配usdt后缀才加载usdt_plugin.php。若命名为usdt_trc20或USDT,后台将完全不可见。上传至正确路径
将整个usdt/目录上传至网站根目录下的plugins/子目录(如/www/wwwroot/yourdomain.com/plugins/usdt/)。确保usdt/目录权限为755,内部.php文件为644。常见错误是上传到plugins/usdt/usdt/(多套一层),导致usdt_plugin.php路径错位。后台强制刷新插件列表
登录彩虹易支付后台 → 【系统】→【插件管理】→ 点击右上角「刷新插件」按钮(非页面刷新)。此时应立即出现「USDT 收款」插件条目,状态为「未启用」。若无显示,请检查usdt/目录内是否存在usdt_plugin.php且首行有<?php声明。启用并配置通道参数
点击「启用」→ 进入【支付通道】→ 「添加新通道」→ 支付方式选择「USDT 收款」→ 填写:- 商户私钥(必填):你的 TRON 钱包私钥(十六进制格式,64 位,绝不可泄露)
- TRON 钱包地址(必填):对应私钥的 TRC20 接收地址(以
T开头) - RPC 节点地址(必填):推荐
https://api.trongrid.io(需注册获取 API Key)或自建节点 - 汇率设置(必填):填
AUTO或具体数值(如7.25)
2.3 密钥与汇率配置:为什么AUTO不等于“全自动”
插件中的汇率字段看似简单,实则决定资金安全边界:
AUTO模式:插件在pay.php中调用file_get_contents('https://www.lxsjfx.cn/286.html')获取网页源码,再用正则preg_match('/USD.*?(\d+\.\d+)/', $html, $m)提取第一个浮点数。⚠️ 风险点:该网址非官方汇率 API,HTML 结构可能随时变动;若网页返回 404 或超时,
pay.php会 fallback 到默认1.0,导致用户付 100 USDT 却只记账 100 CNY,造成资损。手动模式:填入大于 0 的浮点数(如
7.25),插件直接使用该值计算人民币金额。✅ 推荐做法:在服务器定时任务中每日凌晨 3 点调用权威 API(如
https://api.coingecko.com/api/v3/simple/price?ids=usd-coin&vs_currencies=cny)写入本地缓存文件,pay.php读取该文件而非远程网页。
// 示例:安全的汇率获取逻辑(替换 pay.php 中原有代码) $rate_file = __DIR__ . '/usdt_rate.cache'; if (file_exists($rate_file) && (time() - filemtime($rate_file)) < 3600) { $rate = (float)file_get_contents($rate_file); } else { $json = file_get_contents('https://api.coingecko.com/api/v3/simple/price?ids=usd-coin&vs_currencies=cny'); $data = json_decode($json, true); $rate = $data['usd-coin']['cny'] ?? 7.25; file_put_contents($rate_file, (string)$rate); }3. 回调与轮询机制:为什么必须配 cron,以及它怎么替代传统 webhook
3.1 TRC20 支付的天然缺陷:没有可靠 webhook,只能靠轮询
TRON 网络本身不提供支付成功事件的主动推送服务(即无类似微信支付的notify_url)。用户扫码付款后,交易广播到链上,但你的服务器无法被 TRON 节点主动通知。因此,所有合规的 TRC20 收款方案都必须实现「主动轮询」:定期查链上该地址的最新交易,比对订单号(通常嵌入在交易备注或合约调用数据中),确认到账后更新订单状态。
本插件的cron.php就是这个轮询引擎。它不是辅助功能,而是唯一可信的状态同步来源。忽略它,等于关闭了整个支付闭环——用户付款后订单永远卡在「待支付」。
3.2 cron.php 执行逻辑拆解:三步完成一次链上核验
cron.php的执行流程高度精简,聚焦链上验证:
读取待处理订单
从数据库查询order_status = 0(待支付)且pay_type = 'usdt'的订单,限制每次最多处理 50 条(防 DB 锁表)。批量查询 TRON 链交易
构造 TRON JSON-RPC 请求:{ "jsonrpc": "2.0", "method": "tron_getTransactionsByAddress", "params": ["Txxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 0, 20], "id": 1 }注意:
tron_getTransactionsByAddress是 Trongrid 提供的扩展方法,标准 TRON RPC 不支持,必须使用 Trongrid 或 Nile 节点。交易匹配与状态更新
遍历返回的交易列表,提取raw_data.contract[0].parameter.value.data(TRC20 转账的 hex 数据),解码后检查是否包含订单号(如ORDER_123456)。匹配成功则执行:update_order_status($order_id, 'success', $txid, $amount_usdt); send_callback_to_merchant($order_id); // 触发彩虹易支付标准回调
3.3 宝塔计划任务配置:为什么必须用 CLI PHP,且周期设为 1 分钟
宝塔面板中创建计划任务时,关键参数必须严格匹配:
| 字段 | 推荐值 | 为什么必须这样设 |
|---|---|---|
| 任务类型 | Shell 脚本 | cron.php是 CLI 脚本,非 Web 环境,不能用 URL 访问 |
| 执行周期 | 每 1 分钟 | TRC20 平均出块时间 3 秒,1 分钟内基本完成 20+ 确认,平衡及时性与服务器负载 |
| 脚本内容 | /usr/bin/php /www/wwwroot/yourdomain.com/plugins/usdt/cron.php 1 | 最后参数1是通道 ID,必须与后台创建的 USDT 通道 ID 一致,否则跳过该通道订单 |
注意:
/usr/bin/php是大多数宝塔环境的默认 PHP CLI 路径,但部分定制环境可能为/www/server/php/81/bin/php。务必先在 SSH 中执行which php确认路径,否则任务静默失败。
4. 避坑指南:TRC20 支付最常踩的 4 个深坑与血泪解法
4.1 现象:用户付款后订单状态始终「待支付」,日志无报错
原因:cron.php未正确关联通道 ID,或数据库中订单channel_id字段为空/错误。插件在cron.php开头有硬性校验:if ($channel_id != $argv[1]) continue;,若通道 ID 不匹配,直接跳过该订单。
解决:登录后台【支付通道】,查看 USDT 通道的 ID(URL 中id=1即 ID 为 1),确保计划任务脚本末尾参数与之完全一致;同时检查数据库epay_order表中该订单的channel_id是否为1。
4.2 现象:cron.php执行报错cURL error 28: Operation timed out
原因:TRON RPC 节点响应超时。Trongrid 免费 API 有速率限制(100 次/分钟),当并发订单多或网络抖动时,请求堆积导致超时。
解决:
- 优先切换至付费 API Key(Trongrid Pro 版本),提升 QPS;
- 或在
cron.php中增加重试逻辑(最多 3 次,每次间隔 2 秒); - 绝对禁止将
cron.php执行周期缩短至 30 秒以下,否则必然触发限流。
4.3 现象:用户付了 10 USDT,订单却记为 100000000(单位错乱)
原因:TRC20-USDT 的精度为 6 位小数,链上存储为10 * 10^6 = 10000000(wei 单位)。插件在cron.php解析交易数据时,若未将value字段除以10^6,直接当作 USDT 数量使用,就会放大百万倍。
解决:检查cron.php中交易解析部分,确认存在类似代码:
$usdt_amount = bcdiv($tx['raw_data']['contract'][0]['parameter']['value']['amount'], '1000000', 6);bcdiv是 PHP 高精度除法,1000000即10^6,确保结果为带 6 位小数的字符串。
4.4 现象:pay.php生成的二维码扫不出,或提示「地址无效」
原因:TRC20 支付二维码格式为tron:TRON_ADDRESS?amount=AMOUNT&memo=ORDER_ID,但部分手机钱包(如 TokenPocket Android 版)不识别tron:协议,仅支持TRON_ADDRESS纯地址。
解决:修改pay.php中二维码生成逻辑,提供双模式:
// 默认生成兼容性更强的纯地址二维码 $qr_content = $tron_address; // 若需协议支持,可额外生成一行:tron:{$tron_address}?amount={$amount}&memo={$order_id}实际部署时,建议前端用 JS 动态判断钱包 UA,再决定展示哪种二维码。
5. 安全加固与链上验证:如何用区块浏览器亲手验证每一笔到账
5.1 私钥管理:绝不硬编码,必须环境变量隔离
插件中usdt_plugin.php的$private_key变量若直接写死,等于将钱包控制权拱手让人。正确做法是通过环境变量注入:
- 在宝塔 PHP 设置中,进入「配置修改」→ 在
php.ini底部添加:; TRON 钱包私钥(仅 CLI 环境可见) putenv("TRON_PRIVATE_KEY=YOUR_64_HEX_PRIVATE_KEY"); - 修改
usdt_plugin.php,将私钥读取改为:$private_key = getenv('TRON_PRIVATE_KEY'); if (!$private_key || strlen($private_key) !== 64) { throw new Exception('Invalid TRON private key from environment'); }
血泪经验:曾有客户将私钥写在
usdt_plugin.php里,因.php文件被 Nginx 配置错误导致源码泄露,2 小时内钱包清空。从那以后我每次部署 TRC20 插件,都强制走一遍「环境变量注入 + 权限检查 + 日志脱敏」三步。
5.2 链上验证:三步确认资金真实到账(非后台假状态)
当后台显示「支付成功」,必须人工交叉验证链上真实性:
| 步骤 | 操作 | 验证点 | 工具 |
|---|---|---|---|
| 1. 提取交易哈希 | 后台订单详情页复制「交易ID」字段(形如a1b2c3...) | 确保该哈希长度为 64 位十六进制字符 | 浏览器地址栏 |
| 2. 查询区块浏览器 | 访问 Tronscan → 粘贴哈希 → 回车 | 检查From是否为你配置的 TRON 地址,To是否为用户地址,Amount是否匹配订单 | Tronscan 官网 |
| 3. 核对备注信息 | 展开交易详情 → 查看Data字段(hex 格式)→ 用在线 hex 解码器转换 | 解码后应包含ORDER_123456或类似订单标识 | CyberChef |
✅ 验证通过标志:Tronscan 显示
Confirmed状态,且Block Height对应当前区块高度(非Pending)。若显示Reverted,说明用户转账失败,后台状态为误判,需人工干预。
5.3 故障自检清单:5 分钟定位问题根源
当支付异常时,按此顺序排查(每步 ≤1 分钟):
| 检查项 | 命令/操作 | 预期结果 | 失败含义 |
|---|---|---|---|
| PHP CLI 是否可用 | ssh进服务器 →php -v | 显示 PHP 版本(≥7.2) | PHP 环境损坏 |
| cron.php 是否可执行 | php /www/wwwroot/yourdomain.com/plugins/usdt/cron.php 1 | 输出Processed X orders或No pending orders | 文件权限错误或语法错误 |
| TRON RPC 是否连通 | curl -X POST --data '{"jsonrpc":"2.0","method":"tron_getNodeInfo","params":[],"id":1}' https://api.trongrid.io | 返回 JSON 包含node_name | RPC 节点宕机或网络阻断 |
| 数据库订单状态 | mysql -e "SELECT id,status,channel_id FROM epay_order WHERE pay_type='usdt' ORDER BY id DESC LIMIT 5;" | status=0且channel_id=1 | 订单未正确归入 USDT 通道 |
| 计划任务是否生效 | crontab -l | grep cron.php | 显示*/1 * * * * /usr/bin/php .../cron.php 1 | 宝塔任务未真正写入系统 crontab |
希望帮到你。
本文还有配套的精品资源,点击获取