- Version: 2.1.7
- Beta Release: No
- Security Update: Yes
- Current Version: Yes
- operating platform: XenForo
HuoNiu 易支付(XenForo 2 支付提供商)重磅发布!面向中文站点的稳定支付方案,开箱即用、对齐官方流程、快速提升转化。
A better way to browse. Learn more.
A full-screen app on your home screen with push notifications, badges and more.
HuoNiu 易支付(XenForo 2 支付提供商)重磅发布!面向中文站点的稳定支付方案,开箱即用、对齐官方流程、快速提升转化。
致命修复 - 未定义常量导致 PHP Fatal Error:
- 移除 CallbackState::PAYMENT_PENDING 和 CallbackState::PAYMENT_REJECTED 的使用——这两个常量在 XenForo 中根本不存在(仅有 PAYMENT_RECEIVED 等4个常量),运行时触发 PHP Error 导致所有回调处理崩溃
- 对非 TRADE_SUCCESS 状态改为记录 info 日志,不执行订单操作
🐛 致命修复 - `<xf:form>` 自动注入 `_xfToken` 破坏签名:
- `easypay_payment_redirect` 模板原使用 `<xf:form>` 标签,XenForo 会自动向表单注入 CSRF Token 字段 `_xfToken`,该字段被一并 POST 给易支付服务端,导致服务端验签时包含此未知字段而**百分百失败**
- 改为普通 `<form>` 标签(向第三方服务器提交无需 XF CSRF 保护)
🐛 严重修复 - 多支付类型时预签名过期导致支付失败:
- `easypay_payment_initiate` 原将含预计算签名的数据直接 POST 给易支付;当用户在页面切换支付类型(如支付宝→微信),签名仍是旧类型的,服务端验签**必然失败**
- 重构支付发起流程:表单改为提交至 XF 内部路由 `purchase/process`,由 `processPayment()` 用用户实际选择的类型**重新签名**后再跳转易支付
- `initiatePayment()` 新增 `$processUrl` 变量传入模板;表单使用 `<xf:form>` 带 CSRF 保护;仅传 `request_key` 和 `type`,无需传递预签名的全量参数
🐛 严重修复 - 命名空间缺失 `\` 导致异常无法捕获:
- `generateCallbackV2Sign()` 中 `catch (Exception $e)` 未加命名空间前缀,在 `HuoNiu\EasyPay\Payment` 命名空间下实际捕获的是根本不存在的 `HuoNiu\EasyPay\Payment\Exception`,OpenSSL 异常会从 try 块直接逃逸
- 修正为 `catch (\Throwable $e)
🐛 修复 - PHP 8 Error 对象无法被 catch 捕获:
- 三处回调入口(控制器 `Callback.php`、传统回调 `epay_callback.php`)的顶层 `catch` 均使用 `catch (\Exception $e)`,PHP 8 中 `\Error`(未定义常量、类型错误等)不继承 `\Exception`,异常逃逸后返回未知错误且无精确日志
- 全部改为 `catch (\Throwable $e)`,覆盖 `Error` 与 `Exception` 两棵继承树
🐛 修复 - 签名字段 null 值处理与源码不一致:
- `generateV1Sign()` 仅跳过空字符串 `''`,不跳过 `null`;`buildSignQuery()` 未过滤数组类型值——与易支付服务端 `isEmpty()` 行为不完全一致,特定参数下可能产生签名差异
- `generateV1Sign` 补充 `|| $v === null` 判断;`buildSignQuery` 添加 `!is_array($v)` 前置过滤
🛠️ 修复 - 回调请求实体类查找错误(前版遗留):
- `Callback.php` 原使用 `XF:PaymentProfile`(支付配置实体)查找支付提供商,应为 `XF:PaymentProvider`(支付提供商实体,主键为字符串 `provider_id`),导致回调 404
- 已更正实体类名
🛠️ 修复 - 调用不存在的方法(前版遗留):
- `Callback.php` 原调用 `$handler->processCallback()`,该方法在 XF 支付框架中不存在,改为完整的 XF 标准验证调用链:`setupCallback → validateCallback → validateTransaction → validatePurchaseRequest → ... → getPaymentResult → completeTransaction`
🛠️ 修复 - `_xfProvider` 参数污染签名(前版遗留)**:
- 回调 URL 携带的 `_xfProvider` 参数被混入签名计算,与易支付服务端签名字段集不一致导致验签失败
- 新增 `stripXfParams()` 方法在签名前剔除所有 XF 内部参数(`_xfProvider` 及含 `/` 的路由键)
🛠️ 修复 - `getInputRaw()` 返回字符串非数组(前版遗留):
- `setupCallback()` 原使用 `$request->getInputRaw()` 获取回调数据,该方法返回原始请求体字符串而非参数数组,导致后续所有字段读取均为空
- 改为 `array_merge($_GET, $_POST)` 兼容易支付 GET 或 POST 两种回调方式