欢迎客人!
• 开始前请阅读社区规则确保您顺利的熟悉本社区。注册用户可以提交资源,如果您有已发布资源的新版本,您可以随时更新版本!
• 文件链接损坏请在文件下方留言,我们将会及时更新来自备份服务器的新链接。如有其它问题请 提交工单 和我们联系!【加入Telegram】【QQ群:5977983】
• 我们拥有多账户检测系统,对于重复注册我们将采取严厉措施!快速获得积分
你正在使用过时的浏览器,可能无法正确显示此网站或其他网站。
你应该升级浏览器或使用其他浏览器。
你应该升级浏览器或使用其他浏览器。
修改的模板:
主要改进:
- hn_withdrawal_list (提现记录列表页面)
- hn_withdrawal_apply (提现申请页面)
- ✅ 两栏布局设计,左右栏中间使用1px渐变分隔线
- ✅ 优化间距和对齐方式(gap: 1em)
- ✅ 余额信息区域整合到黄色提示框内
- ✅ 提现规则使用后台动态配置(调用 phrase 系统)
- ✅ 添加"全部提现"按钮
- ✅ 简化预览区域(只显示手续费和实际到账)
2.
新增文件: withdrawal.js
功能:
- ✅ 实时计算提现手续费和实际到账金额
- ✅ 支持用户输入时动态更新预览
- ✅ "全部提现"按钮自动填充可用余额
- ✅ 使用 XenForo Element Handler 架构,与购买积分页面一致
3.
文件: templates.xml (hn_withdrawal_apply)
改进:
- ✅ 余额不足时不显示提现表单,改为显示友好的错误提示
- ✅ 检查条件: $availableBalance < $minAmount
- ✅ 避免用户填写完整表单后才发现余额不足被拒绝
4.
文件: templates.xml
修复:
- ✅ 添加缺失的邮件模板 payment_received_receipt_hn_credits
- ✅ 修复支付宝/PayPal充值成功后发送收据邮件的错误
- ✅ 解决 Template email😛ayment_received_receipt_hn_credits is unknown 错误
🔒 安全性修复 (已完成):
💰 精度问题修复 (已完成):
- ✅ SQL注入防护 - Currency.php删除操作使用验证过的列名
- ✅ 输入验证增强 - Event/Trigger.php添加全面的参数验证
- ✅ Race condition防护 - Transfer/Handler.php使用FOR UPDATE锁定
- ✅ CSRF保护 - 所有POST操作都有assertValidCsrfToken
- ✅ XSS防护 - 用户输入使用stringFormatter()->censorText()
⚡ 性能优化 (已完成):
- ✅ Credit.php - Exchange功能全面使用bcmath
- ✅ Handler.php - Fee计算使用bcmath
- ✅ Transaction.php - updateUserCredit格式化金额
- ✅ 除零错误检查 - 汇率计算前验证
- ✅ Credit Repository - validateCurrencyColumn缓存机制
- ✅ Transfer Handler - 数据库事务锁定优化
- ✅ ResourceItem购买 - 双重余额检查在事务内
删除了重复的 fastUpdate 扣款代码,只保留 triggerEvent 来正确扣除积分,同时优化了余额检查逻辑:
- ❌ 删除:$visitor->fastUpdate($buyCurrency['column'], $visitor->get($buyCurrency['column']) - $sendAmount);
- ✅ 修改:余额检查从 < 0 改为 < $sendAmount(更合理的预检查)
🔧 修复 (Bug Fixes)
✅ 修复 PayPal 支付无法购买真实货币文件的严重问题
影响:
- 问题: 用户通过 PayPal 支付后无法获得资源下载权限
- 原因: 缺少 XenForo 2.3+ 必需的 validatePurchasable() 回调验证方法
- 修复:
- 添加完整的 validatePurchasable() 方法到 Purchasable\ResourceMoney 类
- 删除冗余的旧版 Payment\ResourceMoney 代码
- 完善支付回调验证链
- ✅ PayPal 支付现已完全正常(CNY/USD 自动转换)
- ✅ 支付宝支付更加稳定可靠
- ✅ 所有支付网关回调验证完整
🎯 技术细节
修改文件:
兼容性:
- ResourceMoney.php - 添加验证方法
- ResourceMoney.php - 已删除(src\addons\HuoNiu\Credits\Payment\ResourceMoney.php 冗余)
- XenForo 2.3.0+
- PHP 8.0+
- XFRM 2.3.0+ (可选)
更新内容
🐛 Bug 修复
1.
文件: ResourceItem.php
问题:
修复:
- 用户组设置了"绕过资源购买(XFRM)"权限后,前台仍显示购买按钮
- 代码中使用了错误的权限ID 'bypassPurchase'
影响:
- ✅ 第106行:checkRequirePurchase() 方法 - 权限ID改为 'hnBypassPurchase'
- ✅ 第538行:canDownload() 方法 - 权限ID改为 'hnBypassPurchase'
- 拥有"绕过资源购买"权限的用户现在可以直接下载付费资源
- 无需购买即可访问
🧹 代码优化
2.
文件: permissions.xml
删除的权限:
原因:
- ❌ viewOthers - 查看他人交易(实际通过管理员权限控制)
- ❌ viewHidden - 查看隐藏交易(未实现)
保留的权限:
- 避免用户困惑(设置了但不生效)
- 保持代码和配置的一致性
- ✅ useCredits - 使用积分系统
- ✅ bypassChargeTag - 免费查看收费内容
- ✅ canFine - 罚款其他用户
- ✅ hnBypassPurchase - 绕过资源购买(XFRM)
📝 更新说明
升级方式:
版本兼容: 适用于 XenForo 2.3.0+ 和 XFRM 2.3.0+
- 后台 → 插件 → HuoNiu Credits System
- 点击"升级"或重新安装
建议操作: 升级后重建权限缓存(后台 → 工具 → 重建缓存 → 权限组合)
🐛 Bug 修复
- 修复 XFRM 资源页面崩溃问题
- 修复错误:InvalidArgumentException: Accessed unknown getter 'hn_payment_type' on XFRM:ResourceItem
- 添加升级步骤自动创建缺失的数据库字段
- 影响范围:使用资源管理器(XFRM)的所有站点
- 修复插件安装失败问题
- 修复模板语法错误:hn_resource_purchase_money 模板第54行 explain 标签使用不当
- 更新模板结构以符合 XenForo 2.3+ 规范
- 影响范围:全新安装或重新安装插件时
🔧 技术改进
- 新增 upgrade2031116Step1() 升级步骤,自动处理数据库结构更新
- 完善 XFRM 资源表扩展字段的向后兼容性检查
- 优化模板结构,提升与 XenForo 核心的兼容性
📊 涉及字段
自动添加/检查以下 XFRM 资源表字段:
- hn_payment_type, hn_money_price, hn_money_currency, hn_money_purchase_count
- hn_price, hn_currency_id, hn_discount, hn_discount_date
- hn_purchase_count, hn_purchase_count_visible
- hn_expiration_days, hn_expiration_unit, hn_renewal_discount
📝 升级说明
从旧版本升级至 v2.1.1 RC 7:
注意: 升级过程会自动检测并添加缺失字段,无需手动操作数据库。
- 上传文件覆盖
- 后台执行插件升级(自动运行数据库更新)
- 重建缓存
解决无法使用 PAYPAL 进行支付购买积分和文件的问题。
1.
- 新增功能:资源购买页面现在显示完整的费用明细(基础金额、支付手续费、总费用)
- 文件修改:
- ResourceItem.php:新增 actionCalculatePurchaseCost() AJAX接口
- templates.xml:hn_resource_purchase_money 模板添加手续费明细显示区域
- resource-payment.js:重写为调用AJAX获取实时计算的手续费
2.
- 问题:PayPal不支持接收CNY,导致CNY定价的资源无法通过PayPal购买
- 解决方案:自动将CNY转换为USD后提交给PayPal
- 文件修改:
- ResourceMoney.php:
- getCurrencyForPaymentProvider():PayPal强制使用USD
- convertCurrencyAmount():添加CNY→USD转换逻辑(CNY ÷ 汇率 = USD)
- getActualExchangeRate():正确返回CNY→USD的汇率
3.
- 问题:资源购买手续费为0,无法读取后台配置
- 原因:匹配方式错误(按provider名称而非payment_profile_id)
- 修复:
- ResourceMoney.php:calculateTransactionFee() 改为按 payment_profile_id 匹配配置
- 与积分购买保持一致的配置读取逻辑
4.
- 修改:ResourceMoney.php 中以下方法从 protected 改为 public
- getCurrencyForPaymentProvider()
- convertCurrencyAmount()
- calculateTransactionFee()
- getActualExchangeRate()
- 目的:允许controller调用这些方法进行实时计算
5.
- 删除:resource-payment.js 中所有 console.log() 和 console.error() 调试代码
主要修改文件列表
- PHP后端:
- ResourceMoney.php
- ResourceItem.php
- 前端模板:
- templates.xml(hn_resource_purchase_money 模板)
- JavaScript:
- resource-payment.js
用户体验改进
✅ 资源购买页面显示透明的费用明细
✅ CNY定价资源可通过PayPal购买(自动转换为USD)
✅ 正确计算并显示支付手续费
✅ 货币转换提示显示实际支付金额和汇率
✅ 与积分购买页面保持一致的UI体验
![]()
![]()
🐛
1.
影响范围:
- 问题描述:用户购买过期后,尝试下载过期日期前发布的旧版本时提示"下载权限已过期"错误
- 根本原因:版本ID传递错误,URL请求 version/5/download 但权限检查使用了 current_version_id(如version 9)
- 解决方案:
- 重写 ResourceVersion Controller 的 actionDownload() 方法
- 直接使用请求的版本ID进行权限验证
- 绕过父类的错误版本检查逻辑
- 完整实现文件下载流程(外链重定向/单文件/多文件选择)
- ✅ 积分购买用户
- ✅ 货币购买用户
- ✅ 混合支付模式
- ✅ 所有过期策略(永久旧版本访问、宽限期、完全禁止)
2.
- 未购买用户:显示静态配置信息(如"购买后 5 天过期")
- 已购买用户:动态显示倒计时(如"⏰ 还有 4 天到期")
- 每日自动递减,实时更新剩余天数
3.
- 移除"许可状态"中的重复倒计时文本
- 仅显示状态标签:"✓ 激活中"、"⚠ 已过期(可下载旧版本)"等
- 删除下载按钮下方的冗余倒计时提示
4.
- 所有动态倒计时统一在"访问时长"行显示
- 避免信息重复,界面更简洁清晰
✅
- 过期用户可下载旧版本(版本发布日期 ≤ 过期日期)
- 过期用户无法下载新版本(版本发布日期 > 过期日期)
- 积分购买支持旧版下载
- 货币购买支持旧版下载
- 混合支付模式支持旧版下载
- 宽限期用户显示动态倒计时
- 动态倒计时每日递减
- 续费逻辑不受影响
📌
- 此更新不影响现有购买记录和数据结构
- 续费功能完全兼容,续费后自动延长过期时间
- 适用于所有XenForo 2.x + XFRM环境
- 建议更新后清除模板缓存
🎯
- ✨ 购买过期后仍可下载购买期内的版本
- ✨ 界面显示更直观,倒计时实时更新
- ✨ 减少冗余信息,布局更简洁
- ✨ 三种支付方式体验完全一致
- 修复事件导出报错:导出查询表名 xf_hn_credits_event → xf_hn_event
- 修复兑换页面 404:新增 Pub/Controller/Credit.php::actionExchange(),实现兑换入口与处理逻辑
- 完善兑换页:更新 hn_exchange 模板(余额展示 + 使用说明 + JS 预览计算)
- 补齐语言包:新增/补全兑换相关 phrases(含 option.hnUsdToCnyRate)
- 修复安装 XML 报错:清理 phrases.xml 多行 CDATA 为单行;修复 templates.xml 中误插入的重复代码
- 修复短语 key 非法字符:hn_available: → hn_available
- 最终校验:_data 下所有 XML 均可正常解析通过