为 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) | 是否已退款 |
配置流程
后台「插件」→ 启用「积分充值」插件(自动建表 + 写入默认配置 + 5 个默认套餐)
进入「支付设置」→ 配置积分汇率(1元=N积分/金币/RMB)
选择支付方式并配置对应参数:
易支付:填写
epay_url(如https://www.ezfpy.cn)、epay_pid(商户ID)、epay_key(密钥),保存后用户即可使用支付宝:填写
alipay_app_id、应用私钥、支付宝公钥、网关地址微信支付:填写
wechat_app_id、wechat_mch_id、wechat_key
进入「套餐管理」→ 新增/编辑充值套餐(可设固定金额或自定义金额类型)
进入「订单管理」→ 按用户ID/状态筛选查看订单,支持手动补单和退款
测试:用户访问
?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
开发者:哆哆







