wesmiler 2 dni temu
rodzic
commit
04bc4e5166

+ 10 - 0
app/Http/Controllers/Admin/BalanceLogsController.php

@@ -52,6 +52,16 @@ class BalanceLogsController extends Backend
     }
 
     /**
+     * 手动操作打款
+     */
+    public function payment()
+    {
+        $id = request()->input('id');
+        $service = new BalanceLogsService();
+        return $service->payment($this->userId, $id);
+    }
+
+    /**
      * 删除记录
      */
     public function delete()

+ 4 - 0
app/Services/Api/BalanceLogService.php

@@ -231,6 +231,9 @@ class BalanceLogService extends BaseService
             return false;
         }
 
+        $system = isset($params['system']) && $params['system'] ? $params['system'] : [];
+        $platform = isset($system['platform']) && $system['platform']? $system['platform'] : 'mp';
+
         $orderNo = get_order_num('LW');
         $order = [
             'user_id'=> $userId,
@@ -239,6 +242,7 @@ class BalanceLogService extends BaseService
             'type'=>2,
             'account_type'=> $accountType,
             'pay_type'=> $payType, // 收款方式
+            'source'=> $platform,// 提现渠道来源
             'account_remark'=> $accountRemark,
             'realname'=> $payType==10?'微信零钱' : $realname,
             'account'=> $account,

+ 0 - 46
app/Services/Common/BalanceLogService.php

@@ -251,53 +251,7 @@ class BalanceLogService extends BaseService
         return ['id'=>$id,'money'=>$money,'status'=>$status];
     }
 
-    /**
-     * 打款
-     * @param $adminId
-     * @param $params
-     * @return array|false
-     */
-    public function payment($adminId, $params)
-    {
-        $id = isset($params['id'])? intval($params['id']) : 0;
-        $payStatus = isset($params['pay_status'])? intval($params['pay_status']) : 0;
-        $payImg = isset($params['pay_img'])? trim($params['pay_img']) : '';
-        $payImg = $payImg? get_image_path($payImg) : '';
 
-        $info = $this->model->with(['member'])->where(['id'=> $id,'mark'=>1])->first();
-        $userInfo = isset($info['member'])? $info['member'] : [];
-        $orderStatus = isset($info['status'])? $info['status'] : 0;
-        $orderUserId = isset($info['user_id'])? $info['user_id'] : 0;
-        $balance = isset($userInfo['balance'])? $userInfo['balance'] : 0;
-        $money = isset($info['money'])? $info['money'] : 0;
-        if(empty($info) || empty($userInfo) || $orderUserId<=0 || $money<=0){
-            $this->error = '提现信息不存在或参数错误';
-            return false;
-        }
-
-        if($orderStatus != 2){
-            $this->error = '提现订单状态不可操作';
-            return false;
-        }
-
-        if($payStatus != 2){
-            $this->error = '请选择已打款';
-            return false;
-        }
-
-
-        DB::beginTransaction();
-        $updateData = ['pay_status'=> $payStatus,'pay_img'=> $payImg,'update_time'=>time()];
-        if(!$this->model->where(['id'=> $id])->update($updateData)){
-            DB::rollBack();
-            $this->error = '提现打款处理失败';
-            return false;
-        }
-
-        DB::commit();
-        $this->error = '提现打款状态更新成功';
-        return ['id'=>$id,'money'=>$money,'status'=>$payStatus];
-    }
 
     /**
      * 删除

+ 106 - 0
app/Services/Common/BalanceLogsService.php

@@ -2,11 +2,13 @@
 
 namespace App\Services\Common;
 
+use App\Models\AccountLogModel;
 use App\Models\BalanceLogModel;
 use App\Models\MemberModel;
 use App\Models\AgentModel;
 use App\Models\StoreModel;
 use App\Services\BaseService;
+use App\Services\PaymentService;
 use Illuminate\Support\Facades\DB;
 
 /**
@@ -15,6 +17,31 @@ use Illuminate\Support\Facades\DB;
  */
 class BalanceLogsService extends BaseService
 {
+    protected static $instance = null;
+
+    /**
+     * 构造函数
+     * @author laravel开发员
+     * @since 2020/11/11
+     * AccountService constructor.
+     */
+    public function __construct()
+    {
+        $this->model = new BalanceLogModel();
+    }
+
+    /**
+     * 静态入口
+     * @return static|null
+     */
+    public static function make()
+    {
+        if (!self::$instance) {
+            self::$instance = (new static());
+        }
+        return self::$instance;
+    }
+
     /**
      * 获取列表
      * @param array $params 请求参数
@@ -337,6 +364,85 @@ class BalanceLogsService extends BaseService
     }
 
     /**
+     * 打款
+     * @param $adminId
+     * @param $params
+     * @return array|false
+     */
+    public function payment($adminId, $id)
+    {
+        $info = $this->model->with(['member'])->where(['id'=> $id,'mark'=>1])->first();
+        $userInfo = isset($info['member'])? $info['member'] : [];
+        $openid = isset($userInfo['openid'])?$userInfo['openid']:'';
+        $wechatOpenid = isset($userInfo['wechat_openid'])?$userInfo['wechat_openid']:'';
+        $orderStatus = isset($info['status'])? $info['status'] : 0;
+        $payType = isset($info['pay_type'])? $info['pay_type'] : 0;
+        $payStatus = isset($info['pay_status'])? $info['pay_status'] : 0;
+        $orderNo = isset($info['order_no'])? $info['order_no'] : '';
+        $source = isset($info['source'])? $info['source'] : '';
+        $realname = isset($info['realname'])? $info['realname'] : '';
+        $orderUserId = isset($info['user_id'])? $info['user_id'] : 0;
+        $money = isset($info['money'])? $info['money'] : 0;
+        if(empty($info) || $orderUserId<=0 || $money<=0){
+            $this->error = '提现信息不存在或参数错误';
+            return false;
+        }
+
+        if($orderStatus != 2){
+            $this->error = '请先审核提现';
+            return false;
+        }
+
+        if($payStatus != 10){
+            $this->error = '该提现已打款';
+            return false;
+        }
+
+        // 是否微信
+        if($payType != 10){
+            $this->error = '该收款方式未开放线上打款';
+            return false;
+        }
+
+        // 公众号
+        if(empty($openid)){
+            $openid = $wechatOpenid;
+        }
+
+        if(empty($openid)){
+            $this->error = '微信OPENID不为空,请确认该用户已授权登录过';
+            return false;
+        }
+
+        // 微信打款
+        $order = [
+            'order_no'=> $orderNo,
+            'pay_money'=> $money,
+            'account'=> $openid,
+            'real_name'=> $realname,
+            'body'=>'收入提现',
+        ];
+
+        if(!$result = PaymentService::make()->transfer($order)){
+            $this->error = PaymentService::make()->getError();
+            return false;
+        }
+        
+        DB::beginTransaction();
+        $batchId = isset($result['batch_id'])?$result['batch_id']:'';
+        $updateData = ['pay_status'=> 20,'pay_at'=>date('Y-m-d H:i:s'),'batch_id'=>$batchId,'receive_status'=> 2,'update_time'=>time()];
+        if(!$this->model->where(['id'=> $id])->update($updateData)){
+            DB::rollBack();
+            $this->error = '提现打款处理失败';
+            return false;
+        }
+
+        DB::commit();
+        $this->error = '提现打款成功,请提醒用户确认收款';
+        return ['id'=>$id,'money'=>$money,'result'=>$result];
+    }
+
+    /**
      * 更新代理表的累计提现金额
      */
     private function updateAgentWithdrawTotal($record)

+ 116 - 0
app/Services/PaymentService.php

@@ -908,4 +908,120 @@ class PaymentService extends BaseService
         $this->error = '退款处理成功';
         return $refundStatus;
     }
