joe 4 роки тому
батько
коміт
6a99566bff

+ 10 - 11
app/api/controller/user/UserExtractController.php

@@ -5,6 +5,7 @@ namespace app\api\controller\user;
 use app\models\user\UserBill;
 use app\models\user\UserExtract;
 use app\Request;
+use crmeb\payment\MachantPay;
 use crmeb\services\payment\PaymentService;
 use crmeb\services\UtilService;
 use think\facade\Log;
@@ -82,10 +83,6 @@ class UserExtractController
      */
     public function bank_fee(Request $request)
     {
-        $rate = 0.01;  // 1%
-        $min = 1;   //
-        $max = 25;  //
-
         $extractInfo = UtilService::postMore([
             ['alipay_code', ''],
             ['extract_type', ''],
@@ -104,15 +101,17 @@ class UserExtractController
         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;
+        
+        $bankMax = 1000; // 银行渠道限额
+        if ($extractInfo['money'] > $bankMax) {
+            return app('json')->fail("金额不能超过 $bankMax 元");
         }
-        if ($fee > $max) {
-            $fee = $max;
+
+        list($ok, $fee, $rate, $min, $max) = MachantPay::toBankByWeixinFee($extractInfo['money']);
+        if (!$ok) {
+            return app('json')->fail('金额错误');
         }
+
         // 实际到帐金额
         $valid = floatval(bcsub($extractInfo['money'], $fee, 2));
 

+ 2 - 0
config/activity.php

@@ -29,4 +29,6 @@ return [
     'lucky_daily_opens' => [],
     // 注册送钱
     'register_money' => 5.0,
+    // 免费提现
+    'bank_extract_free' => false, 
 ];

+ 33 - 0
crmeb/payment/MachantPay.php

@@ -117,6 +117,39 @@ class MachantPay {
         }
     }
 
+    /**
+     * 微信支付提现到银行卡的手续费
+     * 
+     * 本函数不考虑各种环节的限额。
+     * 
+     * @param float|string|int $amount: 提现金额
+     * @return [bool, float, float, int, int] : 第一个值表示成功否,成功的前提是 提现金额 > 手续费,否则没意义。
+     */
+    public static function toBankByWeixinFee($amount)
+    {
+        $min = 1;
+        $max = 25;
+        $rate = 0.01;
+
+        if ($amount < $min) {
+            return [false, 0, $rate, $min, $max,];
+        }
+
+        $fee = floatval(bcmul($amount, $rate, 2));
+        if ($fee < $min) {
+            $fee = $min;
+        } else if ($fee > $max) {
+            $fee = $max;
+        }
+        // 是否免手续费
+        $free = Config::get('activity.bank_extract_free', false);
+        if ($free) {
+            $fee = 0;
+        }
+
+        return [true, $fee, $rate, $min, $max];
+    }
+
     /**
      * 通过微信支付付款到银行卡
      * 

+ 6 - 1
crmeb/services/payment/PaymentService.php

@@ -173,7 +173,12 @@ class PaymentService
                     'bankUser' => $extractInfo['real_name'],
                     'bankName' => $extractInfo['bank_address'],
                 ]);
-                return MachantPay::toBankByWeixin($trade_no, $extractInfo['extract_price'], $extractInfo['bank_code'], $extractInfo['real_name'], $extractInfo['bank_address']);
+                list($ok, $fee) = MachantPay::toBankByWeixinFee($extractInfo['extract_price']);
+                if (!$ok) {
+                    return [false, -10001, '金额错误'];
+                }
+                $valid = $extractInfo['extract_price'] - $fee;
+                return MachantPay::toBankByWeixin($trade_no, $valid, $extractInfo['bank_code'], $extractInfo['real_name'], $extractInfo['bank_address']);
             default:
                 // 其他情况不处理,返回失败
                 errlog('unbelievable error: extract_type='. $extractInfo['extract_type']);