HuoNiu Credits System - 积分系统

付费/Paid HuoNiu Credits System - 积分系统 2.3.8.6

欢迎客人!

• 开始前请阅读社区规则确保您顺利的熟悉本社区。注册用户可以提交资源,如果您有已发布资源的新版本,您可以随时更新版本!

• 文件链接损坏请在文件下方留言,我们将会及时更新来自备份服务器的新链接。如有其它问题请 提交工单 和我们联系!【加入Telegram】【QQ群:5977983】

• 我们拥有多账户检测系统,对于重复注册我们将采取严厉措施!快速获得积分

  • 中国新年将至,本站推出优惠活动。所有用户组都将获得由 HuoNiu 开发的 付费插件 优惠20%活动!如果购买多个插件,将在优惠基础上继续实施5%优惠。本活动将持续一个月!
🔒 安全性修复 (已完成):
  1. ✅ SQL注入防护 - Currency.php删除操作使用验证过的列名
  2. ✅ 输入验证增强 - Event/Trigger.php添加全面的参数验证
  3. ✅ Race condition防护 - Transfer/Handler.php使用FOR UPDATE锁定
  4. ✅ CSRF保护 - 所有POST操作都有assertValidCsrfToken
  5. ✅ XSS防护 - 用户输入使用stringFormatter()->censorText()
💰 精度问题修复 (已完成):
  1. ✅ Credit.php - Exchange功能全面使用bcmath
  2. ✅ Handler.php - Fee计算使用bcmath
  3. ✅ Transaction.php - updateUserCredit格式化金额
  4. ✅ 除零错误检查 - 汇率计算前验证
⚡ 性能优化 (已完成):
  1. ✅ Credit Repository - validateCurrencyColumn缓存机制
  2. ✅ Transfer Handler - 数据库事务锁定优化
  3. ✅ 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+ (可选)

本次修复文件清单​

修改的文件(2个)​

  1. Listener.php
    • 路径:Listener.php
    • 添加:paymentHandlerInfo() 方法
  2. code_event_listeners.xml
    • 路径:code_event_listeners.xml
    • 添加:payment_handler_info 监听器配置

修复目标​

PayPal支付回调失败问题

更新内容​

🐛 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)

📝 更新说明​

升级方式:
  1. 后台 → 插件 → HuoNiu Credits System
  2. 点击"升级"或重新安装
版本兼容: 适用于 XenForo 2.3.0+ 和 XFRM 2.3.0+
建议操作: 升级后重建权限缓存(后台 → 工具 → 重建缓存 → 权限组合)

🐛 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:
  1. 上传文件覆盖
  2. 后台执行插件升级(自动运行数据库更新)
  3. 重建缓存
注意: 升级过程会自动检测并添加缺失字段,无需手动操作数据库。

解决无法使用 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() 调试代码

主要修改文件列表​

  1. PHP后端
    • ResourceMoney.php
    • ResourceItem.php
  2. 前端模板
    • templates.xml(hn_resource_purchase_money 模板)
  3. JavaScript
    • resource-payment.js

用户体验改进​

✅ 资源购买页面显示透明的费用明细
✅ CNY定价资源可通过PayPal购买(自动转换为USD)
✅ 正确计算并显示支付手续费
✅ 货币转换提示显示实际支付金额和汇率
✅ 与积分购买页面保持一致的UI体验

[OKSGO.COM] HuoNiu Credits System - 积分系统
[OKSGO.COM] HuoNiu Credits System - 积分系统

🐛​

1.​

  • 问题描述:用户购买过期后,尝试下载过期日期前发布的旧版本时提示"下载权限已过期"错误
  • 根本原因:版本ID传递错误,URL请求 version/5/download 但权限检查使用了 current_version_id(如version 9)
  • 解决方案
    • 重写 ResourceVersion Controller 的 actionDownload() 方法
    • 直接使用请求的版本ID进行权限验证
    • 绕过父类的错误版本检查逻辑
    • 完整实现文件下载流程(外链重定向/单文件/多文件选择)
影响范围
  • ✅ 积分购买用户
  • ✅ 货币购买用户
  • ✅ 混合支付模式
  • ✅ 所有过期策略(永久旧版本访问、宽限期、完全禁止)

2.​

  • 未购买用户:显示静态配置信息(如"购买后 5 天过期")
  • 已购买用户:动态显示倒计时(如"⏰ 还有 4 天到期")
  • 每日自动递减,实时更新剩余天数

3.​

  • 移除"许可状态"中的重复倒计时文本
  • 仅显示状态标签:"✓ 激活中"、"⚠ 已过期(可下载旧版本)"等
  • 删除下载按钮下方的冗余倒计时提示

4.​

  • 所有动态倒计时统一在"访问时长"行显示
  • 避免信息重复,界面更简洁清晰

