toArray(); } if (empty($order)) { throw new \Exception('待支付订单不存在'); } //获取支付场景 $pay_way = PayWay::alias('pw') ->join('dev_pay_config dp', 'pw.pay_config_id = dp.id') ->where(['pw.scene' => $terminal, 'pw.status' => YesNoEnum::YES]) ->field('dp.id,dp.name,dp.pay_way,dp.icon,dp.sort,dp.remark,pw.is_default') ->order('pw.is_default desc,dp.sort desc,id asc') ->select() ->toArray(); foreach ($pay_way as $k => &$item) { if ($item['pay_way'] == PayEnum::WECHAT_PAY) { $item['extra'] = '微信快捷支付'; } if ($item['pay_way'] == PayEnum::ALI_PAY) { $item['extra'] = '支付宝快捷支付'; } if ($item['pay_way'] == PayEnum::BALANCE_PAY) { $user_money = User::where(['id' => $userId])->value('user_money'); $item['extra'] = '可用余额:' . $user_money; } // 充值时去除余额支付 if ($params['from'] == 'recharge' && $item['pay_way'] == PayEnum::BALANCE_PAY) { unset($pay_way[$k]); } } return [ 'lists' => array_values($pay_way), 'order_amount' => $order['order_amount'], ]; } catch (\Exception $e) { self::setError($e->getMessage()); return false; } } /** * @notes 获取支付状态 * @param $params * @return array|false * @author 段誉 * @date 2023/3/1 16:23 */ public static function getPayStatus($params) { try { $order = []; $orderInfo = []; switch ($params['from']) { case 'recharge': $order = RechargeOrder::where(['user_id' => $params['user_id'], 'id' => $params['order_id']]) ->findOrEmpty(); $payTime = empty($order['pay_time']) ? '' : date('Y-m-d H:i:s', $order['pay_time']); $orderInfo = [ 'order_id' => $order['id'], 'order_sn' => $order['sn'], 'order_amount' => $order['order_amount'], 'pay_way' => PayEnum::getPayDesc($order['pay_way']), 'pay_status' => PayEnum::getPayStatusDesc($order['pay_status']), 'pay_time' => $payTime, ]; break; } if (empty($order)) { throw new \Exception('订单不存在'); } return [ 'pay_status' => $order['pay_status'], 'pay_way' => $order['pay_way'], 'order' => $orderInfo ]; } catch (\Exception $e) { self::setError($e->getMessage()); return false; } } /** * @notes 获取预支付订单信息 * @param $params * @return RechargeOrder|array|false|\think\Model * @author 段誉 * @date 2023/2/27 15:19 */ public static function getPayOrderInfo($params,$user_id) { // order_type 0为茶艺师 1为茶室支付 2购买套餐 3购买会员 4充值 7.续费 try { switch ($params['from']) { case 'recharge': $order = RechargeOrder::findOrEmpty($params['order_id']); if ($order->isEmpty()) { throw new \Exception('充值订单不存在'); } break; case 'balance': if($params['order_type'] == 1){ $order = OrderStore::where("id",$params['order_id'])->find(); }elseif($params['order_type'] == 2){ $order = OrderGroup::where("id",$params['order_id'])->find(); }elseif($params['order_type'] == 7){ $order = OrderStoreRenew::where("id",$params['order_id'])->find(); $order['order_amount'] =$order->price; } $user = User::where("id",$user_id)->find(); if($params['pay_way'] == 3){ $user_store_money = UserStoreMoney::where("user_id",$user_id)->where("store_id",$params['store_id'])->find(); if($user_store_money==null){ throw new \Exception('余额不足'); } $user['user_money'] = $user_store_money['money']; } if ($order['order_amount'] > $user['user_money']) { throw new \Exception('余额不足'); } break; case 'wx': if($params['order_type'] == 0){ $order = Order::where("id",$params['order_id'])->find(); }elseif($params['order_type'] == 1){ $order = OrderStore::where("id",$params['order_id'])->find(); }elseif($params['order_type'] == 2) { $order = OrderGroup::where("id", $params['order_id'])->find(); }elseif($params['order_type'] == 3){ $order_sn = createSn("order_store","order_sn"); $price = ConfigService::get("member","price"); $r = OrderMember::create([ 'order_sn'=>$order_sn, 'pay_way'=>$params['pay_way'], 'order_amount'=> $price, 'user_id'=>$user_id, 'dtime'=>date("Y-m-d H:i:s") ]); //0为茶艺师 1为茶室支付 2购买套餐 3购买会员 4充值 OrderStore::orderAll("order_member",3,$order_sn,0,$price,$user_id); $order = OrderMember::where("id",$r->id)->find(); }elseif($params['order_type'] == 7){ $order = OrderStoreRenew::where("id", $params['order_id'])->find(); $order['order_amount'] = $order['price']; } break; } return $order; } catch (\Exception $e) { self::$error = $e->getMessage(); return false; } } /** * @notes 获取预支付订单信息 * @param $params * @return RechargeOrder|array|false|\think\Model * @author Yzt * @date 2026/1/02 15:19 */ public static function getPayInfo($params,$user_id) { // order_type 0为茶艺师 1为茶室支付 2购买套餐 3购买会员 4充值 7.续费 10预定茶艺师 11茶艺师续订 try { switch ($params['order_type']) { case '9': $order = OrderStoreRecharge::where([ 'id'=>$params['order_id'], ])->find(); if($order->pay_status == 1){ throw new \Exception("订单已支付"); } break; case '10': $order = OrderTeamaster::where([ 'id'=>$params['order_id'], ])->find(); if($order->pay_status == 1){ throw new \Exception("订单已支付"); } if($order->order_status !==10){ throw new \Exception("订单已取消"); } break; case '11': $order = OrderTeamasterRenew::where([ 'id'=>$params['order_id'], ])->find(); if(!$order){ throw new \Exception("订单错误订单不存在"); } if($order->pay_status == 1){ throw new \Exception("订单已支付"); } $order['order_amount'] =$order['price']; break; default: } return $order; } catch (\Exception $e) { self::$error = $e->getMessage(); return false; } } /** * @notes 支付 * @param $payWay * @param $from * @param $order * @param $terminal * @param $redirectUrl * @return array|false|mixed|string|string[] * @throws \Exception * @author mjf * @date 2024/3/18 16:49 */ public static function pay($order_type,$payWay, $from, $order, $terminal, $redirectUrl) { // 支付编号-仅为微信支付预置(同一商户号下不同客户端支付需使用唯一订单号) $paySn = $order['order_sn']; if ($payWay == PayEnum::WECHAT_PAY) { $paySn = self::formatOrderSn($order['order_sn'], $terminal); } //更新支付方式 switch ($from) { case 'recharge': RechargeOrder::update(['pay_way' => $payWay, 'pay_sn' => $paySn], ['id' => $order['id']]); break; } // if ($order['order_amount'] == 0) { // PayNotifyLogic::handle($from, $order['sn']); // return ['pay_way' => PayEnum::BALANCE_PAY]; // } $payService = null; switch ($payWay) { case PayEnum::WECHAT_PAY: $payService = (new WeChatPayService($terminal, $order['user_id'] ?? null)); $order['pay_sn'] = $paySn; $order['redirect_url'] = $redirectUrl; $result = $payService->pay($order_type,$from, $order); break; case PayEnum::ALI_PAY: $payService = (new AliPayService($terminal)); $order['redirect_url'] = $redirectUrl; $result = $payService->pay($from, $order); break; default: self::$error = '订单异常'; $result = false; } if (false === $result && !self::hasError()) { self::setError($payService->getError()); } return $result; } public static function balancePay($order,$params){ Db::startTrans(); try { $user = User::where('id',$order['user_id'])->find(); if(!$user){ throw new \Exception("用户不存在"); } if($order->order_amount > $user->user_money){ throw new \Exception("余额不足"); } if($order->pay_status == 1){ throw new \Exception("订单已支付"); } $user_money = $user->user_money-$order->order_amount; $user->user_money =$user_money; $user->save(); switch ($params['order_type']) { case '10': $result = self::orderTeamaster($order); break; case '11': $result = self::orderTeamaRenw($order); break; default: } Db::commit(); return []; } catch (\Exception $e) { Db::rollback(); self::$error = $e->getMessage(); return false; } } public static function orderTeamaster($order){ if($order->user_coupon_id !=0){ $user_coupon=UserCoupon::where([ 'id'=>$order->user_coupon_id, 'type_id'=>1, 'status'=>0 ])->find(); if(!$user_coupon ){ throw new \Exception("优惠券已被核销"); } $user_coupon->status = 1; $user_coupon->save(); } $data = [ 'pay_status'=>1, 'order_status'=>28, 'pay_time'=>time() ]; $user_account_log = [ "sn"=>createSn("user_account_log","sn"), "user_id"=>$order->user_id, "change_object"=>1, "change_type"=>11, "action"=>2, "amount"=>$order->order_amount, "before_amount"=>0, "after_amount"=>0, "source_sn"=>$order->order_sn, "store_id"=>0, "remark"=>'茶艺师订单', "create_time"=>time() ]; self::getUserAccountLog($user_account_log); $order = OrderTeamaster::where('id',$order->id)->update($data); return []; } public static function orderTeamaRenw($order){ $is_renewal = 0; $hours = $order->hours; $is_tea = 0; $renew_price = 0; $renew_tea_price =0; $change_type = 2; $source_order = OrderTeamaster::where('id',$order->source_id)->find(); $renew_income_price =$order->price*0.35; $team_income_price = $source_order->team_income_price+$renew_income_price; $end_time = $source_order->end_time+($hours * 3600); $remark = '茶艺师续时'; if($order->type == 1){ $is_renewal =1; $renew_price =$source_order->server_price*$hours; }elseif ($order->type == 2){ $is_tea =1; $renew_tea_price =$order->tea_price; $change_type = 3; $remark = '需茶'; }elseif ($order->type == 3){ $is_tea =1; $renew_tea_price =$order->tea_price; $is_renewal =1; $renew_price =$source_order->server_price*$hours; $remark = '茶艺师续时+续茶'; } $renw_data = [ 'pay_status'=>1, 'pay_dtime'=>time() ]; $data = [ 'is_renewal'=>$is_renewal, 'is_tea'=>$is_tea, 'renew_tea_price'=>$renew_tea_price+$source_order->renew_tea_price, 'renew_price'=>$renew_price+$source_order->renew_price, 'renew_hour'=>$hours+$source_order->renew_hour, 'team_income_price'=>$team_income_price, 'end_time'=>$end_time ]; $team_user = TeamasterUser::where('id',$source_order->team_user_id)->find(); $account_log = [ 'team_user_id'=>$source_order->team_user_id, 'user_id'=>$order->user_id, 'change_object'=>1, 'change_type'=>$change_type, 'action'=>1, 'amount'=>$order->price, 'before_amount'=>$team_user->user_money, 'after_amount'=>$team_user->user_money+$renew_income_price, 'source_sn'=>$source_order->order_sn, 'sub_sn'=>$order->order_sn, 'remark'=>$remark, 'create_time'=>time() ]; $user_account_log = [ "sn"=>createSn("user_account_log","sn"), "user_id"=>$order->user_id, "change_object"=>1, "change_type"=>11, "action"=>2, "amount"=>$order->price, "before_amount"=>0, "after_amount"=>0, "source_sn"=>$order->order_sn, "store_id"=>0, "remark"=>$remark, "create_time"=>time() ]; $renw_order = OrderTeamasterRenew::where('id',$order->id)->update($renw_data); $team_order = OrderTeamaster::where('id',$source_order->id)->update($data); self::getTeamasterAccountLog($account_log); self::getUserAccountLog($user_account_log); return []; } public static function getTeamasterAccountLog($account_log){ TeamasterAccountLog::create($account_log); return []; } public static function getUserAccountLog($user_account_log){ UserAccountLog::create($user_account_log); } /** * @notes 创建支付数据 * @param $orderSn * @param $terminal * @return string * @author 胥聪 * @date 2025/11/3 11:51 * @remark */ public static function createPay($params, $order, $user_id) { // 0为茶艺师 1为茶室支付 2购买套餐 3购买会员 4充值 7续费 if(!isset($params['order_type'])){ $params['order_type'] = 0; } if($params['order_type'] == 1){ if($order['order_amount'] == 0&&$params['pay_way'] == 2){ $d['order_status'] = 1; $d['pay_status'] = 1; $d['update_dtime'] = date("Y-m-d H:i:s"); if($order['group_coupon_id']!=0){ UserGroup::where("id",$order['group_coupon_id'])->update(['status'=>1]); $tea_store = TeaStore::where("id",$order['store_id'])->find(); $group = UserGroup::where("id",$order['group_coupon_id'])->find(); $store_group = TeaStoreGroup::where("id",$group['group_id'])->find(); if($group['type'] == 2){ $store_group['discount_price'] = 0; } StoreUserAccountLog::create([ 'sn'=>createSn("store_user_account_log","sn"), 'change_object'=>4, 'change_type'=>1, 'user_id'=>$user_id, 'action'=>1, 'amount' => $store_group['discount_price'], 'before_amount'=>round($tea_store['balance'],2), 'after_amount' => round($tea_store['balance']+$store_group['discount_price'],2), 'source_sn' => $order['order_sn'], 'store_id'=>$order['store_id'], 'room_id'=>$order['room_id'], 'remark'=>"团购套餐", 'create_time' => time() ]); TeaStore::where('id', $order['store_id'])->inc('total_amount', $store_group['discount_price'])->update(); TeaStore::where('id', $order['store_id'])->inc('balance', $store_group['discount_price'])->update(); } } $d['pay_way'] = $params['pay_way']; OrderStore::where("id",$params['order_id'])->update($d); }elseif($params['order_type'] == 2){ OrderGroup::where("id",$params['order_id'])->update(['pay_way'=>$params['pay_way']]); }elseif($params['order_type'] == 4){ RechargeOrder::where("id",$params['order_id'])->update(['pay_way'=>$params['pay_way']]); }elseif ($params['order_type'] == 7){ OrderStoreRenew::where('id',$params['order_id'])->update(['pay_way'=>$params['pay_way']]); } $result = Pay::insertGetId([ 'order_id'=>$params['order_id'], 'pay_way'=>$params['pay_way'], 'order_amount'=>$order['order_amount'], 'user_id'=>$user_id, 'order_source'=>$params['order_source'], 'order_type'=>$params['order_type'] ]); return $result; } /** * @notes 设置订单号 支付回调时截取前面的单号 18个 * @param $orderSn * @param $terminal * @return string * @author 段誉 * @date 2023/3/1 16:31 * @remark 回调时使用了不同的回调地址,导致跨客户端支付时(例如小程序,公众号)可能出现201,商户订单号重复错误 */ public static function formatOrderSn($orderSn, $terminal) { $suffix = mb_substr(time(), -4); return $orderSn . $terminal . $suffix; } }