+
+    /**
+     * 企业打款到零钱(商家转账)
+     * @param $order 订单参数:order_no-单号,pay_money-打款金额,account-打款账号(微信openid或支付宝账号),body-打款备注
+     * @param string $scene
+     * @param int $payType
+     * @return bool
+     */
+    public function transfer($order, $scene='withdraw', $payType=10)
+    {
+        $outTradeNo = isset($order['order_no']) && $order['order_no'] ? $order['order_no'] : get_order_num('WD');
+        $body = isset($order['body']) ? $order['body'] : '';
+        $amount = isset($order['pay_money']) ? $order['pay_money'] : 0;
+        $account = isset($order['account']) ? $order['account'] : '';  // 微信openid或支付宝账号
+        $realName = isset($order['real_name']) ? $order['real_name'] : '';  // 实名
+        if ($amount < 0) {
+            $this->error = '打款金额错误';
+            return false;
+        }
+
+        if(empty($account)){
+            $this->error = $payType == 10? '缺少微信OPENID' : '支付宝账户不为空';
+            return false;
+        }
+
+        // 创建支付
+        $result = [];
+        try {
+            $config = ConfigService::make()->getConfigOptionByGroup(6);
+            if ($payType == 10) {
+                $appid = isset($config['wxpay_appid']) ? $config['wxpay_appid'] : '';
+                $payData = [
+                    '_action' => 'mch_transfer', // 微信官方老版本下线后,此部分可省略
+                    'appid' => $appid,
+                    'out_bill_no' => $outTradeNo,
+                    'transfer_scene_id' => '1000',
+                    'openid' => $account,
+                    'transfer_amount' => intval($amount * 100),
+                    'transfer_remark' => $body?$body:'收入提现',
+                    'user_recv_perception' => $body? $body : '收入提现',
+                    "transfer_scene_report_infos"=> [
+                        [
+                            "info_type" => "活动名称",
+                            "info_content" => "收入提现"
+                        ],
+                        [
+                            "info_type" => "奖励说明",
+                            "info_content" => "用户收入提现"
+                        ]
+                    ],
+                ];
+
+                $pay = $this->createPay($scene, $payType);
+                RedisService::set("caches:payments:wechat:{$scene}_{$outTradeNo}_pay", ['order' => $order, 'config' => $this->config], 7200);
+                if (empty($pay)) {
+                    $this->error = '微信打款失败';
+                    return false;
+                }
+
+
+                $result = $pay->transfer($payData);
+                RedisService::set("caches:payments:wechat:{$scene}_{$outTradeNo}_result", ['order' => $order,'result'=> $result, 'config' => $this->config], 7200);
+                $msg = isset($result['message'])? trim($result['message']) : '';
+                $batchId = isset($result['batch_id'])? trim($result['batch_id']) : '';
+                if(empty($batchId)){
+                    $this->error = $msg? $msg : '微信打款失败';
+                    return false;
+                }
+
+                $this->error = '微信打款成功';
+                return ['order_no'=> $outTradeNo,'batch_id'=> $batchId,'result'=>$result];
+            }else if ($payType == 20){
+                $payData = [
+                    'out_biz_no'   => $outTradeNo,//商户订单号,内部订单号
+                    'trans_amount' => $amount,  //订单总金额,单位为元,精确到小数点后两位,
+                    'biz_scene'    => 'DIRECT_TRANSFER',  //描述特定的业务场景,可传的参数如下:DIRECT_TRANSFER:单笔无密转账到支付宝,B2C现金红包PERSONAL_COLLECTION:C2C现金红包-领红包
+                    'product_code' => 'TRANS_ACCOUNT_NO_PWD',  //业务产品码,单笔无密转账到支付宝账户固定为:TRANS_ACCOUNT_NO_PWD;收发现金红包固定为:STD_RED_PACKET;
+                    'remark'       => $body? $body : '提现',//业务备注
+                    'order_title'  => $body? $body : '提现',//转账业务的标题,用于在支付宝用户的账单里显示
+                    'payee_info'   => [
+                        'identity'      => $account,//参与方的唯一标识'208823395231'
+                        'name'      => $realName,//参与方的唯一标识'208823395231'
+                        'identity_type' => 'ALIPAY_LOGON_ID',//参与方的标识类型,目前支持如下类型:1、ALIPAY_USER_ID 支付宝的会员ID2、ALIPAY_LOGON_ID:支付宝登录号,支持邮箱和手机号格式3、ALIPAY_OPEN_ID:支付宝openid
+                    ],//收款方信息
+                ];
+                $pay = $this->createPay($scene, $payType);
+                RedisService::set("caches:payments:alipay:{$scene}_{$outTradeNo}_pay", ['order' => $order, 'config' => $this->config], 7200);
+                if (empty($pay)) {
+                    $this->error = '支付宝打款失败';
+                    return false;
+                }
+
+
+                $result = $pay->transfer($payData);
+                RedisService::set("caches:payments:alipay:{$scene}_{$outTradeNo}_result", ['order' => $order,'result'=> $result, 'config' => $this->config], 7200);
+                $code = isset($result['code'])? intval($result['code']) : '';
+                $msg = isset($result['sub_msg'])? trim($result['sub_msg']) : '';
+                if($code != 10000){
+                    $this->error = $msg? $msg : '支付宝打款失败';
+                    return false;
+                }
+                $this->error = '支付宝打款成功';
+                return $result;
+            }else if($payType == 50){
+                $this->error = '银行卡打款未开通';
+                return false;
+            }
+
+            $this->error = '打款失败';
+            return false;
+        } catch (\Exception $exception) {
+            RedisService::set("caches:payments:trabsfer:{$scene}_{$outTradeNo}_error", ['order' => $order,'error'=>$exception->getTrace(), 'config' => $this->config], 7200);
+            $this->error = $exception->getMessage();
+            return false;
+        }
+    }
 }

+ 1 - 0
routes/web.php

@@ -174,6 +174,7 @@ Route::get('/balanceLogs/index', [\App\Http\Controllers\Admin\BalanceLogsControl
 Route::get('/balanceLogs/info', [\App\Http\Controllers\Admin\BalanceLogsController::class, 'info']);
 Route::post('/balanceLogs/apply', [\App\Http\Controllers\Admin\BalanceLogsController::class, 'apply']);
 Route::post('/balanceLogs/audit', [\App\Http\Controllers\Admin\BalanceLogsController::class, 'audit']);
+Route::post('/balanceLogs/payment', [\App\Http\Controllers\Admin\BalanceLogsController::class, 'payment']);
 Route::post('/balanceLogs/delete', [\App\Http\Controllers\Admin\BalanceLogsController::class, 'delete']);
 Route::post('/balanceLogs/deleteAll', [\App\Http\Controllers\Admin\BalanceLogsController::class, 'deleteAll']);