【XIUNOX插件】积分充值插件 v1.0.1

为 XIUNOX BBS 提供积分/金币/RMB 在线充值能力,支持支付宝当面付、微信扫码支付、第三方易支付平台,多套餐管理,积分汇率自定义,后台订单管理与退款。

版本更新

版本

更新内容

1.0.1

初始版本,支持支付宝/微信/易支付三大支付通道,多套餐 + 自定义金额,后台订单管理、补单、退款

功能

  • 多支付通道:支付宝当面付(alipay.trade.precreate RSA2 签名)、微信扫码支付(NATIVE 统一下单,XML 签名)、第三方易支付(ksort + MD5 签名,兼容 ezfpy 等平台)

  • 多积分类型:支持积分(credits)、金币(golds)、RMB(rmbs) 三种积分类型,可单独启用/禁用

  • 多套餐管理:固定金额套餐(预设积分+满赠奖励)+ 自定义金额套餐(按汇率自动计算积分),支持排序和启用/禁用

  • 满赠奖励:满指定金额赠送额外积分/金币/RMB

  • 积分汇率自定义:1 元 = N 积分/金币/RMB,后台灵活配置

  • 异步通知dd_recharge_notify-{type} 统一通知入口,自动匹配 alipay/wechat/epay 回调,验证签名后更新订单并发放积分

  • 支付返回dd_recharge_return 用户支付完成后跳回页面,展示支付结果

  • 二维码支付:支付宝/微信生成扫码支付二维码,前端 JS 轮询检测支付状态自动跳转

  • 订单管理:后台订单列表,按 uid/状态筛选,分页显示,手动补单(手动完成支付并加积分)、退款(扣减用户积分回退订单状态)

  • 套餐管理:后台添加/编辑/删除套餐,配置基础积分、赠送积分、满赠门槛、排序、启用状态

  • 前台查询:用户个人充值记录列表,分页浏览历史订单

  • JS 交互:前端充值页面支持套餐选择高亮、积分类型切换、支付方式切换、自定义金额实时计算积分预览、CSRF 保护

  • 导航注入:用户侧边栏「充值」入口(my_sidebar_nav_security_before),用户中心导航注入(my_nav_after)

  • 多语言:lang_zh_cn_bbs 定义 50+ 翻译键

  • 安全校验:CSRF 防护、支付方式白名单、积分类型白名单、签名验证、金额匹对校验

文件结构

plugin/dd_recharge/
├── conf.json                    (插件元数据、hooks_rank、overwrites_rank)
├── install.php                  (建表 + 默认配置 + 5 个默认套餐)
├── uninstall.php                (删表 + 删除配置)
├── setting.php                  (封装 saveSettings,被 admin 调用)
├── setting.htm                  (转发到 recharge_admin_settings.htm)
├── update.md
├── model/
│   ├── RechargeService.php      (核心业务:CRUD 套餐/订单、markPaid、manualComplete、refundOrder、cancelOrder、calculateCredits)
│   ├── AlipayService.php        (支付宝当面付:createPayment RSA2 签名、verifyNotify 验签)
│   └── WechatPayService.php     (微信支付:createPayment MD5+XML 签名、verifyNotify、toXml/fromXml)
├── route/
│   ├── recharge.php             (前台路由:recharge/orders/create 三个 action)
│   ├── admin_recharge.php       (后台路由:orders/plans/settings 三个 action,含权限校验 gid=1/2)
│   ├── notify.php               (统一异步通知:正则匹配 dd_recharge_notify-{type} → alipay/wechat/epay)
│   └── return.php               (支付返回:查订单状态,显示成功/待支付)
├── hook/
│   ├── model_inc_file.php       (注册 model 类加载路径)
│   ├── model_route_table_end.php(注册 12 条路由,含分页路由)
│   ├── index_route_case_end.php (前台路由分发)
│   ├── admin_index_route_case_end.php (后台路由分发)
│   ├── lang_zh_cn_bbs.php       (50+ 翻译键定义)
│   ├── footer_js_after.htm      (注入 CSS + JS)
│   ├── my_nav_after.htm         (用户中心顶部导航入口)
│   ├── my_sidebar_nav_security_before.htm        (用户侧边栏入口)
│   └── my_sidebar_nav_security_before_mobile.htm (移动端侧边栏入口)
├── view/htm/
│   ├── recharge.htm              (前台充值主页:套餐卡片 + 积分/支付方式选择 + 金额预览 + JS 交互)
│   ├── recharge_orders.htm       (用户充值记录列表)
│   ├── recharge_qrcode.htm       (支付宝/微信二维码支付页 + JS 轮询)
│   ├── recharge_admin_orders.htm (后台订单管理:筛选 + 分页 + 补单/退款按钮)
│   ├── recharge_admin_plans.htm  (后台套餐管理:新增/编辑/删除表单)
│   └── recharge_admin_settings.htm (后台支付设置:汇率 + 支付宝/微信/易支付配置表单)
└── static/
    ├── css/recharge.css          (充值页面样式)
    └── js/recharge.js            (前端交互:套餐选择、积分计算、DD_SELECT/DD_SYNC 函数)

数据库表

dd_recharge_plan (套餐表)

字段

类型

说明

id

int unsigned AUTO_INCREMENT

主键

is_custom

tinyint(1)

0=固定金额 1=自定义金额

name

varchar(64)

套餐名称

price

decimal(10,2)

支付金额(元)

credits

int

获得积分

golds

int

获得金币

rmbs

int

获得RMB

bonus_credits

int

赠送积分

bonus_golds

int

赠送金币

bonus_rmbs

int

赠送RMB

min_amount

decimal(10,2)

满赠门槛

sort

int unsigned

排序

enable

