|
|
@@ -2,12 +2,13 @@
|
|
|
|
|
|
namespace app\api\controller\user;
|
|
|
|
|
|
-use app\admin\model\system\SystemConfig;
|
|
|
-use app\models\store\StoreOrder;
|
|
|
use app\models\user\UserBill;
|
|
|
use app\models\user\UserExtract;
|
|
|
use app\Request;
|
|
|
+use crmeb\services\payment\PaymentService;
|
|
|
use crmeb\services\UtilService;
|
|
|
+use think\facade\Log;
|
|
|
+use tw\redis\UserRds;
|
|
|
|
|
|
/**
|
|
|
* 提现类
|
|
|
@@ -17,45 +18,135 @@ use crmeb\services\UtilService;
|
|
|
class UserExtractController
|
|
|
{
|
|
|
/**
|
|
|
- * 提现银行
|
|
|
- * @param Request $request
|
|
|
- * @return mixed
|
|
|
+ * @api {get} /extract/bank 提现银行
|
|
|
+ * @apiName ExtractBank
|
|
|
+ * @apiGroup Brokerage
|
|
|
+ *
|
|
|
+ * @apiSuccess {float} broken_commission 冻结佣金
|
|
|
+ * @apiSuccess {float} brokerage_price 总佣金
|
|
|
+ * @apiSuccess {float} commissionCount 可提现佣金
|
|
|
+ * @apiSuccess {string[]} extractBank 银行列表
|
|
|
+ * @apiSuccess {float} minPrice 最小提现金额
|
|
|
*/
|
|
|
public function bank(Request $request)
|
|
|
{
|
|
|
$user = $request->user();
|
|
|
// 佣金冻结时间
|
|
|
- $broken_time = intval(sys_config('extract_time'));
|
|
|
- $search_time = time() - 86400 * $broken_time;
|
|
|
+ $frozen_days = intval(sys_config('extract_time'));
|
|
|
+ $frozen_from = time() - 86400 * $frozen_days;
|
|
|
//可提现佣金
|
|
|
- //返佣 +
|
|
|
$brokerage_commission = UserBill::where(['uid' => $user['uid'], 'category' => 'now_money', 'type' => 'brokerage'])
|
|
|
- ->where('add_time', '>', $search_time)
|
|
|
+ ->where('add_time', '>', $frozen_from)
|
|
|
->where('pm', 1)
|
|
|
->sum('number');
|
|
|
- //退款退的佣金 -
|
|
|
$refund_commission = UserBill::where(['uid' => $user['uid'], 'category' => 'now_money', 'type' => 'brokerage'])
|
|
|
- ->where('add_time', '>', $search_time)
|
|
|
+ ->where('add_time', '>', $frozen_from)
|
|
|
->where('pm', 0)
|
|
|
->sum('number');
|
|
|
- $data['broken_commission'] = bcsub($brokerage_commission, $refund_commission, 2);
|
|
|
- if ($data['broken_commission'] < 0)
|
|
|
+ $data['broken_commission'] = floatval(bcsub($brokerage_commission, $refund_commission, 2));
|
|
|
+ if ($data['broken_commission'] < 0) {
|
|
|
$data['broken_commission'] = 0;
|
|
|
-// return $data;
|
|
|
+ }
|
|
|
+
|
|
|
$data['brokerage_price'] = $user['brokerage_price'];
|
|
|
//可提现佣金
|
|
|
- $data['commissionCount'] = $data['brokerage_price'] - $data['broken_commission'];
|
|
|
+ $data['commissionCount'] = floatval(bcsub($data['brokerage_price'], $data['broken_commission'], 2));
|
|
|
$extractBank = sys_config('user_extract_bank') ?? []; //提现银行
|
|
|
$extractBank = str_replace("\r\n", "\n", $extractBank);//防止不兼容
|
|
|
$data['extractBank'] = explode("\n", is_array($extractBank) ? (isset($extractBank[0]) ? $extractBank[0] : $extractBank) : $extractBank);
|
|
|
$data['minPrice'] = sys_config('user_extract_min_price');//提现最低金额
|
|
|
+ // 输入记忆
|
|
|
+ $ur = new UserRds();
|
|
|
+ $cach = $ur->gets($user['uid'], ['wxpayName', 'bankCardNo', 'bankUser', 'bankName']);
|
|
|
+ $data['wxpayName'] = $cach['wxpayName'];
|
|
|
+ $data['bankCardNo'] = $cach['bankCardNo'];
|
|
|
+ $data['bankUser'] = $cach['bankUser'];
|
|
|
+ $data['bankName'] = $cach['bankName'];
|
|
|
+
|
|
|
return app('json')->successful($data);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 提现申请
|
|
|
- * @param Request $request
|
|
|
- * @return mixed
|
|
|
+ * @api {post} /extract/bank_fee 查询银行提现手续费
|
|
|
+ * @apiName PostExtractBankFee
|
|
|
+ * @apiGroup Brokerage
|
|
|
+ *
|
|
|
+ * @apiBody {int} extract_type 提现类型/通道
|
|
|
+ * @apiBody {float} money 提现金额
|
|
|
+ *
|
|
|
+ * @apiSuccess {float} rate 手续费率
|
|
|
+ * @apiSuccess {float} min 最少收取
|
|
|
+ * @apiSuccess {float} max 最多收取
|
|
|
+ * @apiSuccess {float} fee 当前收取
|
|
|
+ * @apiSuccess {float} valid 实际到帐金额
|
|
|
+ */
|
|
|
+ public function bank_fee(Request $request)
|
|
|
+ {
|
|
|
+ $rate = 0.01; // 1%
|
|
|
+ $min = 1; //
|
|
|
+ $max = 25; //
|
|
|
+
|
|
|
+ $extractInfo = UtilService::postMore([
|
|
|
+ ['alipay_code', ''],
|
|
|
+ ['extract_type', ''],
|
|
|
+ ['money', 0],
|
|
|
+ ['name', ''],
|
|
|
+ ['bankname', ''],
|
|
|
+ ['cardnum', ''],
|
|
|
+ ['weixin', ''],
|
|
|
+ ], $request);
|
|
|
+ $user = $request->user();
|
|
|
+
|
|
|
+
|
|
|
+ if ($extractInfo['extract_type'] != 'bank') {
|
|
|
+ return app('json')->fail('不是银行卡提现');
|
|
|
+ }
|
|
|
+ if ($extractInfo['money'] < sys_config('user_extract_min_price')) {
|
|
|
+ return app('json')->fail('金额小于最低提现金额');
|
|
|
+ }
|
|
|
+
|
|
|
+ // 手续费
|
|
|
+ $fee = floatval(bcmul($extractInfo['money'], 0.01, 2));
|
|
|
+ if ($fee < $min) {
|
|
|
+ $fee = $min;
|
|
|
+ }
|
|
|
+ if ($fee > $max) {
|
|
|
+ $fee = $max;
|
|
|
+ }
|
|
|
+ // 实际到帐金额
|
|
|
+ $valid = floatval(bcsub($extractInfo['money'], $fee, 2));
|
|
|
+
|
|
|
+ return app('json')->successful([
|
|
|
+ 'rate' => $rate, // 费率
|
|
|
+ 'min' => $min, // 最少收费
|
|
|
+ 'max' => $max, // 最大收费
|
|
|
+ 'fee' => $fee, // 当前收费
|
|
|
+ 'valid'=> $valid, // 实际到帐
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @api {post} /extract/cash 提现申请
|
|
|
+ * @apiName ExtractCash
|
|
|
+ * @apiGroup Brokerage
|
|
|
+ *
|
|
|
+ * @apiBody {string} alipay_code 支付宝号码
|
|
|
+ * @apiBody {string="alipay","bank","weixin"} extract_type 提现类型
|
|
|
+ * @apiBody {float} money 提现金额
|
|
|
+ * @apiBody {string} bankName 开户行
|
|
|
+ * @apiBody {string} cardnum 卡号
|
|
|
+ * @apiBody {string} name 微信实名/银行户名/支付宝帐号
|
|
|
+ * @apiBody {string} weixin 微信实名
|
|
|
+ *
|
|
|
+ * @apiSuccessExample:
|
|
|
+ * {
|
|
|
+ *
|
|
|
+ * }
|
|
|
+ * @apiErrorExample:
|
|
|
+ * {
|
|
|
+ *
|
|
|
+ * }
|
|
|
+ *
|
|
|
*/
|
|
|
public function cash(Request $request)
|
|
|
{
|
|
|
@@ -68,37 +159,13 @@ class UserExtractController
|
|
|
['cardnum', ''],
|
|
|
['weixin', ''],
|
|
|
], $request);
|
|
|
- if (!preg_match('/^(([1-9][0-9]*)|(([0]\.\d{1,2}|[1-9][0-9]*\.\d{1,2})))$/', $extractInfo['money'])) return app('json')->fail('提现金额输入有误');
|
|
|
- //提现设置最低金额
|
|
|
- if($extractInfo['money'] < sys_config('user_extract_min_price')) return app('json')->fail('金额小于最低提现金额');
|
|
|
$user = $request->user();
|
|
|
- $broken_time = intval(sys_config('extract_time'));
|
|
|
- $search_time = time() - 86400 * $broken_time;
|
|
|
- //可提现佣金
|
|
|
- //返佣 +
|
|
|
- $brokerage_commission = UserBill::where(['uid' => $user['uid'], 'category' => 'now_money', 'type' => 'brokerage'])
|
|
|
- ->where('add_time', '>', $search_time)
|
|
|
- ->where('pm', 1)
|
|
|
- ->sum('number');
|
|
|
- //退款退的佣金 -
|
|
|
- $refund_commission = UserBill::where(['uid' => $user['uid'], 'category' => 'now_money', 'type' => 'brokerage'])
|
|
|
- ->where('add_time', '>', $search_time)
|
|
|
- ->where('pm', 0)
|
|
|
- ->sum('number');
|
|
|
- $data['broken_commission'] = bcsub($brokerage_commission, $refund_commission, 2);
|
|
|
- if ($data['broken_commission'] < 0)
|
|
|
- $data['broken_commission'] = 0;
|
|
|
- $data['brokerage_price'] = $user['brokerage_price'];
|
|
|
- //可提现佣金
|
|
|
- $commissionCount = $data['brokerage_price'] - $data['broken_commission'];
|
|
|
- if ($extractInfo['money'] > $commissionCount) return app('json')->fail('可提现佣金不足');
|
|
|
- if (!$extractInfo['cardnum'] == '')
|
|
|
- if (!preg_match('/^([1-9]{1})(\d{14}|\d{18})$/', $extractInfo['cardnum']))
|
|
|
- return app('json')->fail('银行卡号输入有误');
|
|
|
- if (UserExtract::userExtract($request->user(), $extractInfo)) {
|
|
|
+
|
|
|
+ list($suc, $msg) = PaymentService::user_request_extract($user, $extractInfo);
|
|
|
+ if ($suc) {
|
|
|
return app('json')->successful('申请提现成功!');
|
|
|
} else {
|
|
|
- return app('json')->fail(UserExtract::getErrorInfo('提现失败'));
|
|
|
+ return app('json')->fail($msg);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -110,9 +177,59 @@ class UserExtractController
|
|
|
* 1. 满足对应提现通道要求,微信支付:每个用户1天限1次,每次限200, 平台每日限额 200,000
|
|
|
* 2. 15 日内必须有退款订单。且30日内退款订单金额 > 提现金额
|
|
|
* 3. 其他基本需求(最低提现限额等等)
|
|
|
+ *
|
|
|
+ * 不满足体现条件,则交给人工处理
|
|
|
+ * API 执行失败,则必须重新提交提现请求,因为人工操作也是失败。
|
|
|
+ * 如果API 返回 SYSTEMERROR, 则按照原订单参数重新提交。
|
|
|
*/
|
|
|
- public function cash_now(Request $request)
|
|
|
+ public function flash_cash(Request $request)
|
|
|
{
|
|
|
+ // 提交申请
|
|
|
+ $extractInfo = UtilService::postMore([
|
|
|
+ ['alipay_code', ''],
|
|
|
+ ['extract_type', ''],
|
|
|
+ ['money', 0],
|
|
|
+ ['name', ''],
|
|
|
+ ['bankname', ''],
|
|
|
+ ['cardnum', ''],
|
|
|
+ ['weixin', ''],
|
|
|
+ ], $request);
|
|
|
+ $user = $request->user();
|
|
|
+
|
|
|
+ list($suc, $msg) = PaymentService::user_request_extract($user, $extractInfo);
|
|
|
+ if (!$suc) {
|
|
|
+ return app('json')->fail($msg);
|
|
|
+ }
|
|
|
+ $row = $msg;
|
|
|
+ $extractRow = UserExtract::getUserExtractInfo($user['uid'], $row['extract_type'], $row['add_time']);
|
|
|
+ if (!$extractRow) {
|
|
|
+ Log::error('Unbelievable error getUserExtractInfo(' . $user['uid'] . ' ' . $row['add_time']. ')');
|
|
|
+ return app('json')->fail('提交申请失败');
|
|
|
+ }
|
|
|
+ // 检查条件
|
|
|
+ list($suc, $msg) = PaymentService::user_extract_auto_conditions($user);
|
|
|
+ if (!$suc) {
|
|
|
+ // 条件不满足,不进一步处理,相当与交给人工处理
|
|
|
+ return app('json')->fail($msg);
|
|
|
+ }
|
|
|
+
|
|
|
+ // API
|
|
|
+ list($suc, $ec, $es) = PaymentService::extract_by_api($extractRow);
|
|
|
|
|
|
+ if (!$suc) {
|
|
|
+ // API 失败 直接拒绝,因为重试也会大概率失败
|
|
|
+ list($ok, $msg) = PaymentService::user_extract_reject($extractRow['id'], $es);
|
|
|
+ if (!$ok) {
|
|
|
+ errlog('user_extract_reject()' . $extractRow['id']);
|
|
|
+ }
|
|
|
+ return app('json')->fail($es);
|
|
|
+ } else {
|
|
|
+ list($ok, $msg) = PaymentService::user_extract_passed($extractRow);
|
|
|
+ if (!$ok) {
|
|
|
+ errlog('user_extract_passed()' . $extractRow['id']);
|
|
|
+ }
|
|
|
+ return app('json')->successful('提现成功');
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
}
|