ソースを参照

Merge branch 'master' of http://git.derkj.com:9095/waibao/NN2025112501

罗永浩 3 ヶ月 前
コミット
2953f8cdd1

+ 58 - 7
app/Http/Controllers/Api/v1/IndexController.php

@@ -3,6 +3,7 @@
 namespace App\Http\Controllers\Api\v1;
 
 use App\Http\Controllers\Api\webApp;
+use App\Services\Api\OrderService;
 use App\Services\Api\SocialCircleService;
 use App\Services\Api\StoreService;
 use App\Services\Common\AdService;
@@ -29,6 +30,7 @@ class IndexController extends webApp
             $cacheKey = "caches:config:app_{$appSources}";
             $config = RedisService::get($cacheKey);
             if (empty($config)) {
+                $socialOpen = ConfigService::make()->getConfigByCode('social_open', 0);
                 $config = [
                     'app_name' => ConfigService::make()->getConfigByCode('app_name'),
                     'app_logo' => get_image_url(ConfigService::make()->getConfigByCode('app_logo')),
@@ -37,8 +39,12 @@ class IndexController extends webApp
                     'alipay_open' => ConfigService::make()->getConfigByCode('alipay_open', 0),
                     'agent_apply_desc' => format_content(ConfigService::make()->getConfigByCode('agent_apply_desc', '')),
                     'withdraw_desc' => format_content(ConfigService::make()->getConfigByCode('withdraw_desc', '')),
-                    'recharge_desc' => format_content(ConfigService::make()->getConfigByCode('recharge_desc', '')),
+                    'recharge_desc_1' => format_content(ConfigService::make()->getConfigByCode('recharge_desc_1', '')),
+                    'recharge_desc_2' => format_content(ConfigService::make()->getConfigByCode('recharge_desc_2', '')),
+                    'recharge_desc_3' => format_content(ConfigService::make()->getConfigByCode('recharge_desc_3', '')),
                     'wxpay_open' => ConfigService::make()->getConfigByCode('wxpay_open', 0),
+                    'pay_recharge_open' => ConfigService::make()->getConfigByCode('pay_recharge_open', 0),
+                    'social_open' => $socialOpen,
                     'withdraw_open' => ConfigService::make()->getConfigByCode('withdraw_open', 0),
                     'withdraw_min' => ConfigService::make()->getConfigByCode('withdraw_min', 0),
                     'withdraw_fee' => ConfigService::make()->getConfigByCode('withdraw_fee', 0),
@@ -55,6 +61,49 @@ class IndexController extends webApp
     }
 
     /**
+     * 菜单
+     * @param int $socialOpen
+     * @return array[]
+     */
+    public function getMenus($socialOpen=-1)
+    {
+        $socialOpen = $socialOpen>=0?$socialOpen:ConfigService::make()->getConfigByCode('social_open', 0);
+        return [
+            [
+                "name" => '首页',
+                "code" => 'home',
+                "icon" => 'home',
+                "status"=> 1,
+                "page" => '/pages/index/index'
+            ], [
+                "name" => '客服',
+                "code" => 'custom',
+                "icon" => 'custom',
+                "status"=> 1,
+            ], [
+                "name" => '',
+                "code" => 'social',
+                "icon" => 'social',
+                "status"=> $socialOpen?1:0,
+                "page" => '/pages/social/index'
+            ], [
+                "name" => '购物车',
+                "code" => 'cart',
+                "icon" => 'cart',
+                "badge" => OrderService::make()->getCountByStatus($this->userId,1),
+                "status"=> 1,
+                "page" => '/pages/cart/index'
+            ], [
+                "name" => '我的',
+                "code" => 'mine',
+                "icon" => 'mine',
+                "status"=> 1,
+                "page" => '/pages/mine/index'
+            ]
+        ];
+    }
+
+    /**
      * 首页数据
      * @return array
      */
@@ -62,17 +111,19 @@ class IndexController extends webApp
     {
         try {
             $params = request()->all();
-            $type = isset($params['type']) && $params['type']?$params['type'] : 1;
-            $position = isset($params['position']) && $params['position']?$params['position'] : 1;
+            $type = isset($params['type']) && $params['type'] ? $params['type'] : 1;
+            $position = isset($params['position']) && $params['position'] ? $params['position'] : 1;
             $data = [
                 // 轮播
                 'banners' => AdService::make()->getListByPosition($position),
             ];
 
-            if($type==2){
+            if ($type == 2) {
                 $data['socials'] = SocialCircleService::make()->getIndexList();
-            }else{
+            } else {
                 $data['notices'] = NoticeService::make()->getRecommandList();
+                $data['social_open'] = ConfigService::make()->getConfigByCode('social_open', 0);
+                $data['pay_recharge_open'] = ConfigService::make()->getConfigByCode('pay_recharge_open', 0);
             }
 
             return showJson(1010, true, $data);
@@ -88,12 +139,12 @@ class IndexController extends webApp
      */
     public function storeGoods()
     {
-        $params =request()->post();
+        $params = request()->post();
         try {
             $params['user_id'] = $this->userId;
             $datas = StoreService::make()->getGoodsList($params);
             return showJson(StoreService::make()->getError(), true, $datas);
-        }catch (\Exception $exception) {
+        } catch (\Exception $exception) {
             $error = ['data' => $exception->getTrace(), 'err' => $exception->getMessage()];
             return showJson(1046, false, $error);
         }

+ 8 - 7
app/Http/Controllers/Api/v1/NotifyController.php

@@ -77,7 +77,7 @@ class NotifyController extends webApp
     {
         $date = date('Y-m-d H:i:s');
         $result = isset($_POST)? $_POST : request()->post();
-        $key = date('YmdHis') . '_' . rand(1000, 9999);
+        $key = isset($result['out_trade_num'])?$result['out_trade_num'] : date('YmdHis') . '_' . rand(1000, 9999);
         $channel = 'dryPay';
         if (empty($result)) {
             $result = file_get_contents('php://input');
@@ -88,7 +88,7 @@ class NotifyController extends webApp
             $sign = isset($result['sign'])?$result['sign']:'';
             unset($result['sign']);//删除掉sign字段
             $checkSign = DyrPayService::make()->makeSign($result, 2);
-            RedisService::set("caches:payments:payNotify_{$productId}:result_".date('YmdHis').rand(10,99), ['all' => request()->all(), 'sign'=>$sign,'checkSign'=>$checkSign, 'product_id' => $productId, 'result' => $result], 7200);
+            RedisService::set("caches:payments:payNotify_{$productId}:result_".$key, ['all' => request()->all(), 'sign'=>$sign,'checkSign'=>$checkSign, 'product_id' => $productId, 'result' => $result], 7200);
             if($sign != $checkSign){
                 if (env('APP_DEBUG')) {
                     logger()->channel($channel)->error("【{$date} 支付回调】签名错误:" . json_encode([ 'product_id' => $productId,'data' => $result], 256));
@@ -100,23 +100,24 @@ class NotifyController extends webApp
 
             // 验签和重组参数
             $data = $result;
-            RedisService::set("caches:payments:notify_{$productId}:data_" . $key, ['all' => request()->all(),'product_id' => $productId, 'result' => $result], 7200);
+            RedisService::set("caches:payments:payNotify_{$productId}:data_" . $key, ['all' => request()->all(),'product_id' => $productId, 'result' => $result], 7200);
             if (env('APP_DEBUG')) {
                 logger()->channel($channel)->info("【{$date} 支付回调】验证结果:" . json_encode(['data' => $data,'product_id' => $productId],256));
             }
 
             // 回调处理
-            if (PaymentService::make()->catchPayNotify($productId, $data)) {
-                RedisService::set("caches:payments:notify_{$productId}:success_" . $key, ['all' => request()->all(), 'product_id' => $productId, 'result' => $result], 7200);
-                logger()->channel('alipay')->info("【{$date} 支付回调】回调成功:" . json_encode(['data' => $data,'product_id' => $productId],256));
+            if ($result = PaymentService::make()->catchPayNotify($productId, $data)) {
+                RedisService::set("caches:payments:payNotify_{$productId}:success_" . $key, ['msg'=>PaymentService::make()->getError(),'all' => request()->all(), 'product_id' => $productId, 'data' => $data,'result'=>$result], 7200);
+                logger()->channel($channel)->info("【{$date} 支付回调】回调成功:" . json_encode(['data' => $data,'product_id' => $productId],256));
                 return response('success');
             } else {
                 $msg = PaymentService::make()->getError();
+                RedisService::set("caches:payments:payNotify_{$productId}:failed_" . $key, ['msg'=>$msg,'all' => request()->all(), 'product_id' => $productId, 'data' => $data], 7200);
                 logger()->channel($channel)->info("【{$date} 支付回调】回调失败:" . json_encode(['data' => $data,'product_id' => $productId, 'error' => lang($msg)], 256));
                 return message($msg ? $msg : 2635, false);
             }
         } catch (\Exception $exception) {
-            RedisService::set("caches:payments:notify_{$productId}:error_" . $key, ['all' => request()->all(), 'product_id' => $productId, 'error' => $exception->getMessage(), 'data' => $result], 7200);
+            RedisService::set("caches:payments:payNotify_{$productId}:error_" . $key, ['all' => request()->all(), 'product_id' => $productId, 'error' => $exception->getMessage(), 'data' => $result], 7200);
             logger()->channel($channel)->error("【{$date} 支付回调】回调错误:" . json_encode(['data' => $result,'product_id' => $productId, 'error' => $exception->getMessage()], 256));
             return message(2635, false, ['error' => $exception->getMessage()]);
         }

+ 0 - 1
app/Models/GoodsModel.php

@@ -77,7 +77,6 @@ class GoodsModel extends BaseModel
     {
         return $this->hasMany(GoodsSkuModel::class, 'goods_id', 'id')
             ->where(['mark' => 1, 'status' => 1])
-            ->where('stock','>', 0)
             ->orderBy('sort', 'desc');
     }
 }

+ 45 - 21
app/Services/Api/AccountService.php

@@ -101,13 +101,18 @@ class AccountService extends BaseService
     public function getPayLog($params, $pageSize = 15)
     {
         $userId = isset($params['user_id'])?$params['user_id'] : 0;
+        $type = isset($params['type'])?$params['type'] : 0;
+        $where = ['type'=>$type,'user_id'=> $userId,'mark'=>1];
+        if($type<=0){
+            unset($where['type']);
+        }
         $list = PayOrdersModel::from('pay_orders as a')
             ->where(function($query){
                 $query->where('a.status','>',1)->orWhere(function($query){
                     $query->where('a.status',1)->orWhere('a.create_time','>=', time() - 300);
                 });
             })
-            ->where(['user_id'=> $userId,'mark'=>1])
+            ->where($where)
             ->select(['a.*'])
             ->orderBy('a.create_time','desc')
             ->orderBy('a.id','desc')
@@ -238,9 +243,6 @@ class AccountService extends BaseService
             if($phoneType){
                 $where['phone_type'] = $phoneType;
             }
-            if($phoneService){
-                $where['phone_service'] = $phoneService;
-            }
         }else if($type==2){
             if($electricType){
                 $where['electric_type'] = $electricType;
@@ -252,6 +254,11 @@ class AccountService extends BaseService
         }
 
         $datas = PayMealsModel::where($where)
+            ->where(function($query) use($phoneService, $type){
+                if($type==1 && $phoneService){
+                    $query->where('phone_service',$phoneService)->orWhere('phone_service',0);
+                }
+            })
             ->orderBy('sort','desc')
             ->orderBy('id','asc')
             ->get();
@@ -310,24 +317,32 @@ class AccountService extends BaseService
             return false;
         }
 
-        // 电费验证
-        if($mealType==2){
-            if(empty($area)){
-                $this->error = '请选择省份/直辖市';
-                RedisService::clear($cacheKey . '_lock');
-                return false;
-            }
+        if($mealType==2 && empty($area)){
+            $this->error = '请选择省份/直辖市';
+            RedisService::clear($cacheKey . '_lock');
+            return false;
+        }
 
-            if(empty($idCardNo)){
-                $this->error = "请填写".(['验证参数','身份证后6位','银行卡后6位','营业执照后6位'][$ytype]);
-                RedisService::clear($cacheKey . '_lock');
-                return false;
-            }
+        if($mealType==2 && empty($city)){
+            $this->error = '请选择地级市名';
+            RedisService::clear($cacheKey . '_lock');
+            return false;
+        }
+
+        // 电费验证
+        if($mealType==2 && $electricType==3){
+            if(in_array($area,['广东','广西','海南','贵州','云南'])){
+                if($ytype<=0){
+                    $this->error = '请选择三要素验证类型';
+                    RedisService::clear($cacheKey . '_lock');
+                    return false;
+                }
 
-            if(empty($city)){
-                $this->error = '请选择地级市名';
-                RedisService::clear($cacheKey . '_lock');
-                return false;
+                if(empty($idCardNo)){
+                    $this->error = "请填写".(['验证参数','身份证后6位','银行卡后6位','营业执照后6位'][$ytype]);
+                    RedisService::clear($cacheKey . '_lock');
+                    return false;
+                }
             }
         }
 
@@ -356,10 +371,15 @@ class AccountService extends BaseService
             'user_id' => $userId,
             'meal_id' => $mealId,
             'product_id' => $productId,
-            'total' => $price,
+            'total' => $money,
+            'pay_total' => $price,
             'type' => $mealType,
             'account' => $account,
             'discount' => $discount,
+            'area' => $area,
+            'city' => $city,
+            'ytype' => $ytype,
+            'id_card_no' => $idCardNo,
             'create_time' => time(),
             'remark' => $remark,
             'status' => 1,
@@ -372,6 +392,10 @@ class AccountService extends BaseService
             return false;
         }
 
+        if(env('PAY_DEBUG')){
+            $price = 0.1;
+        }
+
         /* TODO 支付处理 */
         $payOrder = [
             'type' => 1,

+ 3 - 3
app/Services/Api/GoodsService.php

@@ -219,7 +219,7 @@ class GoodsService extends BaseService
     {
         $list = $this->model->whereIn('id', $ids)
             ->where(['status'=>1,'mark'=>1])
-            ->select(['id as goods_id','goods_name','category_id','store_id','price','stock','unit','weight','thumb','sku_type'])
+            ->select(['id as goods_id','goods_name','category_id','store_id','sku_type','price','stock','unit','weight','thumb','sku_type'])
             ->get();
         $list = $list? $list->toArray() : [];
         if($list){
@@ -249,11 +249,11 @@ class GoodsService extends BaseService
                 }
 
                 if($stock<=0 || $num>$stock){
-                    $this->error = "商品[{$goodsName}]库存不足~";
+                    $this->error = $skuId? "商品[{$goodsName}]规格[{$skuName}]库存不足~" : "商品[{$goodsName}]库存不足~";
                     return false;
                 }
 
-                if($skuStock<=0 || $num>$skuStock){
+                if($skuType==2 && ($skuStock<=0 || $num>$skuStock)){
                     $this->error = "商品[{$goodsName}]规格[{$skuName}]库存不足~";
                     return false;
                 }

+ 4 - 2
app/Services/Api/MemberService.php

@@ -265,7 +265,7 @@ class MemberService extends BaseService
                 $nickName = '';
             }
             $this->model->where(['id' => $userId])->update($updateData);
-            RedisService::set("caches:members:login_{$userId}", $updateData, rand(180, 300));
+            RedisService::set("caches:members:login_{$userId}", $updateData, rand(30, 60));
         }
 
         // 获取登录授权token
@@ -284,8 +284,10 @@ class MemberService extends BaseService
         unset($data['mobile']);
         RedisService::set("auths:info:{$userId}", $data, 24 * 3600);
         RedisService::set("auths:info:{$userId}", $data, 24 * 3600);
+        RedisService::clear("caches:storeId:id_{$userId}");
+        RedisService::clear("caches:storeId:uuid_{$uuid}");
+        RedisService::clear("caches:storeId:ip_".get_client_ip());
         return $result;
-
     }
 
     /**

+ 13 - 119
app/Services/Api/OrderService.php

@@ -469,25 +469,25 @@ class OrderService extends BaseService
     /**
      * 订单取消
      * @param $userId
-     * @param $id
+     * @param $orderId
      * @return array|false
      */
-    public function cancel($userId, $id)
+    public function cancel($userId, $orderId)
     {
-        if ($id <= 0) {
+        if ($orderId <= 0) {
             $this->error = '请选择订单';
             return false;
         }
 
         // 缓存锁
-        $cacheLockKey = "caches:orders:cancel_lock:{$userId}_{$id}";
+        $cacheLockKey = "caches:orders:cancel_lock:{$userId}_{$orderId}";
         if (RedisService::get($cacheLockKey)) {
             $this->error = '订单处理中~';
             return false;
         }
 
         // 商品数据
-        RedisService::set($cacheLockKey, ['order_id' => $id, 'user_id' => $userId], rand(3, 5));
+        RedisService::set($cacheLockKey, ['order_id' => $orderId, 'user_id' => $userId], rand(3, 5));
 
         // 用户信息
         $userInfo = MemberModel::where(['id' => $userId, 'mark' => 1])
@@ -501,7 +501,7 @@ class OrderService extends BaseService
         }
 
         // 订单信息
-        $info = $this->model->where(['id' => $id, 'mark' => 1])
+        $info = $this->model->where(['id' => $orderId, 'mark' => 1])
             ->select(['id', 'order_no', 'pay_total', 'status'])
             ->first();
         $orderNo = isset($info['order_no']) ? $info['order_no'] : '';
@@ -517,16 +517,16 @@ class OrderService extends BaseService
             RedisService::clear($cacheLockKey);
             return false;
         }
-        $orderGoods = OrderGoodsModel::where(['order_no'=> $orderNo,'mark'])
+        $orderGoods = OrderGoodsModel::where(['order_no'=> $orderNo,'mark'=>1])
             ->select(['goods_id','num','sku_id'])
             ->get();
         DB::beginTransaction();
         if($orderGoods){
             foreach($orderGoods as $goods){
-                $id = isset($goods['goods_id'])?$goods['goods_id']:0;
+                $goodsId = isset($goods['goods_id'])?$goods['goods_id']:0;
                 $num = isset($goods['num'])?$goods['num']:0;
                 $skuId = isset($goods['sku_id'])?$goods['sku_id']:0;
-                if($id && !GoodsModel::where(['id'=>$id])->update(['stock'=>DB::raw("stock + {$num}"),'update_time'=>time()])){
+                if($goodsId && !GoodsModel::where(['id'=>$goodsId])->update(['stock'=>DB::raw("stock + {$num}"),'update_time'=>time()])){
                     DB::rollBack();
                     RedisService::clear($cacheLockKey);
                     $this->error = '商品库存处理失败';
@@ -544,9 +544,11 @@ class OrderService extends BaseService
 
         $this->error = '取消订单成功';
         $this->model->where(['user_id' => $userId, 'mark' => 0])->where('update_time', '<=', time() - 300)->delete();
-        $this->model->where(['id' => $id])->update(['mark' => 0, 'update_time' => time()]);
+        OrderGoodsModel::where(['order_no' => $orderNo, 'mark' => 0])->where('update_time', '<=', time() - 300)->delete();
+        $this->model->where(['id' => $orderId])->update(['mark' => 0, 'update_time' => time()]);
+        OrderGoodsModel::where(['order_no' => $orderNo])->update(['mark' => 0, 'update_time' => time()]);
         DB::commit();
-        return ['id' => $id];
+        return ['id' => $orderId];
     }
 
     /**
@@ -811,61 +813,6 @@ class OrderService extends BaseService
     }
 
     /**
-     * 获取订单审核状态
-     * @param $userId
-     * @return array|mixed
-     */
-    public function checkOrderStatus($userId)
-    {
-        $cacheKey = "caches:orders:checkOrder:{$userId}";
-        $data = RedisService::get($cacheKey);
-        if ($data) {
-            return $data;
-        }
-
-        $data = $this->model->with(['confirm'])->where(function ($query) {
-            $query->where(function ($query) {
-                $query->where('status', 2)->where('confirm_at', '>=', date('Y-m-d H:i:s', time() - 3600));
-            })->orWhere(function ($query) {
-                $query->where('status', 9)->where('confirm_at', '>=', date('Y-m-d H:i:s', time() - 600));
-            })->orWhere(function ($query) {
-                $query->where('status', 3)->where('confirm_at', '>=', date('Y-m-d H:i:s', time() - 600));
-            })->orWhere('status', 1);
-        })
-            ->where(['user_id' => $userId, 'mark' => 1])
-            ->select(['id', 'order_no', 'user_id', 'goods_id', 'status'])
-            ->orderBy('id', 'desc')
-            ->first();
-        $data = $data ? $data->toArray() : [];
-        $result = [];
-        if ($data) {
-            $orderId = isset($data['id']) ? $data['id'] : 0;
-            $status = isset($data['status']) ? $data['status'] : 0;
-            $goodsId = isset($data['goods_id']) ? $data['goods_id'] : 0;
-            $confirmOrder = isset($data['confirm']) ? $data['confirm'] : [];
-            $confirmOrderId = isset($confirmOrder['id']) ? $confirmOrder['id'] : 0;
-            $confirmOrderUser = isset($confirmOrder['user']) ? $confirmOrder['user'] : [];
-            $realname = isset($confirmOrderUser['realname']) ? $confirmOrderUser['realname'] : '';
-            if ($status == 9) {
-                $message = "抱歉,订单已被其他师傅接走";
-            } else if ($status == 2) {
-                $message = "恭喜您,抢单成功,请前往完成订单!";
-            } else if ($status == 3) {
-                $message = "恭喜您,订单已经完成!";
-            } else {
-                $pickerCount = $this->model->where(['goods_id' => $goodsId, 'mark' => 1])->whereIn('status', [1, 2])->count('id');
-                $pickerCount = $pickerCount <= 3 ? 3 : $pickerCount;
-                $message = "<p style='padding: 5px 0;'>正在抢单</p><p>({$pickerCount}位师傅正在抢单中)</p>";
-            }
-            $result = ['order_id' => $orderId, 'goods_id' => $goodsId, 'confirm_order_id' => $confirmOrderId, 'status' => $status, 'message' => $message];
-            RedisService::set($cacheKey, $result, rand(10, 20));
-        }
-
-        return $result;
-    }
-
-
-    /**
      * 物流查询
      * @param $id
      * @return array|false|mixed
@@ -883,59 +830,6 @@ class OrderService extends BaseService
 
         $cacheKey = "caches:kd100_{$id}";
         $data = RedisService::get($cacheKey);
-        $data = [
-            [
-                "time" => "2025-12-24 11:29:23",
-      "context" => "您的快件已投递,收件人在[沙岗镇绕城路天猫1号店妈妈驿站]取件(凭取件码签收),如有疑问请联系站点:13086796129,快递员电话:13086796129,投诉电话:15278929512。感谢使用圆通速递,期待再次为您服务!",
-      "ftime" => "2025-12-24 11:29:23",
-      "areaCode" => "CN450521000000",
-      "areaName" => "广西,北海市,合浦县",
-      "status" => "签收",
-            ],
-            [
-                "time" => "2025-12-22 17:29:40",
-      "context" => "您的快件已到达[妈妈驿站]沙岗镇绕城路1号天猫店,请您及时取件,如有取件码问题或找不到包裹等问题,请联系站点:13086796129,快递员电话:13086796129,投诉电话:15278929512。感谢使用圆通速递,期待再次为您服务!",
-      "ftime" => "2025-12-22 17:29:40",
-      "areaCode" => "CN450521000000",
-      "areaName" => "广西,北海市,合浦县",
-      "status" => "派件",
-            ],[
-                "time" => "2025-12-22 17:28:40",
-      "context" => "【广西北海市合浦县沙岗镇】的莫业琨(13086796129)正在派件,(有事先呼我,勿找平台,少一次投诉,多一份感恩)!如有疑问请联系网点:15278929512,投诉电话:15278929512。[95161和18521号段的上海号码为圆通快递员专属号码,请放心接听]",
-      "ftime" => "2025-12-22 17:28:40",
-      "areaCode" => "CN450521100000",
-      "areaName" => "广西,北海市,合浦县,廉州镇",
-      "status" => "派件",
-            ],[
-                "time" => "2025-12-22 02:44:12",
-      "context" => "您的快件离开【南宁转运中心】,已发往【广西北海市合浦】",
-      "ftime" => "2025-12-22 02:44:12",
-      "areaCode" => "CN450108000000",
-      "areaName" => "广西,南宁市,良庆区",
-      "status" => "在途",
-            ],[
-                "time" => "2025-12-22 02:21:21",
-      "context" => "您的快件已经到达【南宁转运中心】【物流问题无需找商家或平台,请致电(专属热线:95554)更快解决】",
-      "ftime" => "2025-12-22 02:21:21",
-      "areaCode" => "CN450108000000",
-      "areaName" => "广西,南宁市,良庆区",
-      "status" => "在途",
-            ],[
-                "time" => "2025-12-20 23:47:58",
-      "context" => "您的快件离开【临海转运中心】,已发往【南宁转运中心】。预计【12月22日】到达【南宁市】,因运输距离较远,预计将在【22日晚上】为您更新快件状态,请您放心!",
-      "ftime" => "2025-12-20 23:47:58",
-      "areaCode" => "CN331082000000",
-      "areaName" => "浙江,台州市,临海市",
-      "status" => "在途",
-            ],[
-                "time" => "2025-12-20 23:45:58",
-      "context" => "您的快件已经到达【临海转运中心】【物流问题无需找商家或平台,请致电(专属热线:95554)更快解决】",
-      "ftime" => "2025-12-20 23:45:58",
-      "areaCode" => "CN331082000000",
-      "areaName" => "浙江,台州市,临海市",
-      "status" => "在途",
-            ]
-        ];
         if ($data) {
             return $data;
         }

+ 13 - 1
app/Services/Api/SettleService.php

@@ -104,7 +104,16 @@ class SettleService extends BaseService
         return $result;
     }
 
-    public function agentBonus($userId, $money, $order, $parentId)
+    /**
+     * 代理收益
+     * @param $userId
+     * @param $money
+     * @param $order
+     * @param $parentId
+     * @param int $type
+     * @return array|false|int
+     */
+    public function agentBonus($userId, $money, $order, $parentId, $type=0)
     {
         $orderNo = isset($order['order_no'])? $order['order_no'] : '';
         if($money<=0 || $userId<=0 || $parentId<=0){
@@ -145,6 +154,7 @@ class SettleService extends BaseService
             'date'=>date('Y-m-d'),
             'create_time'=>time(),
             'remark'=> '推广收益',
+            'remark1'=> ['','话费充值','电费充值','燃气充值'][$type],
             'status'=>1
         ];
 
@@ -178,6 +188,7 @@ class SettleService extends BaseService
                 'date'=>date('Y-m-d'),
                 'create_time'=>time()+1,
                 'remark'=> '一级代理收益',
+                'remark1'=> ['','话费充值','电费充值','燃气充值'][$type],
                 'status'=>1
             ];
         }
@@ -208,6 +219,7 @@ class SettleService extends BaseService
                 'date'=>date('Y-m-d'),
                 'create_time'=>time()+2,
                 'remark'=> '二级代理收益',
+                'remark1'=> ['','话费充值','电费充值','燃气充值'][$type],
                 'status'=>1
             ];
         }

+ 28 - 15
app/Services/Api/StoreService.php

@@ -156,12 +156,28 @@ class StoreService extends BaseService
      */
     public function getStoreId($userId)
     {
-        $cacheKey = "caches:stores:storeId:id_{$userId}";
+        $cacheKey = "caches:storeId:id_{$userId}";
         $data = RedisService::get($cacheKey);
         if($data){
             return $data;
         }
 
+        $params = request()->all();
+        $system = isset($params['system']) ? $params['system'] : [];
+        $system = $system && !is_array($system) ? json_decode($system, true) : $system;
+        $uuid = isset($system['uuid']) ? $system['uuid'] : '';
+        $uuKey = "caches:storeId:uuid_{$uuid}";
+        $ipKey = "caches:storeId:ip_".get_client_ip();
+        if($userId<=0){
+            if($storeId = RedisService::get($ipKey)){
+                $this->error = "未登录缓存的店铺";
+                return $storeId;
+            }else if($uuid && $storeId = RedisService::get($uuKey)){
+                $this->error = "未登录缓存的店铺";
+                return $storeId;
+            }
+        }
+
         // 用户信息
         $userInfo = MemberModel::with(['store'])
             ->where(['id'=>$userId,'mark'=>1])
@@ -175,7 +191,7 @@ class StoreService extends BaseService
         $storeId = isset($store['id'])? $store['id'] : 0;
         $storeStatus = isset($store['status'])? $store['status'] : 0;
         $storeMark = isset($store['mark'])? $store['mark'] : 0;
-        if(empty($userInfo)){
+        if($userId && empty($userInfo)){
             $this->error = '用户账户不存在';
             return 0;
         }
@@ -188,26 +204,23 @@ class StoreService extends BaseService
         }
 
         // 用户上级有商家
-        $parentStoreInfo = $this->model->whereIn('user_id',$ids)
-            ->where(['status'=>1,'mark'=>1])
-            ->select(['id','user_id','name'])
-            ->orderByRaw("FIELD(user_id,".(implode(',',$ids)).") asc")
-            ->first();
+        $parentStoreInfo = [];
+        if($ids){
+            $parentStoreInfo = $this->model->whereIn('user_id',$ids)
+                ->where(['status'=>1,'mark'=>1])
+                ->select(['id','user_id','name'])
+                ->orderByRaw("FIELD(user_id,".(implode(',',$ids)).") asc")
+                ->first();
+        }
+
         $storeId = isset($parentStoreInfo['id'])?$parentStoreInfo['id'] : 0;
         $parentUserId = isset($parentStoreInfo['user_id'])?$parentStoreInfo['user_id'] : 0;
-        $params = request()->all();
-        $system = isset($params['system']) ? $params['system'] : [];
-        $system = $system && !is_array($system) ? json_decode($system, true) : $system;
-        $uuid = isset($system['uuid']) ? $system['uuid'] : '';
-        $uuKey = "caches:stores:storeId:uu_{$uuid}";
         if($parentStoreInfo && $storeId>0){
             RedisService::set($cacheKey, $storeId, 7 * 86400);
+            RedisService::set($ipKey, $storeId, 7 * 86400);
             RedisService::set($uuKey, $storeId, 7 * 86400);
             $this->error = "上级[{$parentUserId}]的店铺";
             return $storeId;
-        }else if($uuid && $storeId = RedisService::get($uuKey)){
-            $this->error = "未登录缓存的店铺";
-            return $storeId;
         }
 
         $this->error = "";

+ 4 - 0
app/Services/Common/PayOrdersService.php

@@ -259,6 +259,8 @@ class PayOrdersService extends BaseService
                 } else {
                     $errors[$no] = $remark;
                 }
+
+
             }
         }
 
@@ -273,6 +275,8 @@ class PayOrdersService extends BaseService
                 } else {
                     $errors[$order['order_no']] = $refundStatus ? '充值失败原路退款' : '充值失败退款失败';
                 }
+
+                sleep(2);
             }
         }
 

+ 17 - 3
app/Services/DyrPayService.php

@@ -58,7 +58,7 @@ class DyrPayService extends BaseService
      * @param string $amount 充值面值
      * @return bool
      */
-    public function recharge($no, $account, $productId, $amount)
+    public function recharge($no, $account, $productId, $amount, $params=[])
     {
         if (empty($this->apiUrl) || empty($this->apiKey) || empty($this->apiClientId)) {
             $this->error = '接口参数未配置';
@@ -77,9 +77,23 @@ class DyrPayService extends BaseService
             'out_trade_num' => $no,     // 单号
             'amount' => $amount,                // 金额
             'mobile' => $account,                // 手机号
-            'notify_url' => url('/api/notify/dyr/' . $productId),            // 回调地址
-
+            'notify_url' => url('/api/dry/notify/' . $productId),            // 回调地址
         ];
+        if(isset($params['ytype']) && $params['ytype']){
+            $param['ytype'] = intval($params['ytype']);
+        }
+
+        if(isset($params['id_card_no']) && $params['id_card_no']){
+            $param['id_card_no'] = $params['id_card_no'];
+        }
+
+        if(isset($params['area']) && $params['area']){
+            $param['area'] = $params['area'];
+        }
+
+        if(isset($params['city']) && $params['city']){
+            $param['city'] = $params['city'];
+        }
 
         //请求参数
         $param['sign'] = $this->makeSign($param);

+ 37 - 16
app/Services/PaymentService.php

@@ -16,6 +16,7 @@ use App\Models\MemberModel;
 use App\Models\OrderModel;
 use App\Models\PaymentModel;
 use App\Models\PayOrdersModel;
+use App\Services\Api\SettleService;
 use Illuminate\Support\Facades\DB;
 use Yansongda\Pay\Pay;
 use Yansongda\Pay\Provider\Wechat;
@@ -491,7 +492,7 @@ class PaymentService extends BaseService
             // 生活充值
             else if ($scene == 'pay') {
                 $orderInfo = PayOrdersModel::where(['order_no' => $orderNo, 'mark' => 1])
-                    ->select(['id as order_id', 'user_id','meal_id','product_id', 'order_no','transaction_id','account', 'total as pay_money', 'pay_at as pay_time', 'remark', 'status'])
+                    ->select(['id as order_id', 'user_id','meal_id','product_id', 'order_no','transaction_id','account', 'total as pay_money','area','ytype','city','id_card_no','pay_total', 'pay_at as pay_time', 'remark', 'status'])
                     ->first();
                 $orderStatus = isset($orderInfo['status']) ? $orderInfo['status'] : 0;
                 // 验证订单
@@ -565,11 +566,14 @@ class PaymentService extends BaseService
                     $account = isset($orderInfo['account'])? $orderInfo['account'] : '';
                     $total = isset($orderInfo['pay_money'])? $orderInfo['pay_money'] : 0;
                     $amount = $total;
-                    if(env('PAY_DEBUG')){
-                        $amount = 50;
-                    }
-
-                    $result = DyrPayService::make()->recharge($orderNo, $account, $productId, $amount);
+                    $params = [
+                        'ytype'=>isset($orderInfo['ytype'])?$orderInfo['ytype']:0,
+                        'id_card_no'=>isset($orderInfo['id_card_no'])?$orderInfo['id_card_no']:'',
+                        'area'=>isset($orderInfo['area'])?$orderInfo['area']:'',
+                        'city'=>isset($orderInfo['city'])?$orderInfo['city']:'',
+                    ];
+
+                    $result = DyrPayService::make()->recharge($orderNo, $account, $productId, $amount, $params);
                     $errno = isset($result['errno'])?$result['errno'] : -1;
                     $errmsg = isset($result['errmsg'])?$result['errmsg'] : '';
                     $res = isset($result['data'])?$result['data']:[];
@@ -583,7 +587,7 @@ class PaymentService extends BaseService
                         $orderInfo['money'] = $total;
                         $orderInfo['remark'] = '充值失败退款';
                         $refundStatus = PaymentService::make()->refund($orderInfo,'pay');
-                        $updateData = ['refund_status'=> $refundStatus?1:3,'status'=>5,'failed_remark'=> $errmsg,'refund_money'=>$refundStatus?$total:0,'update_time'=>time()];
+                        $updateData = ['refund_status'=> $refundStatus?1:3,'status'=>5,'result'=>json_encode(['amount'=>$amount,'params'=>$params,'result'=>$result],256),'failed_remark'=> $errmsg,'refund_money'=>$refundStatus?$total:0,'update_time'=>time()];
                         $this->saveLog("caches:payments:notify_{$scene}:pay_failed_{$orderNo}_{$orderUserId}", ['error'=>$this->error,'update'=>$updateData,'order' => $orderInfo,'result'=>$result, 'notify' => $data]);
                         if(!PayOrdersModel::where(['id'=>$orderId])->update($updateData)){
                             $this->error = '订单退款状态更新错误~';
@@ -593,7 +597,7 @@ class PaymentService extends BaseService
                         return false;
                     }
 
-                    $updateData = ['status'=>3,'out_trade_no'=>$order_number,'pay_total'=>$total_price,'update_time'=>time()+1];
+                    $updateData = ['status'=>3,'result'=>json_encode(['amount'=>$amount,'params'=>$params,'result'=>$result],256),'out_trade_no'=>$order_number,'update_time'=>time()+1];
                     $this->saveLog("caches:payments:notify_{$scene}:pay_success_{$orderNo}_{$orderUserId}", ['error'=> '充值调用成功','id'=>$orderId,'update'=>$updateData,'order' => $orderInfo,'result'=>$result, 'notify' => $data]);
                     if(!PayOrdersModel::where(['id'=>$orderId])->update($updateData)){
                         DB::commit();
@@ -630,18 +634,21 @@ class PaymentService extends BaseService
     public function catchPayNotify($productId, $data)
     {
         $out_trade_num = isset($data['out_trade_num'])?$data['out_trade_num']:'';
-        $state = isset($data['state'])? intval($data['state']) : 0;
+        $state = isset($data['state'])? $data['state'] : 0;
         $charge_kami = isset($data['charge_kami'])?$data['charge_kami'] : '';
         $amount = isset($data['charge_amount'])?floatval($data['charge_amount']) : 0;
-        if($state<=0){
+        if($state==0){
             $this->error = '充值处理中~';
             return false;
         }
 
-        $orderInfo = PayOrdersModel::where(['order_no'=>$out_trade_num,'mark'=>1])->first();
+        $orderInfo = PayOrdersModel::with(['user'])->where(['order_no'=>$out_trade_num,'mark'=>1])->first();
         $orderId = isset($orderInfo['id'])? $orderInfo['id'] : 0;
+        $orderUserId = isset($orderInfo['user_id'])? $orderInfo['user_id'] : 0;
         $status = isset($orderInfo['status'])? $orderInfo['status'] : 0;
         $total = isset($orderInfo['total'])? $orderInfo['total'] : 0;
+        $userInfo = isset($orderInfo['user'])? $orderInfo['user'] : [];
+        $parentId = isset($userInfo['parent_id'])?$userInfo['parent_id'] : 0;
         if(empty($orderInfo) || $orderId<=0 || $total<=0){
             $this->error = '充值订单不存在';
             $this->saveLog("caches:payments:payNotify_{$productId}:notify_{$out_trade_num}_error", ['error'=>$this->error,'order' => $orderInfo, 'notify' => $data]);
@@ -674,9 +681,11 @@ class PaymentService extends BaseService
         }
 
         // 更新订单状态
+        DB::beginTransaction();
         $this->saveLog("caches:payments:payNotify_{$productId}:notify_{$out_trade_num}", ['error'=>$this->error,'order' => $orderInfo, 'notify' => $data]);
         if(!PayOrdersModel::where(['id'=>$orderId])->update(['status'=>$status,'charge_kami'=>$charge_kami,'refund_status'=>$status!=4?2:0,'charge_amount'=>$amount,'update_time'=>time()])){
             $this->error = '更新订单状态错误~';
+            DB::rollBack();
             return false;
         }
 
@@ -684,18 +693,30 @@ class PaymentService extends BaseService
         if($refundAmount>0){
             $orderInfo['money'] = $refundAmount;
             $orderInfo['remark'] = $this->error;
-            $orderInfo['order_trade_no'] = '';
+            $orderInfo['out_trade_no'] = '';
             $refundStatus = PaymentService::make()->refund($orderInfo,'pay');
-            if(!PayOrdersModel::where(['id'=>$orderId])->update(['refund_status'=> $refundStatus?1:3,'refund_money'=>$refundStatus?$refundAmount:0,'update_time'=>time()])){
+            if(!PayOrdersModel::where(['id'=>$orderId])->update(['refund_status'=> $refundStatus?1:3,'refund_remark'=>PaymentService::make()->getError(),'refund_money'=>$refundStatus?$refundAmount:0,'update_time'=>time()])){
                 $this->saveLog("caches:payments:payNotify_{$productId}:notify_{$out_trade_num}_error", ['error'=>$this->error,'order' => $orderInfo, 'notify' => $data]);
                 $this->error = '订单退款状态更新错误~';
+                DB::rollBack();
                 return false;
             }
+        }
 
+        // 订单完成,代理收益结算
+        if($status == 4 && $amount>0)
+        {
+            // 代理佣金结算
+            if (SettleService::make()->agentBonus($orderUserId, $amount, $orderInfo, $parentId) < 0) {
+                DB::rollBack();
+                $this->error = SettleService::make()->getError();
+                return false;
+            }
         }
 
+        DB::commit();
         $this->error = '充值订单处理成功~';
-        return true;
+        return ['id'=>$orderId,'amount'=>$amount,'status'=>$status,'refund'=>$refundAmount];
     }
 
     /**
@@ -758,7 +779,7 @@ class PaymentService extends BaseService
                     $refundStatus = true;
                 } else {
                     DB::rollBack();
-                    $this->error = '微信退款处理失败';
+                    $this->error = '微信退款处理失败'.$pay->message;
                     return false;
                 }
                 break;
@@ -775,7 +796,7 @@ class PaymentService extends BaseService
                 if ($payResult->code == 10000 || intval($payResult->code) == 40004) {
                     $refundStatus = true;
                 } else {
-                    $this->error = '支付宝退款处理失败';
+                    $this->error = '支付宝退款处理失败'.$payResult->code;
                     return false;
                 }
                 break;

+ 7 - 5
routes/api.php

@@ -29,9 +29,7 @@ Route::prefix('v1')->group(function() {
     Route::post('/upload/image', [\App\Http\Controllers\Api\UploadController::class, 'uploadImage']);
     Route::post('/upload/file', [\App\Http\Controllers\Api\UploadController::class, 'uploadFile']);
 
-    // 配置和首页数据
-    Route::get('/config', [\App\Http\Controllers\Api\v1\IndexController::class, 'config']);
-    Route::get('/index/data', [\App\Http\Controllers\Api\v1\IndexController::class, 'data']);
+
 
     // 文章
     Route::post('/article/index', [\App\Http\Controllers\Api\v1\ArticleController::class, 'index']);
@@ -42,6 +40,8 @@ Route::prefix('v1')->group(function() {
     Route::post('/index/goods', [\App\Http\Controllers\Api\v1\GoodsController::class, 'index']);
     Route::post('/goods/category/list', [\App\Http\Controllers\Api\v1\GoodsController::class, 'categorys']);
 
+    Route::get('/order/info', [\App\Http\Controllers\Api\v1\OrderController::class, 'info']);
+
 });
 
 
@@ -50,6 +50,9 @@ Route::prefix('v1')->group(function() {
 Route::prefix('v1')->middleware('web.login')->group(function() {
     Route::get('/logout', [\App\Http\Controllers\Api\v1\LoginController::class, 'logout']);
 
+    // 配置和首页数据
+    Route::get('/config', [\App\Http\Controllers\Api\v1\IndexController::class, 'config']);
+    Route::get('/index/data', [\App\Http\Controllers\Api\v1\IndexController::class, 'data']);
     Route::post('/index/storeGoods', [\App\Http\Controllers\Api\v1\IndexController::class, 'storeGoods']);
 
     // 用户信息
@@ -72,7 +75,6 @@ Route::prefix('v1')->middleware('web.login')->group(function() {
 
     // 订单列表
     Route::post('/order/index', [\App\Http\Controllers\Api\v1\OrderController::class, 'index']);
-    Route::get('/order/info', [\App\Http\Controllers\Api\v1\OrderController::class, 'info']);
     Route::post('/order/count', [\App\Http\Controllers\Api\v1\OrderController::class, 'count']);
     Route::post('/order/submit', [\App\Http\Controllers\Api\v1\OrderController::class, 'submit']);
     Route::post('/order/pay', [\App\Http\Controllers\Api\v1\OrderController::class, 'pay']);
@@ -127,8 +129,8 @@ Route::prefix('v1')->middleware('web.login')->group(function() {
 });
 
 // 回调处理
+Route::match(['get','post'],'/dry/notify/{productId}', [\App\Http\Controllers\Api\v1\NotifyController::class, 'payCallback']);
 Route::match(['get','post'],'/notify/refund/{payType}', [\App\Http\Controllers\Api\v1\NotifyController::class, 'refund']);
-Route::match(['get','post'],'/notify/dry', [\App\Http\Controllers\Api\v1\NotifyController::class, 'payCallback']);
 Route::match(['get','post'],'/notify/{scene}/{payType}', [\App\Http\Controllers\Api\v1\NotifyController::class, 'callback']);
 
 Route::match(['get','post'],'/test/check', [\App\Http\Controllers\Api\v1\TestController::class, 'check']);