tinyint(1)

启用状态

dd_recharge_order (订单表)

字段

类型

说明

id

int unsigned AUTO_INCREMENT

主键

order_no

varchar(32) UNIQUE

订单号(YmdHis+6位随机)

uid

int unsigned

用户ID

plan_id

int unsigned

套餐ID

plan_name

varchar(64)

套餐名称

amount

decimal(10,2)

支付金额(元)

credit_type

varchar(16)

积分类型: credits/golds/rmbs

credit_amount

int

获得积分数量

bonus_amount

int

赠送积分数量

pay_type

varchar(16)

支付方式: alipay/wechat/epay

status

tinyint(1)

0待支付 1已支付 2已取消 3已退款

trade_no

varchar(64)

第三方交易号

created

int unsigned

创建时间戳

paid_time

int unsigned

支付时间戳

refund_time

int unsigned

退款时间戳

refunded

tinyint(1)

是否已退款

配置流程

  1. 后台「插件」→ 启用「积分充值」插件(自动建表 + 写入默认配置 + 5 个默认套餐)

  2. 进入「支付设置」→ 配置积分汇率(1元=N积分/金币/RMB)

  3. 选择支付方式并配置对应参数:

    • 易支付:填写 epay_url(如 https://www.ezfpy.cn)、epay_pid(商户ID)、epay_key(密钥),保存后用户即可使用

    • 支付宝:填写 alipay_app_id、应用私钥、支付宝公钥、网关地址

    • 微信支付:填写 wechat_app_idwechat_mch_idwechat_key

  4. 进入「套餐管理」→ 新增/编辑充值套餐(可设固定金额或自定义金额类型)

  5. 进入「订单管理」→ 按用户ID/状态筛选查看订单,支持手动补单和退款

  6. 测试:用户访问 ?dd_recharge → 选择套餐 → 选择积分类型和支付方式 → 点击确认支付 → 跳转易支付页面(如 ezfpy)→ 支付完成后 ezfpy 异步回调 /dd_recharge_notify-epay → 系统验签后更新订单、发放积分

支付流程

易支付 (epay) 签名算法

按 key 字母序排列参数 → 拼接 key=value& → 追加密钥 → MD5
示例: money=10&name=10元充值&...&type=alipay&{KEY} → MD5

易支付完整支付链路

用户选择套餐 → POST dd_recharge_create → 创建订单(status=0)
  → ksort 参数 + MD5 签名
  → 302 跳转 {epay_url}/submit.php
  → 用户在支付平台完成支付
  → 平台异步回调 /dd_recharge_notify-epay
  → ksort($_GET) + MD5 验签
  → trade_status==TRADE_SUCCESS 验证
  → 金额匹对
  → RechargeService::markPaid → 更新订单(status=1)
  → CreditsService::add → 发放积分
  → notify_create → 系统通知
  → 输出 'success'
  → 用户跳回 /dd_recharge_return → 显示支付结果

扩展说明

该插件无自定义事件 hook,所有路由通过 XIUNOX 标准路由分发机制(admin_index_route_case_end / index_route_case_end)注入。如需扩展支付通道,参照 AlipayService.php 模式创建新的 Service 类,在 model_inc_file.php 注册加载路径,在 recharge.php 的 create action 中添加 elseif ($payType == 'xxx') 分支。



版本:v1.0.1
适用版本:1.1
开发者:哆哆

请登录后查看此内容

最新回复
  • AI Lv1

    感谢 哆哆 分享这款功能完善的积分充值插件!👏

    亮点评价:

    1. 架构规范:严格遵循 XIUNOX 的路由注入与 Hook 机制,扩展性良好。
    2. 功能全面:支持支付宝当面付、微信 Native 及易支付,且具备完整的订单管理、补单、退款及 CSRF 防护,安全性考虑周全。
    3. 体验流畅:前端实时计算积分预览与二维码轮询检测,提升了用户充值体验。

    技术探讨: 关于“手动补单”功能,建议在实际生产环境中谨慎使用,并确保仅超级管理员可操作,以防范内部风险。此外,若后续涉及高并发场景,可关注 RechargeService 中事务处理的原子性,确保“更新订单”与“发放积分”要么同时成功,要么同时回滚。

    期待看到更多社区贡献!如有部署问题,欢迎交流。【以上由 AI 自动回复,仅供参考】

    7天前
  • yaoys 内测用户站长 Lv2
    瞅瞅,看看效果
    7天前
  • leostudio 内测用户站长VIP Lv3
    看看效果
    7天前
  • 欧阳 Lv2
    学习一下
    7天前
  • 贰先生 神帝至尊VIP社区元老 管理
    还是有问题
    <?php exit;?>        [WARNING]        2026-07-23 17:50:21        180.129.246.185        /admin/?plugin-setting-dd_recharge.htm        1        Error [2]: file_get_contents(/www/wwwroot/xiuno.xcxgy.cn/view/htm/body_start.htm): Failed to open stream: No such file or directory in /www/wwwroot/xiuno.xcxgy.cn/model/plugin.func.php on line 487
    <?php exit;?>        [WARNING]        2026-07-23 17:50:21        180.129.246.185        /admin/?plugin-setting-dd_recharge.htm        1        Error [2]: file_get_contents(/www/wwwroot/xiuno.xcxgy.cn/view/htm/body_end.htm): Failed to open stream: No such file or directory in /www/wwwroot/xiuno.xcxgy.cn/model/plugin.func.php on line 487

    这个问题三次审核了,优化下吧
    7天前
  • 小九 Lv1
    看看咋样
    7天前
  • Laity 内测用户站长3级用户 Lv3
    看看看看
    7天前
  • 免费的吗?
    7天前

请先登录后再回复 登录