✅​

  • 过期用户可下载旧版本(版本发布日期 ≤ 过期日期)
  • 过期用户无法下载新版本(版本发布日期 > 过期日期)
  • 积分购买支持旧版下载
  • 货币购买支持旧版下载
  • 混合支付模式支持旧版下载
  • 宽限期用户显示动态倒计时
  • 动态倒计时每日递减
  • 续费逻辑不受影响

📌​

  1. 此更新不影响现有购买记录和数据结构
  2. 续费功能完全兼容,续费后自动延长过期时间
  3. 适用于所有XenForo 2.x + XFRM环境
  4. 建议更新后清除模板缓存

🎯​

  • ✨ 购买过期后仍可下载购买期内的版本
  • ✨ 界面显示更直观,倒计时实时更新
  • ✨ 减少冗余信息,布局更简洁
  • ✨ 三种支付方式体验完全一致
  • 修复事件导出报错:导出查询表名 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 均可正常解析通过
功能增加/修复清单

  • XenForo 2.3 兼容性修复
    • 修复 Call to undefined method XF::logModerator() 等 XF 2.3 API 变更导致的报错
    • 替换/兼容旧用法:例如 \GuzzleHttp\json_encode、getEventRepo 等相关调用点
  • “资源过期后下载控制”功能(XFRM)
    • 新增三种过期后下载策略(后台可选)
      • permanent_old_versions(默认):过期后仍可下载“过期前/有效期内发布”的旧版本
      • no_download:过期后完全禁止下载
      • grace_period:过期后宽限期内允许下载旧版本(可配置天数)
    • 新增后台选项
      • hnExpiredDownloadPolicy
      • hnExpiredDownloadGraceDays
  • 前台状态展示与按钮逻辑(XFRM 资源页)
    • 新增/完善购买状态计算与展示:激活中、已过期但可下旧版、宽限期、已过期不可下载等
    • 调整主按钮逻辑:过期用户显示购买/续费,而不是继续访问/下载
    • 补充/修正相关短语与 XML 编码问题
  • 历史版本页“逐版本下载权限”一致性(修复漏洞)
    • 修复问题:过期后发布的新版本在历史版本页仍显示“下载”
    • 实现方式:在 add-on 中直接覆盖 public:xfrm_resource_history 模板
    • 模板侧实现逻辑
      • 下载列显示:使用 canAccessHistoryDownloads()
      • 每行下载按钮:使用 canDownloadVersion($versionId) 判断是否允许下载
    • 处理模板导入限制
      • 修正 xf:if 内不允许的结构
      • 将模板可调用方法名改为 can* 前缀以满足白名单限制(从 hn* 调整为 canDownloadVersion() 等)
  • 下载后端强校验(防直链绕过)
    • 在版本下载 action 中增加版本级校验,防止仅靠 URL 直接下载绕过前台限制
    • 统一使用资源的购买记录获取逻辑 getUserPurchaseRecord(),确保积分/真钱/手动授权路径一致
    • 放行作者/具备绕过权限的用户(避免误伤)
  • “旧版下载仍提示过期”的修复
    • 修复根因:资源 canDownload() 之前固定按 current_version_id 做校验,下载旧版本也会被当作“当前版本”拦截
    • 改为优先从请求参数读取“正在下载的版本 ID”(兼容 resource_version_id / version_id),再做版本级判断
    • 前台历史页展示与后端下载校验逻辑统一
  • 购买记录与版本门控算法修复/增强(积分 + 真钱 + 两者)
    • 修复问题
      • resource_version_id=0、真钱购买不记录版本等导致“过期仍可下载所有版本”的漏洞
      • 版本 ID 与发布时间不严格单调时,用“ID 大小比较”会误判
    • 新策略:统一按 ResourceVersion.release_date <= cutoff 判断
      • cutoff 优先用 expire_date,否则用 purchase_date
    • 积分购买与真钱购买实体均实现同一套“按发布时间门控”的判断方法,并修复真钱购买实体中的异常逻辑(曾存在重复 return 之类问题)
  • phrases.xml 重复键值修复
    • 清理 _data/phrases.xml 中重复的短语 title,保证导入/构建不再报“重复键值”
  • 红包 openBonus 报错修复(游客 user_id=0)
    • 修复问题:triggerEvent failed: Invalid target user ID: 0 / Bonus open failed for user #0
    • 修复方式:在 actionOpenBonus() 开头强制要求登录($visitor->user_id > 0),游客直接返回“需要登录”,不会触发事件
[OKSGO.COM] HuoNiu Credits System - 积分系统


[OKSGO.COM] HuoNiu Credits System - 积分系统

[OKSGO.COM] HuoNiu Credits System - 积分系统

[OKSGO.COM] HuoNiu Credits System - 积分系统

[OKSGO.COM] HuoNiu Credits System - 积分系统
后退
顶部