Files
huangjingfen/pro_v3.5.1_副本/app/controller/api/v1/user/UserRecharge.php

143 lines
5.7 KiB
PHP
Raw Normal View History

feat(fsgx): 完成全部24项开发任务 Phase1-7 Phase1 后端核心: - 新增 fsgx_v1.sql 迁移脚本(is_queue_goods/frozen_points/available_points/no_assess) - SystemConfigServices 返佣设置扩展(周期人数/分档比例/范围/时机) - StoreOrderCreateServices 周期循环佣金计算 - StoreOrderTakeServices 佣金发放后同步冻结积分 - StoreProductServices/StoreProduct 保存 is_queue_goods Phase2 后端接口: - GET /api/hjf/brokerage/progress 佣金周期进度 - GET /api/hjf/assets/overview 资产总览 - HjfPointsServices 每日 frozen_points 0.4‰ 释放定时任务 - PUT /adminapi/hjf/member/{uid}/no_assess 不考核接口 - GET /adminapi/hjf/points/release_log 积分日志接口 Phase3 前端清理: - hjfCustom.js 路由精简(仅保留 points/log) - hjfQueue.js/hjfMember.js API 清理/重定向至 CRMEB 原生接口 - pages.json 公排→推荐佣金/佣金记录/佣金规则 Phase4-5 前端改造: - queue/status.vue 推荐佣金进度页整体重写 - 商品详情/订单确认/支付结果页文案与逻辑改造 - 个人中心/资产页/引导页/规则页文案改造 - HjfQueueProgress/HjfRefundNotice/HjfAssetCard 组件改造 - 推广中心嵌入佣金进度摘要 - hjfMockData.js 全量更新(公排字段→佣金字段) Phase6 Admin 增强: - 用户列表新增 frozen_points/available_points 列及不考核操作按钮 - hjfPoints.js USE_MOCK=false 对接真实积分日志接口 Phase7 配置文档: - docs/fsgx-phase7-config-checklist.md 后台配置与全链路验收清单 Made-with: Cursor
2026-03-23 22:32:19 +08:00
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\controller\api\v1\user;
use app\Request;
use app\services\pay\OrderPayServices;
use app\services\pay\PayServices;
use app\services\pay\RechargeServices;
use app\services\pay\YuePayServices;
use app\services\user\UserRechargeServices;
use crmeb\services\CacheService;
use think\annotation\Inject;
use think\exception\ValidateException;
/**
* 充值类
* Class UserRecharge
* @package app\api\controller\user
*/
class UserRecharge
{
/**
* @var UserRechargeServices
*/
#[Inject]
protected UserRechargeServices $services;
/**
* @param Request $request
* @return \think\Response
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @author 等风来
* @email 136327134@qq.com
* @date 2023/9/19
*/
public function recharge(Request $request)
{
[$price, $recharId, $type, $from] = $request->postMore([
['price', 0],
['rechar_id', 0],
['type', 0],
['from', 'weixin']
], true);
if (!$price || $price <= 0) return app('json')->fail('充值金额不能为0元!');
if (!in_array($type, [0, 1])) return app('json')->fail('充值方式不支持!');
if (!in_array($from, ['weixin', 'weixinh5', 'routine'])) return app('json')->fail('充值方式不支持');
$storeMinRecharge = sys_config('store_user_min_recharge');
if ($price < $storeMinRecharge) return app('json')->fail('充值金额不能低于' . $storeMinRecharge);
$uid = (int)$request->uid();
$re = $this->services->recharge($uid, $price, $recharId, $type, $from);
if ($re) {
return app('json')->successful($type == 1 ? '操作成功' : '订单生成成功', ['order_id' => $re['data']['order_id'] ?? '']);
}
return app('json')->fail('充值订单生产失败');
}
/**
* 充值订单支付
* @param Request $request
* @return \think\Response
*/
public function recharge_pay(Request $request)
{
[$uni, $payType, $from, $quitUrl] = $request->postMore([
['uni', ''],
['paytype', 'weixin'],
['from', 'weixin'],
['quitUrl', '']
], true);
$info['order_id'] = $uni;
$recharge = $this->services->getOne(['order_id' => $uni]);
if (!$recharge) {
throw new ValidateException('订单失效或者不存在');
}
if ($recharge['paid'] == 1) {
throw new ValidateException('订单已支付');
}
if (($from == 'routine' ? 'routine' : $payType) != $recharge['recharge_type']) {
$res = $this->services->update(['order_id' => $uni], ['recharge_type' => $payType]);
if (!$res) {
throw new ValidateException('订单支付方式修改失败');
}
}
$orderInfo = $recharge->toArray();
$order_id = $orderInfo['order_id'];
$info = compact('order_id');
$orderInfo['pay_price'] = $recharge['price'];
switch ($payType) {
case PayServices::WEIXIN_PAY:
if ($orderInfo['paid']) return app('json')->fail('已支付!');
/** @var OrderPayServices $payServices */
$payServices = app()->make(OrderPayServices::class);
$info['jsConfig'] = $payServices->orderPay($orderInfo, $from);
if ($from == 'weixinh5') {
return app('json')->status('wechat_h5_pay', '前往支付', $info);
} else {
return app('json')->status('wechat_pay', '前往支付', $info);
}
break;
case PayServices::ALIPAY_PAY:
if (!$quitUrl && ($request->isH5() || $request->isWechat())) {
return app('json')->status('pay_error', '请传入支付宝支付回调URL', $info);
}
/** @var OrderPayServices $payServices */
$payServices = app()->make(OrderPayServices::class);
$info['jsConfig'] = $payServices->alipayOrder($orderInfo, $quitUrl, $request->isRoutine());
$payKey = md5($orderInfo['order_id']);
CacheService::set($payKey, ['order_id' => $orderInfo['order_id'], 'other_pay_type' => true], 300);
$info['pay_key'] = $payKey;
return app('json')->status(PayServices::ALIPAY_PAY . '_pay', '前往支付', $info);
break;
default:
return app('json')->fail('未知支付方式');
}
}
/**
* 充值额度选择
* @return mixed
*/
public function index()
{
$rechargeQuota = sys_data('user_recharge_quota') ?? [];
$data['recharge_quota'] = $rechargeQuota;
$recharge_attention = sys_config('recharge_attention');
$recharge_attention = explode("\n", $recharge_attention);
$data['recharge_attention'] = $recharge_attention;
$data['user_extract_balance_status'] = (int)sys_config('user_extract_balance_status', 1);
return app('json')->successful($data);
}
}