wesmiler 3 months ago
parent
commit
15cd55872c
38 changed files with 484 additions and 228 deletions
  1. 1 1
      app/Helpers/common.php
  2. 20 0
      app/Http/Controllers/Api/v1/AddressController.php
  3. 2 2
      app/Http/Controllers/Api/v1/CartController.php
  4. 24 12
      app/Http/Controllers/Api/v1/GoodsController.php
  5. 24 20
      app/Http/Controllers/Api/v1/OrderController.php
  6. 5 3
      app/Http/Validator/OrderValidator.php
  7. 43 0
      app/Models/GoodsCollectModel.php
  8. 4 3
      app/Services/Api/CartService.php
  9. 98 3
      app/Services/Api/GoodsService.php
  10. 147 126
      app/Services/Api/OrderService.php
  11. 27 7
      app/Services/Api/StoreService.php
  12. 1 1
      app/Services/Common/AdService.php
  13. 32 5
      app/Services/PaymentService.php
  14. 1 1
      config/payment.php
  15. BIN
      public/uploads/images/base64/20251226/image_e27537109140362782f1dbc5beeb8b80.jpeg
  16. BIN
      public/uploads/temp/20251226/MS5wbmc.png
  17. BIN
      public/uploads/temp/20251226/Mi5wbmc.png
  18. BIN
      public/uploads/temp/20251226/MjAyNTEyMjYwMjU3MS5wbmc.png
  19. BIN
      public/uploads/temp/20251226/MjAyNTEyMjYwMzA0MS5wbmc.png
  20. BIN
      public/uploads/temp/20251226/MjAyNTEyMjYwMzAwMS5wbmc.png
  21. BIN
      public/uploads/temp/20251226/MjAyNTEyMjYwMzAwMi5wbmc.png
  22. BIN
      public/uploads/temp/20251226/MjAyNTEyMjYwMzAwMy5wbmc.png
  23. BIN
      public/uploads/temp/20251226/MjAyNTEyMjYwMzAwNC5wbmc.png
  24. BIN
      public/uploads/temp/20251226/MjAyNTEyMjYwMzAxMS5wbmc.png
  25. BIN
      public/uploads/temp/20251226/MjAyNTEyMjYwMzAxMi5wbmc.png
  26. BIN
      public/uploads/temp/20251226/MjAyNTEyMjYwMzAxMy5wbmc.png
  27. BIN
      public/uploads/temp/20251226/MjAyNTEyMjYwMzAxNi5wbmc.png
  28. BIN
      public/uploads/temp/20251226/MjAyNTEyMjYwMzAyMi5wbmc.png
  29. BIN
      public/uploads/temp/20251226/MjAyNTEyMjYwMzAyNC5wbmc.png
  30. BIN
      public/uploads/temp/20251226/MjAyNTEyMjYwMzAyNS5wbmc.png
  31. BIN
      public/uploads/temp/20251226/MjAyNTEyMjYwMzAyNi5wbmc.png
  32. BIN
      public/uploads/temp/20251226/My5wbmc.png
  33. BIN
      public/uploads/temp/20251226/NC5wbmc.png
  34. BIN
      resources/certs/wechat/apiclient_cert.p12
  35. 17 17
      resources/certs/wechat/apiclient_cert.pem
  36. 26 26
      resources/certs/wechat/apiclient_key.pem
  37. 9 0
      resources/certs/wechat/pub_key.pem
  38. 3 1
      routes/api.php

+ 1 - 1
app/Helpers/common.php

@@ -1835,7 +1835,7 @@ if (!function_exists('upload_image')) {
         }
 
         // 文件名称
-        $file_name = ($userId? $userId.'_'.str_replace('=','',base64_encode($userId.$original_name)): str_replace('=','',base64_encode($original_name)));
+        $file_name = ($userId? $userId.'_'.str_replace('=','',base64_encode(date('YmdHi').$userId.$original_name)): str_replace('=','',base64_encode(date('YmdHi').$original_name)));
         $file_name =  $file_name. '.' . $ext;
 
         // 重命名保存

+ 20 - 0
app/Http/Controllers/Api/v1/AddressController.php

@@ -100,6 +100,26 @@ class AddressController extends webApp
     }
 
     /**
+     * 绑定的地址
+     * @return array
+     */
+    public function getBindInfo()
+    {
+        $params = request()->all();
+        $id = isset($params['id'])? $params['id'] :0;
+        try {
+            if(!$result = MemberAddressService::make()->getBindInfo($this->userId, $id)){
+                return showJson(1009, false);
+            }else{
+                return showJson(1010, true, $result);
+            }
+        } catch (\Exception $exception) {
+            $error = ['data' => $exception->getTrace(), 'err' => $exception->getMessage()];
+            return showJson(1046, false, $error);
+        }
+    }
+
+    /**
      * 删除
      * @return array|mixed
      */

+ 2 - 2
app/Http/Controllers/Api/v1/CartController.php

@@ -103,9 +103,9 @@ class CartController extends webApp
         try {
 
             if ($result = CartService::make()->getCount($this->userId)) {
-                return message(CartService::make()->getError(), true, $result);
+                return message(1010, true, $result);
             } else {
-                return message(CartService::make()->getError(), false);
+                return message(1009, false);
             }
         } catch (\Exception $exception) {
             $error = ['data' => $exception->getTrace(), 'err' => $exception->getMessage()];

+ 24 - 12
app/Http/Controllers/Api/v1/GoodsController.php

@@ -47,21 +47,33 @@ class GoodsController extends webApp
         if(empty($id)){
             return message(1036, false);
         }
-
-        $userInfo = MemberService::make()->getInfo($this->userId,[], true);
-        $confirmStatus = isset($userInfo['confirm_status'])? $userInfo['confirm_status'] : 0;
-        $pickerStatus = isset($userInfo['picker_status'])? $userInfo['picker_status'] : 0;
-        if($confirmStatus != 1){
-            return message(2043, false,[],405);
-        }
-
-        if($pickerStatus!= 1){
-            return message(2063, false,[],406);
-        }
-        if($info = GoodsService::make()->getInfo($id)){
+        if($info = GoodsService::make()->getInfo($id, $this->userId)){
             return message(1010, true, $info);
         }else{
             return message(1009, false);
         }
     }
+
+    /**
+     * 收藏
+     */
+    public function collect()
+    {
+        $params = request()->all();
+        $id = isset($params['id']) ? intval($params['id']) : 0;
+        if (empty($id)) {
+            return message(1036, false);
+        }
+        try {
+
+            if ($result = GoodsService::make()->collect($this->userId, $id)) {
+                return message(GoodsService::make()->getError(), true, $result);
+            } else {
+                return message(GoodsService::make()->getError(), false);
+            }
+        } catch (\Exception $exception) {
+            $error = ['data' => $exception->getTrace(), 'err' => $exception->getMessage()];
+            return showJson(1046, false, $error);
+        }
+    }
 }

+ 24 - 20
app/Http/Controllers/Api/v1/OrderController.php

@@ -21,17 +21,17 @@ class OrderController extends webApp
     public function index()
     {
         $userInfo = MemberService::make()->getInfo($this->userId);
-        $confirmStatus = isset($userInfo['confirm_status'])? $userInfo['confirm_status'] : 0;
-        $pickerStatus = isset($userInfo['picker_status'])? $userInfo['picker_status'] : 0;
-        if($confirmStatus != 1){
-            return message(2043, false,[],405);
+        $confirmStatus = isset($userInfo['confirm_status']) ? $userInfo['confirm_status'] : 0;
+        $pickerStatus = isset($userInfo['picker_status']) ? $userInfo['picker_status'] : 0;
+        if ($confirmStatus != 1) {
+            return message(2043, false, [], 405);
         }
 
-        if($pickerStatus!= 1){
-            return message(2063, false,[],406);
+        if ($pickerStatus != 1) {
+            return message(2063, false, [], 406);
         }
 
-        $params =request()->post();
+        $params = request()->post();
         $pageSize = request()->post('pageSize', 15);
         $params['user_id'] = $this->userId;
         $datas = OrderService::make()->getDataList($params, $pageSize);
@@ -45,9 +45,8 @@ class OrderController extends webApp
      */
     public function check()
     {
-        if($data = OrderService::make()->checkOrderStatus($this->userId))
-        {
-            return showJson(1010, true,$data);
+        if ($data = OrderService::make()->checkOrderStatus($this->userId)) {
+            return showJson(1010, true, $data);
         } else {
             return showJson(1009, false);
         }
@@ -59,7 +58,7 @@ class OrderController extends webApp
      */
     public function count()
     {
-        $status =  request()->post('status', 1);
+        $status = request()->post('status', 1);
         $data = OrderService::make()->getCountByStatus($this->userId, $status);
         return showJson(1010, true, $data);
     }
@@ -78,12 +77,12 @@ class OrderController extends webApp
             return showJson($params, false);
         }
 
-        $id = isset($params['order_id'])? intval($params['order_id']) : 0;
-        if($id<=0){
-            return showJson(1036,false);
+        $id = isset($params['order_id']) ? intval($params['order_id']) : 0;
+        if ($id <= 0) {
+            return showJson(1036, false);
         }
         $data = OrderService::make()->getOrderInfo($id, $this->userId);
-        if(empty($data)){
+        if (empty($data)) {
             return showJson(1009, false);
         }
         return showJson(1010, true, $data);
@@ -102,11 +101,16 @@ class OrderController extends webApp
             return showJson($params, false);
         }
 
-        if (!$result = OrderService::make()->createOrder($this->userId, $params)) {
-            $error = OrderService::make()->getError();
-            return showJson($error, false,'',$error==2206?'405':-1);
-        } else {
-            return showJson(OrderService::make()->getError(), true, $result);
+        try {
+            if (!$result = OrderService::make()->createOrder($this->userId, $params)) {
+                $error = OrderService::make()->getError();
+                return showJson($error, false, '', $error == 2206 ? '405' : -1);
+            } else {
+                return showJson(OrderService::make()->getError(), true, $result);
+            }
+        } catch (\Exception $exception) {
+            $error = ['data' => $exception->getTrace(), 'err' => $exception->getMessage()];
+            return showJson(1046, false, $error);
         }
     }
 

+ 5 - 3
app/Http/Validator/OrderValidator.php

@@ -5,7 +5,8 @@ class OrderValidator extends BaseValidator
     // 当前模型所有验证规则
     public static $rules = [
         'id' => 'required',
-        'goods_id' => 'required',
+        'goods' => 'required',
+        'address_id' => 'required',
         'remark' => 'required|max:10',
     ];
 
@@ -23,7 +24,8 @@ class OrderValidator extends BaseValidator
     // 当前模型所有验证字段
     public static $fields = [
         'id' => '订单ID',
-        'goods_id' => '接单信息',
+        'address_id' => '收货地址',
+        'goods' => '商品参数',
         'remark' => '备注说明',
     ];
 
@@ -33,7 +35,7 @@ class OrderValidator extends BaseValidator
         'cancel'=> ['id','remark'],
         'confirm'=> ['id'],
         'complete'=> ['id'],
-        'submit'=> ['goods_id'],
+        'submit'=> ['address_id','goods'],
     ];
 
     /**

+ 43 - 0
app/Models/GoodsCollectModel.php

@@ -0,0 +1,43 @@
+<?php
+// +----------------------------------------------------------------------
+// | LARAVEL8.0 框架 [ LARAVEL ][ RXThinkCMF ]
+// +----------------------------------------------------------------------
+// | 版权所有 2017~2021 LARAVEL研发中心
+// +----------------------------------------------------------------------
+// | 官方网站: http://www.laravel.cn
+// +----------------------------------------------------------------------
+// | Author: laravel开发员 <laravel.qq.com>
+// +----------------------------------------------------------------------
+
+namespace App\Models;
+
+/**
+ * 商品收藏管理-模型
+ * @author laravel开发员
+ * @since 2020/11/11
+ * @package App\Models
+ */
+class GoodsCollectModel extends BaseModel
+{
+    // 设置数据表
+    protected $table = 'goods_collects';
+
+    /**
+     * 用户
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function member()
+    {
+        return $this->hasOne(MemberModel::class, 'id', 'user_id')
+            ->select(['id', 'realname', 'nickname', 'mobile', 'status']);
+    }
+
+    /**
+     * 商品
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function goods()
+    {
+        return $this->hasOne(GoodsModel::class, 'id', 'goods_id');
+    }
+}

+ 4 - 3
app/Services/Api/CartService.php

@@ -12,10 +12,10 @@
 namespace App\Services\Api;
 
 use App\Models\CartModel;
-use App\Models\GoodsCategoryModel;
 use App\Models\GoodsModel;
 use App\Services\BaseService;
 use App\Services\RedisService;
+use Illuminate\Support\Facades\DB;
 
 /**
  * 购物车管理-服务类
@@ -163,11 +163,11 @@ class CartService extends BaseService
         }
 
         // 去除其他店铺购物车
-        $this->model->where(['user_id' => $userId, 'mark' => 1])->whereNotIn('store_id', $storeId)->update(['mark' => 0, 'update_time' => time()]);
+        $this->model->where(['user_id' => $userId, 'mark' => 1])->whereNotIn('store_id', [$storeId])->update(['mark' => 0, 'update_time' => time()]);
 
         // 添加购物型
         if ($id = $this->model->where(['user_id' => $userId, 'goods_id' => $goodsId])->value('id')) {
-            $this->model->where(['id' => $id])->update(['store_id' => $storeId,'num'=> $num, 'sku_id' => $skuType == 1 ? 0 : $skuId, 'status' => 1, 'mark' => 1, 'create_time' => time()]);
+            $this->model->where(['id' => $id])->update(['store_id' => $storeId,'num'=> DB::raw("num+{$num}"), 'sku_id' => $skuType == 1 ? 0 : $skuId, 'status' => 1, 'mark' => 1, 'create_time' => time()]);
         } else {
             $data = [
                 'user_id' => $userId,
@@ -182,6 +182,7 @@ class CartService extends BaseService
             $id = $this->model->insertGetId($data);
         }
 
+        $this->error = '添加成功';
         RedisService::clear($cacheKey.'_lock');
         RedisService::clear("caches:goods:cartCount:{$userId}");
         return ['id' => $id, 'count' => $this->getCount($userId)];

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

@@ -12,7 +12,9 @@
 namespace App\Services\Api;
 
 use App\Models\GoodsCategoryModel;
+use App\Models\GoodsCollectModel;
 use App\Models\GoodsModel;
+use App\Models\GoodsSkuModel;
 use App\Services\BaseService;
 use App\Services\RedisService;
 
@@ -156,20 +158,113 @@ class GoodsService extends BaseService
      * @param $id
      * @return mixed
      */
-    public function getInfo($id)
+    public function getInfo($id,$userId=0)
     {
-        $cacheKey = "caches:goods:info_{$id}";
+        $cacheKey = "caches:goods:info_{$id}_{$userId}";
         $info = RedisService::get($cacheKey);
         if ($info) {
             return $info;
         }
 
-        $info = $this->model->with(['store','category'])->where(['id' => $id])->first();
+        $info = $this->model->with(['store','category','skus'])->where(['id' => $id])->first();
         $info = $info ? $info->toArray() : [];
         if ($info) {
+            $checkId = GoodsCollectModel::where(['user_id'=>$userId,'goods_id'=>$id])->value('id');
+            $info['is_collect'] = $checkId? 1 : 0;
             RedisService::set($cacheKey, $info, rand(10, 20));
         }
         return $info;
     }
 
+    /**
+     * 收藏
+     * @param $userId
+     * @param $goodsId
+     * @return array|false
+     */
+    public function collect($userId, $goodsId)
+    {
+        $info = $this->model->where(['id' => $goodsId,'status'=>1,'mark'=>1])->first();
+        $info = $info ? $info->toArray() : [];
+        if(empty($info)){
+            $this->error = '商品已下架';
+            return false;
+        }
+
+
+        if($id = GoodsCollectModel::where(['user_id'=>$userId,'goods_id'=>$goodsId,'mark'=>1])->value('id')){
+            GoodsCollectModel::where(['id'=>$id])->update(['mark'=>0,'update_time'=>time()]);
+            $this->error = '取消收藏';
+            RedisService::clear("caches:goods:info_{$id}_{$userId}");
+            return ['id'=>$id,'is_collect'=>0];
+        }else{
+            if(!$id = GoodsCollectModel::insertGetId(['user_id'=>$userId,'goods_id'=>$goodsId,'status'=>1,'mark'=>1,'create_time'=>time(),'update_time'=>time()])){
+                $this->error = '收藏失败';
+                return false;
+            }
+
+            $this->error = '收藏成功';
+            RedisService::clear("caches:goods:info_{$id}_{$userId}");
+            return ['id'=>$id,'is_collect'=>1];
+        }
+    }
+
+    /**
+     * @param $ids
+     * @param $goods
+     * @param $orderNo
+     * @return array|false
+     */
+    public function getOrderGoods($ids, $goods, $orderNo, $userId=0)
+    {
+        $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'])
+            ->get();
+        $list = $list? $list->toArray() : [];
+        if($list){
+            $skus = GoodsSkuModel::whereIn('goods_id', $ids)->select(['id','price','stock'])->get()->keyBy('id');
+            $skus = $skus?$skus->toArray() :[];
+            $result = ['store_id'=>0,'total'=>0,'count'=>0,'goods'=>[]];
+//            var_dump($skus);
+//            var_dump($list);
+//            var_dump($goods);
+            foreach ($list as $item){
+                $item['order_no'] = $orderNo;
+                $id = isset($item['goods_id'])?$item['goods_id']:0;
+                $params = isset($goods['id_'.$id])? $goods['id_'.$id]:[];
+                $goodsId = isset($params['id'])?$params['id']:0;
+                $storeId = isset($item['store_id'])?$item['store_id']:0;
+                $num = isset($params['num'])?$params['num']:0;
+                $skuId = isset($params['sku_id'])?$params['sku_id']:0;
+                $skuType = isset($item['sku_type'])?$item['sku_type']: 1;
+                $skuData = isset($skus[$skuId])? $skus[$skuId]:[];
+                $skuPrice = isset($skuData['price'])?$skuData['price']:0;
+                $price = $skuType==2 ? $skuPrice : $item['price'];
+                unset($item['skus']);
+                if($result['store_id'] && $storeId != $result['store_id']){
+                    $this->error = '一次只能购买同一个商家的商品,请核对后重试~';
+                    return false;
+                }
+                if($num>0 && $goodsId == $id && $price>0){
+                    $result['store_id'] = $storeId;
+                    $item['user_id'] = $userId;
+                    $item['sku_id'] = $skuId;
+                    $item['price'] = $price;
+                    $item['total'] = $price;
+                    $item['num'] = $num;
+                    $total = round($price * $num,2);
+                    $item['total'] = $total;
+                    $item['thumb'] = get_image_path($item['thumb']);
+                    $result['goods'][] = $item;
+                    $result['total'] += $total;
+                    $result['count']++;
+                }
+            }
+
+            return $result;
+        }
+
+        return false;
+    }
 }

+ 147 - 126
app/Services/Api/OrderService.php

@@ -13,9 +13,12 @@ namespace App\Services\Api;
 
 use App\Models\GoodsModel;
 use App\Models\MemberModel;
+use App\Models\OrderGoodsModel;
 use App\Models\OrderModel;
+use App\Models\StoreModel;
 use App\Services\BaseService;
 use App\Services\ConfigService;
+use App\Services\PaymentService;
 use App\Services\RedisService;
 use Illuminate\Support\Facades\DB;
 
@@ -67,7 +70,7 @@ class OrderService extends BaseService
             // 进行中
             if ($status > 0 && is_array($status)) {
                 $query->whereIn('a.status', $status);
-            }else if($status>0){
+            } else if ($status > 0) {
                 $query->where('a.status', $status);
             }
         })->select(['a.*'])
@@ -87,8 +90,8 @@ class OrderService extends BaseService
                 }
 
                 $item['goods'] = isset($item['goods']) && $item['goods'] ? $item['goods'] : [];
-                $item['goods']['shipper_phone_text'] = $item['goods']['shipper_phone']?format_mobile($item['goods']['shipper_phone']) : '';
-                $item['goods']['receiver_phone_text'] = $item['goods']['receiver_phone']?format_mobile($item['goods']['receiver_phone']) : '';
+                $item['goods']['shipper_phone_text'] = $item['goods']['shipper_phone'] ? format_mobile($item['goods']['shipper_phone']) : '';
+                $item['goods']['receiver_phone_text'] = $item['goods']['receiver_phone'] ? format_mobile($item['goods']['receiver_phone']) : '';
             }
             unset($item);
         }
@@ -111,9 +114,9 @@ class OrderService extends BaseService
         return $this->model->from('orders as a')->with(['goods'])
             ->leftJoin('member as b', 'b.id', '=', 'a.user_id')
             ->where($where)
-            ->where(function($query) use($params){
+            ->where(function ($query) use ($params) {
                 $userId = isset($params['user_id']) ? intval($params['user_id']) : 0;
-                if($userId>0){
+                if ($userId > 0) {
                     $query->where('a.user_id', $userId);
                 }
             })
@@ -150,8 +153,8 @@ class OrderService extends BaseService
             }
 
             $info['goods'] = isset($info['goods']) && $info['goods'] ? $info['goods'] : [];
-            $info['goods']['shipper_phone_text'] = $info['goods']['shipper_phone']?format_mobile($info['goods']['shipper_phone']) : '';
-            $info['goods']['receiver_phone_text'] = $info['goods']['receiver_phone']?format_mobile($info['goods']['receiver_phone']) : '';
+            $info['goods']['shipper_phone_text'] = $info['goods']['shipper_phone'] ? format_mobile($info['goods']['shipper_phone']) : '';
+            $info['goods']['receiver_phone_text'] = $info['goods']['receiver_phone'] ? format_mobile($info['goods']['receiver_phone']) : '';
         }
 
         return $info;
@@ -165,105 +168,111 @@ class OrderService extends BaseService
      */
     public function createOrder($userId, $params)
     {
-        $goodsId = isset($params['goods_id']) && $params['goods_id'] ? intval($params['goods_id']) : 0;
+        $addressId = isset($params['address_id']) && $params['address_id'] ? $params['address_id'] : 0;
+        $goods = isset($params['goods']) && $params['goods'] ? $params['goods'] : [];
+        $ids = $goods ? array_column($goods,'id') : [];
         // 参数验证
-        if (empty($goodsId)) {
-            $this->error = 2103;
+        if (empty($goods) || empty($ids)) {
+            $this->error = '商品参数不为空';
+            return false;
+        }
+
+        if ($addressId <= 0) {
+            $this->error = '请选择收货地址';
             return false;
         }
 
         // 缓存锁
-        $cacheLockKey = "caches:orders:submit_lock:{$userId}_{$goodsId}";
+        $cacheLockKey = "caches:orders:submit_lock:{$userId}";
         if (RedisService::get($cacheLockKey)) {
-            $this->error = 2107;
+            $this->error = '订单处理中~';
             return false;
         }
 
-        // 货物信息
-        RedisService::set($cacheLockKey, ['params' => $params, 'user_id' => $userId], rand(2, 3));
-        $goodsInfo = GoodsModel::where(['id' => $goodsId,'status'=>1, 'mark' => 1])
-            ->select(['id','num', 'price','picker_status', 'status'])
-            ->first();
-        $pickerStatus = isset($goodsInfo['picker_status']) ? $goodsInfo['picker_status'] : 0;
-        $price = isset($goodsInfo['price']) ? floatval($goodsInfo['price']) : 0;
-        $num = isset($goodsInfo['num']) ? intval($goodsInfo['num']) : 0;
-        if(empty($goodsInfo)){
-            $this->error = 2201;
+        // 商品数据
+        $orderNo = get_order_num('GX');
+        RedisService::set($cacheLockKey, ['params' => $params, 'user_id' => $userId], rand(3, 5));
+        $result = GoodsService::make()->getOrderGoods($ids, $goods, $orderNo, $userId);
+        if (empty($result)) {
+            RedisService::clear($cacheLockKey);
+            $this->error = GoodsService::make()->getError();
+            return false;
+        }
+
+        $orderGoods = isset($result['goods']) ? $result['goods'] : [];
+        $orderTotal = isset($result['total']) ? $result['total'] : 0;
+        $orderCount = isset($result['count']) ? $result['count'] : 0;
+        $storeId = isset($result['store_id']) ? $result['store_id'] : 0;
+        if (empty($orderGoods)) {
             RedisService::clear($cacheLockKey);
+            $this->error = '获取订单商品错误~';
             return false;
         }
 
-        if(in_array($pickerStatus,[2,3])){
-            $this->error = "220{$pickerStatus}";
+        if ($orderTotal <= 0) {
             RedisService::clear($cacheLockKey);
+            $this->error = '订单金额错误~';
             return false;
         }
 
-        if($price<=0){
-            $this->error = 2204;
+        if ($orderCount <= 0) {
             RedisService::clear($cacheLockKey);
+            $this->error = '订单商品数量错误~';
             return false;
         }
 
         // 用户信息
         $userInfo = MemberModel::where(['id' => $userId, 'mark' => 1])
-            ->select(['id', 'mobile', 'nickname','realname','deposit','picker_status','confirm_status', 'status'])
+            ->select(['id', 'openid', 'mobile', 'nickname', 'realname', 'balance', 'status'])
             ->first();
         $status = isset($userInfo['status']) ? $userInfo['status'] : 0;
-        $nickname = isset($userInfo['nickname']) ? $userInfo['nickname'] : '';
-        $realname = isset($userInfo['realname']) ? $userInfo['realname'] : '';
-        $mobile = isset($userInfo['mobile']) ? $userInfo['mobile'] : '';
-        $confirmStatus = isset($userInfo['confirm_status']) ? $userInfo['confirm_status'] : 0;
-        $userPickerStatus = isset($userInfo['picker_status']) ? $userInfo['picker_status'] : 0;
-        $userDeposit = isset($userInfo['deposit']) ? floatval($userInfo['deposit']) : 0;
-        if(empty($userInfo) || $status != 1){
-            $this->error = 2016;
+        $openid = isset($userInfo['openid']) ? $userInfo['openid'] : '';
+        if (empty($userInfo) || $status != 1) {
+            $this->error = 1045;
             RedisService::clear($cacheLockKey);
             return false;
         }
 
-        // 账号审核情况
-        if($confirmStatus != 1){
-            $this->error = 2042;
+        if (empty($openid)) {
+            $this->error = '用户微信未授权,请重新授权登录';
             RedisService::clear($cacheLockKey);
             return false;
         }
 
-        if($userPickerStatus != 1){
-            $this->error = 2205;
+        // 收货地址信息
+        $addressInfo = MemberAddressService::make()->getBindInfo($userId, $addressId);
+        $realname = isset($addressInfo['realname']) ? $addressInfo['realname'] : '';
+        $mobile = isset($addressInfo['mobile']) ? $addressInfo['mobile'] : '';
+        $area = isset($addressInfo['area']) ? $addressInfo['area'] : '';
+        $address = isset($addressInfo['address']) ? $addressInfo['address'] : '';
+        if (empty($addressInfo) || empty($realname) || empty($mobile) || empty($area) || empty($address)) {
             RedisService::clear($cacheLockKey);
+            $this->error = '收货地址信息错误,请核对后重试~';
             return false;
         }
 
-        // 缴纳保证金验证
-        $depositMoney = ConfigService::make()->getConfigByCode('deposit_money',0);
-        if($depositMoney>0 && ($userDeposit < $depositMoney)){
-            $this->error = 2206;
-            RedisService::clear($cacheLockKey);
-            return false;
-        }
+        // 商家佣金
+        $storeInfo = StoreModel::where(['id' => $storeId])->first();
+        $bonusRate = isset($storeInfo['bonus_rate']) ? floatval($storeInfo['bonus_rate']) : 0;
+        $storeBonusRate = ConfigService::make()->getConfigByCode('store_bonus_rate', 0);
+        $storeBonusRate = $storeBonusRate > 0 && $storeBonusRate <= 100 ? $storeBonusRate : 0;
+        $bonusRate = $bonusRate > 0 && $bonusRate <= 100 ? $bonusRate : $storeBonusRate;
+        $bonus = moneyFormat($orderTotal * $bonusRate, 2);
+
+        $orderTotal = 0.1;
 
         // 订单数据
-        $pickerCount = $this->model->where(['goods_id'=> $goodsId,'mark'=>1])->whereIn('status',[1,2])->count('id');
-        if($this->model->where(['user_id'=>$userId,'goods_id'=>$goodsId,'mark'=>1])->whereIn('status',[1,2,3])->value('id')){
-            $this->error = 2209;
-            RedisService::clear($cacheLockKey);
-            return false;
-        }
-        if($this->model->where(['user_id'=>$userId,'mark'=>1])->whereIn('status',[1,2])->value('id')){
-            $this->error = 2209;
-            RedisService::clear($cacheLockKey);
-            return false;
-        }
-        $bonusRate = ConfigService::make()->getConfigByCode('picker_bonus_rate',100);
-        $bonusRate = $bonusRate>0 && $bonusRate<=100? intval($bonusRate) : 100;
-        $bonus = moneyFormat($price * $bonusRate/100,2);
-        $orderNo = get_order_num('PD');
         $order = [
             'order_no' => $orderNo,
             'user_id' => $userId,
-            'goods_id' => $goodsId,
-            'total' => $price,
+            'store_id' => $storeId,
+            'total' => $orderTotal,
+            'num' => $orderCount,
+            'pay_total' => $orderTotal,
+            'receiver_name' => $realname,
+            'receiver_mobile' => $mobile,
+            'receiver_area' => $area,
+            'receiver_address' => $address,
             'bonus' => $bonus,
             'create_time' => time(),
             'update_time' => time(),
@@ -275,36 +284,48 @@ class OrderService extends BaseService
         DB::beginTransaction();
         if (!$orderId = $this->model->insertGetId($order)) {
             DB::rollBack();
-            $this->error = 2207;
+            $this->error = '创建订单失败';
+            RedisService::clear($cacheLockKey);
+            return false;
+        }
+
+        // 订单商品
+        if($orderGoods && !OrderGoodsModel::insert($orderGoods)){
+            DB::rollBack();
+            $this->error = '处理订单商品错误';
             RedisService::clear($cacheLockKey);
             return false;
         }
 
-        $title = "用户【{$realname}-{$mobile}】有新的抢单";
-        $message = [
-            'from_uid'=> $userId,
-            'to_uid'=> 1,
-            'op'=> 'notice',
-            'scene'=> 'picker',
-            'message'=> '接单消息',
-            'type'=> 5,
-            'order'=>[
-                'title'=> $title.'<span class="ele-text-primary">查看订单</span>',
-                'order_no'=> $orderNo,
-                'money'=> $bonus,
-                'date'=> date('Y-m-d H:i:s'),
-                'user_id'=> $userId,
-                'type'=> 'deposit',
-                'remark'=> '接单消息',
-            ]
+        // 获取支付参数
+        /* TODO 支付处理 */
+        $payOrder = [
+            'type' => 1,
+            'order_no' => $orderNo,
+            'pay_money' => $orderTotal,
+            'body' => '购物消费',
+            'openid' => $openid
         ];
 
+        // 调起支付
+        $payment = PaymentService::make()->minPay($userInfo, $payOrder, 'store');
+        if (empty($payment)) {
+            DB::rollBack();
+            RedisService::clear($cacheLockKey);
+            $this->error = PaymentService::make()->getError();
+            return false;
+        }
+
+        // 用户操作记录
         DB::commit();
-        $pickerCount = $pickerCount+1;
-        $this->error = lang('2210');
+        $this->error = '订单创建成功,请前往支付~';
         RedisService::clear($cacheLockKey);
-        RedisService::keyDel("caches:goods:picker*");
-        return ['order_id' => $orderId,'message'=>$message, 'total' => $price, 'num' => $pickerCount<=3?3:$pickerCount, 'goods' => $goodsId];
+        return [
+            'order_id' => $orderId,
+            'payment' => $payment,
+            'total' => $payOrder['pay_money'],
+            'pay_type' => 10,
+        ];
     }
 
     /**
@@ -313,19 +334,19 @@ class OrderService extends BaseService
      * @param int $type
      * @return array|mixed
      */
-    public function getCountByDay($userId, $status=3)
+    public function getCountByDay($userId, $status = 3)
     {
         $cacheKey = "caches:orders:count_day_{$userId}_{$status}";
         $data = RedisService::get($cacheKey);
-        if($data){
+        if ($data) {
             return $data;
         }
 
-        $data = $this->model->where(['user_id'=> $userId,'status'=>$status,'mark'=>1])
-            ->where('create_time','>=', strtotime(date('Y-m-d')))
+        $data = $this->model->where(['user_id' => $userId, 'status' => $status, 'mark' => 1])
+            ->where('create_time', '>=', strtotime(date('Y-m-d')))
             ->count('id');
-        if($data){
-            RedisService::set($cacheKey, $data, rand(5,10));
+        if ($data) {
+            RedisService::set($cacheKey, $data, rand(5, 10));
         }
 
         return $data;
@@ -337,18 +358,18 @@ class OrderService extends BaseService
      * @param int $status
      * @return array|mixed
      */
-    public function getCountByStatus($userId, $status=3)
+    public function getCountByStatus($userId, $status = 3)
     {
         $cacheKey = "caches:orders:count_status_{$userId}_{$status}";
         $data = RedisService::get($cacheKey);
-        if($data){
+        if ($data) {
             return $data;
         }
 
-        $data = $this->model->where(['user_id'=> $userId,'status'=>$status,'mark'=>1])
+        $data = $this->model->where(['user_id' => $userId, 'status' => $status, 'mark' => 1])
             ->count('id');
-        if($data){
-            RedisService::set($cacheKey, $data, rand(5,10));
+        if ($data) {
+            RedisService::set($cacheKey, $data, rand(5, 10));
         }
 
         return $data;
@@ -363,45 +384,45 @@ class OrderService extends BaseService
     {
         $cacheKey = "caches:orders:checkOrder:{$userId}";
         $data = RedisService::get($cacheKey);
-        if($data){
+        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')
+        $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() : [];
+        $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){
+        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){
+            } else if ($status == 2) {
                 $message = "恭喜您,抢单成功,请前往完成订单!";
-            }else if($status == 3){
+            } 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;
+            } 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];
+            $result = ['order_id' => $orderId, 'goods_id' => $goodsId, 'confirm_order_id' => $confirmOrderId, 'status' => $status, 'message' => $message];
             RedisService::set($cacheKey, $result, rand(10, 20));
         }
 

+ 27 - 7
app/Services/Api/StoreService.php

@@ -107,21 +107,41 @@ class StoreService extends BaseService
         if ($status > 0) {
             $where['a.status'] = $status;
         }
-        $list = $this->model->with(['goods'])->from('stores as a')
-            ->leftJoin('goods as b', function($join){
-                $join->on('b.store_id', '=', 'a.id')->where(['b.status'=>1,'b.mark'=>1]);
+        $list = $this->model->with(['goods'=>function($query)use($params){
+            $categoryId = isset($params['category_id']) ? $params['category_id'] : 0;
+            if ($categoryId>0) {
+                $query->where('goods.category_id', $categoryId);
+            }
+
+            $keyword = isset($params['keyword']) ? $params['keyword'] : '';
+            if ($keyword) {
+                $query->where(function($query) use($keyword){
+                    $query->where('a.name', 'like', "%{$keyword}%")
+                        ->orWhere('goods.goods_name', 'like', "%{$keyword}%")
+                        ->orWhere('goods.tags', 'like', "%{$keyword}%");
+                });
+            }
+        }])->from('stores as a')
+            ->leftJoin('goods', function($join){
+                $join->on('goods.store_id', '=', 'a.id')->where(['goods.status'=>1,'goods.mark'=>1]);
             })
             ->where($where)
-            ->where('b.id','>',0)
+            ->where('goods.id','>',0)
             ->where(function ($query) use ($params) {
                 $keyword = isset($params['keyword']) ? $params['keyword'] : '';
                 if ($keyword) {
                     $query->where('a.name', 'like', "%{$keyword}%")
-                        ->orWhere('b.goods_name', 'like', "%{$keyword}%")
-                        ->orWhere('b.tags', 'like', "%{$keyword}%");
+                        ->orWhere('goods.goods_name', 'like', "%{$keyword}%")
+                        ->orWhere('goods.tags', 'like', "%{$keyword}%");
+                }
+            })
+            ->where(function ($query) use ($params) {
+                $categoryId = isset($params['category_id']) ? $params['category_id'] : 0;
+                if ($categoryId>0) {
+                    $query->where('goods.category_id', $categoryId);
                 }
             })
-            ->select(['a.id','a.logo','a.name','a.user_id','a.status','b.id as goods_id'])
+            ->select(['a.id','a.logo','a.name','a.user_id','a.status','a.sort','goods.id as goods_id'])
             ->groupBy('a.id')
             ->orderBy('a.sort', 'desc')
             ->orderBy('a.id', 'desc')

+ 1 - 1
app/Services/Common/AdService.php

@@ -52,7 +52,7 @@ class AdService extends BaseService
         $showNum = \App\Services\ConfigService::make()->getConfigByCode('show_banner_num', 6);
         $num = $num? $num : $showNum;
         $datas = $this->model->where(['position'=> $position,'status'=> 1,'mark'=>1])
-            ->select(['id','cover','title','url','description','type'])
+            ->select(['id','cover','title','url','description'])
             ->limit($num)
             ->get()
             ->each(function($item, $k){

+ 32 - 5
app/Services/PaymentService.php

@@ -15,6 +15,7 @@ use App\Models\AccountLogModel;
 use App\Models\MemberModel;
 use App\Models\OrderModel;
 use App\Models\PaymentModel;
+use App\Models\PayOrdersModel;
 use Illuminate\Support\Facades\DB;
 use Yansongda\Pay\Pay;
 use Yansongda\Pay\Provider\Wechat;
@@ -57,7 +58,7 @@ class PaymentService extends BaseService
 
     /**
      * 创建支付
-     * @param string $scene 场景,vip-VIP会员
+     * @param string $scene 场景,store-购物消费,pay-生活充值,refund-退款
      * @param int $payType
      * @param int $isMin 是否是小程序
      * @return false|\Yansongda\Pay\Provider\Alipay|Wechat
@@ -153,7 +154,7 @@ class PaymentService extends BaseService
      * @param string $scene
      * @return false|\Yansongda\Supports\Collection
      */
-    public function minPay($userInfo, $order, $scene = 'pay')
+    public function minPay($userInfo, $order, $scene = 'store')
     {
         $amount = isset($order['pay_money']) ? $order['pay_money'] : 0;
         $openid = isset($order['openid']) ? $order['openid'] : '';
@@ -230,7 +231,7 @@ class PaymentService extends BaseService
      * @param string $scene
      * @return false|\Yansongda\Supports\Collection
      */
-    public function wechatPay($userInfo, $order, $scene = 'pay')
+    public function wechatPay($userInfo, $order, $scene = 'store')
     {
         $amount = isset($order['pay_money']) ? $order['pay_money'] : 0;
         if ($amount < 0) {
@@ -298,7 +299,7 @@ class PaymentService extends BaseService
      * @param $order
      * @return bool
      */
-    public function aliPay($userInfo, $order, $scene = 'deposit')
+    public function aliPay($userInfo, $order, $scene = 'shop')
     {
         $amount = isset($order['pay_money']) ? $order['pay_money'] : 0;
         if ($amount < 0) {
@@ -422,7 +423,6 @@ class PaymentService extends BaseService
             $status = isset($paymentInfo['status']) ? $paymentInfo['status'] : 0;
             $totalFee = isset($paymentInfo['total_fee']) ? $paymentInfo['total_fee'] : 0;
             $paymentPayType = isset($paymentInfo['pay_type']) ? $paymentInfo['pay_type'] : 0;
-            $orderType = isset($paymentInfo['order_type']) ? $paymentInfo['order_type'] : 0;
             $orderNo = isset($paymentInfo['order_no']) ? $paymentInfo['order_no'] : '';
             $payUserId = isset($paymentInfo['user_id']) ? $paymentInfo['user_id'] : 0;
             if (empty($paymentInfo) || empty($orderNo) || $payUserId <= 0) {
@@ -488,6 +488,33 @@ class PaymentService extends BaseService
                     return false;
                 }
             }
+            // 生活充值
+            else if ($scene == 'pay') {
+                $orderInfo = PayOrdersModel::with(['member'])->where(['order_no' => $orderNo, 'mark' => 1])
+                    ->select(['id as order_id', 'user_id', 'expired_at', 'order_no', 'total as pay_money', 'pay_at as pay_time', 'remark', 'status'])
+                    ->first();
+                $orderStatus = isset($orderInfo['status']) ? $orderInfo['status'] : 0;
+                // 验证订单
+                if (empty($orderInfo)) {
+                    DB::rollBack();
+                    $this->error = 2629;
+                    return false;
+                }
+
+                // 订单状态
+                if ($orderStatus != 1) {
+                    DB::rollBack();
+                    $this->error = 2630;
+                    return false;
+                }
+
+                $updateData = ['pay_at' => $payAt, 'transaction_id' => $transactionId, 'status' => 2, 'update_time' => time()];
+                if (!PayOrdersModel::where(['order_no' => $orderNo, 'mark' => 1])->update($updateData)) {
+                    $this->error = 2633;
+                    DB::rollBack();
+                    return false;
+                }
+            }
             // 退款
             else if ($scene == 'refund') {
                 $orderInfo = OrderModel::where(['order_no' => $orderNo, 'mark' => 1])

+ 1 - 1
config/payment.php

@@ -22,7 +22,7 @@ return [
                 'wechat_public_cert_path' => [
                     //前面是证书***,登录商户平台【API安全】->【API证书】->【查看证书】,可查看商户API证书***
                     //后面是通过前面的配置生成的文件 参考:http://www.liziyu.com/archives/309/
-                    'PUB_KEY_ID_0117250041532025081400112188001803' => base_path().'/resources/certs/wechat/pub_key.pem',
+                    'PUB_KEY_ID_0111032309772025121600111926001205' => base_path().'/resources/certs/wechat/pub_key.pem',
                 ],
                 // 必填
                 'notify_url' => '',

BIN
public/uploads/images/base64/20251226/image_e27537109140362782f1dbc5beeb8b80.jpeg


BIN
public/uploads/temp/20251226/MS5wbmc.png


BIN
public/uploads/temp/20251226/Mi5wbmc.png


BIN
public/uploads/temp/20251226/MjAyNTEyMjYwMjU3MS5wbmc.png


BIN
public/uploads/temp/20251226/MjAyNTEyMjYwMzA0MS5wbmc.png


BIN
public/uploads/temp/20251226/MjAyNTEyMjYwMzAwMS5wbmc.png


BIN
public/uploads/temp/20251226/MjAyNTEyMjYwMzAwMi5wbmc.png


BIN
public/uploads/temp/20251226/MjAyNTEyMjYwMzAwMy5wbmc.png


BIN
public/uploads/temp/20251226/MjAyNTEyMjYwMzAwNC5wbmc.png


BIN
public/uploads/temp/20251226/MjAyNTEyMjYwMzAxMS5wbmc.png


BIN
public/uploads/temp/20251226/MjAyNTEyMjYwMzAxMi5wbmc.png


BIN
public/uploads/temp/20251226/MjAyNTEyMjYwMzAxMy5wbmc.png


BIN
public/uploads/temp/20251226/MjAyNTEyMjYwMzAxNi5wbmc.png


BIN
public/uploads/temp/20251226/MjAyNTEyMjYwMzAyMi5wbmc.png


BIN
public/uploads/temp/20251226/MjAyNTEyMjYwMzAyNC5wbmc.png


BIN
public/uploads/temp/20251226/MjAyNTEyMjYwMzAyNS5wbmc.png


BIN
public/uploads/temp/20251226/MjAyNTEyMjYwMzAyNi5wbmc.png


BIN
public/uploads/temp/20251226/My5wbmc.png


BIN
public/uploads/temp/20251226/NC5wbmc.png


BIN
resources/certs/wechat/apiclient_cert.p12


+ 17 - 17
resources/certs/wechat/apiclient_cert.pem

@@ -1,25 +1,25 @@
 -----BEGIN CERTIFICATE-----
-MIIEJDCCAwygAwIBAgIUSOv+i4QZUBvc0mKBltA02WiuHFswDQYJKoZIhvcNAQEL
+MIIEJDCCAwygAwIBAgIUQ0WVnjc8u5rstN9KiGdfG/lUVB8wDQYJKoZIhvcNAQEL
 BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
 FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
-Q0EwHhcNMjUwODE1MTE0NzU1WhcNMzAwODE0MTE0NzU1WjB+MRMwEQYDVQQDDAox
-NzI1MDA0MTUzMRswGQYDVQQKDBLlvq7kv6HllYbmiLfns7vnu58xKjAoBgNVBAsM
-IeS6s+W3nuW4guS4sOiDnOWVhui0uOaciemZkOWFrOWPuDELMAkGA1UEBhMCQ04x
+Q0EwHhcNMjUxMjE2MDUyMTAzWhcNMzAxMjE1MDUyMTAzWjB+MRMwEQYDVQQDDAox
+MTAzMjMwOTc3MRswGQYDVQQKDBLlvq7kv6HllYbmiLfns7vnu58xKjAoBgNVBAsM
+IeW5v+ilv+aCpuiOseebiuenkeaKgOaciemZkOWFrOWPuDELMAkGA1UEBhMCQ04x
 ETAPBgNVBAcMCFNoZW5aaGVuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEA1V/u0pTbyBYI+qw7MexFU3ahHvKf3ih0UQ3ue4d0ru/ZZ42qigwC4Tbo+fpJ
-2GNqRiJew8OZY6HWLOBiwBy2aXkxLH2dDcWgDHekhVGZag57kFMiNgvb/LeS0OpC
-bsFj5HgvSU+s9IrgmdImXJlaJSJROb2mFiTmbTy/OzP08GXFpaog/cR59JGTVlLW
-S5C9WhSWiIzpMEqpE7VSM9dffBstvVoXW8jT1NrREnG3Zq6fLwpkVKjXwuQhyJXD
-PZHcghiqr2E1F4R8J/apYd6969KflhMyCn5l/p7kA6clyJml3Ju5i3ZdKAMdMRMt
-RoBrJxdavij9YR7m2Zn1EvItjwIDAQABo4G5MIG2MAkGA1UdEwQCMAAwCwYDVR0P
+AQEA0VfC/ciZ/VC9AzGIFKb69vLB/zt0FTD7pyrUqjTO1aqkyCyAuBoMyKKs2wJF
+FxfELxrlbrQZSuBqoGx0dOMthBiphJIGAjHl2nKdEL9zno/sTn1/6O8ba3YF8Tqs
+t4CxhoCyudig9yvAwZdSegw7hQHy0sgPH7+8nNHReWAJ3WydeYjFVhwG1qIztIPu
+WKmCzKNeNe2vCYKjiYsYLy1NdKLZMrIiH59jKNuQHzm2X7SF0Mur+1HnUr47kyD1
+hHfZXMvv/FG56oPTl1n0GO01j1JDh+/5ePncuH59ME79hOMLcgLc4zdcuoCafYY9
+9nrilYvdcFe7sMCQXbRGrHJnwwIDAQABo4G5MIG2MAkGA1UdEwQCMAAwCwYDVR0P
 BAQDAgP4MIGbBgNVHR8EgZMwgZAwgY2ggYqggYeGgYRodHRwOi8vZXZjYS5pdHJ1
 cy5jb20uY24vcHVibGljL2l0cnVzY3JsP0NBPTFCRDQyMjBFNTBEQkMwNEIwNkFE
 Mzk3NTQ5ODQ2QzAxQzNFOEVCRDImc2c9SEFDQzQ3MUI2NTQyMkUxMkIyN0E5RDMz
-QTg3QUQxQ0RGNTkyNkUxNDAzNzEwDQYJKoZIhvcNAQELBQADggEBABcrQNMXiJ36
-qmcdl88RvLlhHU8N/kIxo31MNZDEbCIpS/ncMyJLyoDEMp6LK30IopE5SOT+E9/K
-b3qX0lXJYrNYos0y7xnRssPsM0JtVOHVk/3WcJ5bxz4yeEqoUT02IeLewo3vVGkV
-/liXFr1MDmU2pOzXMVYDOpN/47NtBzWdGEUShuJQUOl5WFw4UiPlObvFUs1LiY1O
-am/l7k6fLAR8giMUlEqoiFgZi/JpzbWkgv6T2VnkzqYJqjYOdZgimoztTYVDkR6D
-IyfHkQ03S8F3PMOegRhrrtXB9njjjSg3RULf/wXtG6KAA7Up3nOQQ2HjdHK0LQlG
-RX2ji/DUFQs=
+QTg3QUQxQ0RGNTkyNkUxNDAzNzEwDQYJKoZIhvcNAQELBQADggEBAJY/I6kroFiQ
+gw/hphUExwhuwwYivZ1uzySysIprblq/cSAaqaVyUnymSNhq74jegJXMtT+9FmrI
+vihZplQcux06G1xKGSbpu/KqDXxkpp+Gntmet+oWxWeAq+/zrbQ6mfGBeknqsQNm
+0b/zSn5N1issjTZvif6uqs6Qc44Ltdn3Mt05AIZenyUbKaYiz2MNMNA5ZM670RoH
+RsHwuTNebMcbFku8eb6aRfd4TN/zrk1qiEY+veQu7Vvdghy4Juzh369PIaMJwv5r
+H5JSbR5GeRCF3YO43SBdoCE+xh1B6eppuDrgnNBfg7KtrQcd/Jbo/zNBOtxvrXvP
+bICiOw5urmc=
 -----END CERTIFICATE-----

+ 26 - 26
resources/certs/wechat/apiclient_key.pem

@@ -1,28 +1,28 @@
 -----BEGIN PRIVATE KEY-----
-MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDVX+7SlNvIFgj6
-rDsx7EVTdqEe8p/eKHRRDe57h3Su79lnjaqKDALhNuj5+knYY2pGIl7Dw5ljodYs
-4GLAHLZpeTEsfZ0NxaAMd6SFUZlqDnuQUyI2C9v8t5LQ6kJuwWPkeC9JT6z0iuCZ
-0iZcmVolIlE5vaYWJOZtPL87M/TwZcWlqiD9xHn0kZNWUtZLkL1aFJaIjOkwSqkT
-tVIz1198Gy29WhdbyNPU2tEScbdmrp8vCmRUqNfC5CHIlcM9kdyCGKqvYTUXhHwn
-9qlh3r3r0p+WEzIKfmX+nuQDpyXImaXcm7mLdl0oAx0xEy1GgGsnF1q+KP1hHubZ
-mfUS8i2PAgMBAAECggEAUReLgTaXrJxLP1Fzkc6Urlq4czWMcnb3ddKQnxvkyZNY
-EZXyiVJ1Sbh/pHlt1TI7Mnpff5D327im2BlTDmYbIUyw1pLKvHAuGm7h9NUFNBxa
-84fUyauKKKpvvrw5ETSoTS0r83W3apzZLTyD3c9eRhybuBEObP4LINrkZpChdzbU
-Jk6U7E81/iOIWKPm2n821I00isN7czJQA3wFiQPA2qBLxpQLBoJyQrZtMZePgmAU
-rW1hHgvonL6ahKO75mHLsQMzUFI9IeUChwa6ouRoOHI+Y/hvAp2paNFcqwPUvj5B
-A543VCfHymh2xQQV5MyK19jHY/y3ygklB2woWrpcoQKBgQD/SpESKjndw2WAZMI0
-5sO7IyCJTlD3F1Wmwsp1nB269W4aTceeNSKfuJmXrZMomU7Y3V+zh7WFW77ihMsQ
-l3RuxttpbtxBAaKtRQVPd1IU8trvgpDYKyyel/jAyqKOzWmhRnoUlAaM5xllR7OJ
-yLvqTS45sHT9191JQWewk2dHnwKBgQDV95OVF4+5v6oJ//EQ6JPOkaXqYnPgrd7e
-GQDjQ0v5qsWN9sYgHX8rT4FZ34BjOSKmRCkbeVjX8Ply6RLQjq8HhC4Mzp7cN9G/
-zDRmTi0KXD1/zrK9vtVUbHgDn6F1bAhHlNA9x49D9CcJWfZ+Q8NV1TJj0sbhsNFj
-Czp7b8IUEQKBgFSPknX93qUCMADTXzC+r16xR/mzI0Z1SD2wj/dc+swOt6Wm1dQl
-rY5SSy3epLvx7BgRW73P2eSOey/05H5ebIa0/8BwpCw0KnpSPmwQDfQ6bSKgkPHJ
-e0Ic/Jx/glDi4XY2LgHa9kB92/+cPHALOZNmdUVOmbHrarT1IS9v4+npAoGAJ/b7
-QODKvqYXC5EbpM3cNbwsok/LVw8Czrca3FgIi9Si27ZZIUyBIUTTY0cEwwO7/hRD
-HVeYCZV/8j+ofP35oUzGESxSrc1bRxjMPMOjVAkQj5u69Qf87qzn6b1aOgV4sm4Q
-S0nH76hd1jhQexsLFDAjHlQTQ7p0EazaOo4QURECgYATk4auSeajv+oI3dgSW80/
-4odNlxYSARLrBv43/0sexF2zxXDgv8gQlhj9LUKZ5iWR3JLuhUmZe7kXau/HiW/e
-2mqMLccJJ0KBgda1q1JprE5A7cp3y4MXmwuiPJC+4lqf1ZU0K4IwaDVS86syvzVU
-sjj0o4D/BdETHnD9mCt9WQ==
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDRV8L9yJn9UL0D
+MYgUpvr28sH/O3QVMPunKtSqNM7VqqTILIC4GgzIoqzbAkUXF8QvGuVutBlK4Gqg
+bHR04y2EGKmEkgYCMeXacp0Qv3Oej+xOfX/o7xtrdgXxOqy3gLGGgLK52KD3K8DB
+l1J6DDuFAfLSyA8fv7yc0dF5YAndbJ15iMVWHAbWojO0g+5YqYLMo1417a8JgqOJ
+ixgvLU10otkysiIfn2Mo25AfObZftIXQy6v7UedSvjuTIPWEd9lcy+/8Ubnqg9OX
+WfQY7TWPUkOH7/l4+dy4fn0wTv2E4wtyAtzjN1y6gJp9hj32euKVi91wV7uwwJBd
+tEascmfDAgMBAAECggEAU5Wd9mR9D4aIIVlKgyx0sdsVmEntvHRVVlakmN0C5I8A
+wif6sQc9qXJCYCOU4HaNz10G1F+2ZY4bJLiI+w6l4sNSE+uV2JSBuOngSoqWqG3A
+pUo4oxGtOgfisYGC6rXIq/KA6fFTu7zNdr5roO13alDv2jckysFslpSz9alh5vU4
+WjjSRfLvP/rMvGR1175TgOaxqm2Mtoh1u3tDG4elnTPLhVikdBazuXavMlvV5NG7
+14eJnHaF+sCoekwNfhRdULp9ynB8iTeCVCvMxSk38UPAE8V/HaIcdKiQGv6Amg/m
+gBlr3yvYet3OL11wM//N7qlCFqwI9kfEBtdERkmMAQKBgQD/j2ry/2+XkiQqhuzk
+n84p9ltqqkBnSuqcCm9j30UtAb/I6ma67TlISNFgKQ3q5XGZFBDJkc8h8+4N6z77
+GHk7TiUvTY2QUXJtVniDV5d/UOX9wVm/0kgBk/2R+7I3LKi0uyOG33HYuSyhZXXU
+QIYjhfdodTHtF55y3+eT5nUqAQKBgQDRs/vUXa+pQ416CVnFxmUxBsjo0mh7i92d
+izXR7aLAedbCR1WM5QVmE++wC1oEviHFvQUR5n3JdQPcgO4fEaClEipczjUF5slC
+/1xKRJ4Cc32a8bTAEBaTCrRuI9P8aVgBinJ3sWEVY1ghY8poYr+2Ls5vccJm/+Pc
+aCfyOPlpwwKBgDaNwQDaclHiyoGhh9ROIM5oXp9odJMYNPjWaWzibnvrEausDf39
+QesiUD+8w9HO5O8Oj37X92WCEuE5xJoJYWe9iMaOQZf7KvgYK2WuPxLYjCAdNDF0
+jBZ6JvkQx7xrdiAOisjxzfW7ocFaTUrf80KGCIht7Bh2oEZZca/q1DwBAoGBAJ8M
+LVIShGqSi7klYms4YANhK/w5qXkaycj1jqpb2/az8giD5gTopsGXGVGiKnIyapb5
+F+FNudWT5IvXVcNGsVrBflPJKjoBomAoIa1KgbVGNtvPutF44kY/9j0a+2sT0uXI
+Ra02YXXBVVRtxVSKoPDiazvnQhSwu/etH679O13VAoGBAJ3wngGP+IndoL7gW+wm
+R6wN/suvbQE1tf5tLhIVe4fn8SFWWzx1bFBYPY7lNhHDQXxk8UpP2fmvQZW9ADPQ
+fL5plRzMb4x/z5y2oTxmPXZyEE9OC7Jx7civV6FiyXbZOq9BrZldmZGsFocnNsBg
+K9FqLWqgqiHaXvTf/zx7+s6s
 -----END PRIVATE KEY-----

+ 9 - 0
resources/certs/wechat/pub_key.pem

@@ -0,0 +1,9 @@
+-----BEGIN PUBLIC KEY-----
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAopUi58QtwTrGJP1yCfL/
+65ICHlTkedsN1zghhh9eurBD4jX41BNL7YnFVXrV8+TDPlc7xqIzwZNWbOmNeIlj
+XGE81kKUxRkTh4laVpZvVmIYOmz9QiTcJbqXrEfMn4yLGJlz5fXbDesqzs/JGbdH
+mAHWZ2rdPD4QxvuF8LgvKgQtlIKdG2SO7XjQiAyZAYA4r5YZF2/fQix58UEasVvv
+00kcxSNYKOPsQbAvPUhxmu3LfH5xlaRRooinV93M42MFyrmYpD9LLYxUlM1xVr/P
+WxlVWmoJX8wl5MvckB7GRBkNcmUoqi8g+kvsaIkSf5qtX2S/e/mmGVk+OJAuTgms
+9QIDAQAB
+-----END PUBLIC KEY-----

+ 3 - 1
routes/api.php

@@ -77,6 +77,7 @@ Route::prefix('v1')->middleware('web.login')->group(function() {
     // 商品
     Route::post('/goods/index', [\App\Http\Controllers\Api\v1\GoodsController::class, 'index']);
     Route::post('/goods/info', [\App\Http\Controllers\Api\v1\GoodsController::class, 'info']);
+    Route::post('/goods/collect', [\App\Http\Controllers\Api\v1\GoodsController::class, 'collect']);
 
     // 店铺
     Route::post('/store/index', [\App\Http\Controllers\Api\v1\StoreController::class, 'index']);
@@ -89,7 +90,8 @@ Route::prefix('v1')->middleware('web.login')->group(function() {
     // 收货地址
     Route::post('/address/index', [\App\Http\Controllers\Api\v1\AddressController::class, 'index']);
     Route::post('/address/info', [\App\Http\Controllers\Api\v1\AddressController::class, 'info']);
-    Route::post('/address/default', [\App\Http\Controllers\Api\v1\AddressController::class, 'setDefault']);
+    Route::post('/address/bindInfo', [\App\Http\Controllers\Api\v1\AddressController::class, 'getBindInfo']);
+    Route::post('/address/setDefault', [\App\Http\Controllers\Api\v1\AddressController::class, 'setDefault']);
     Route::post('/address/save', [\App\Http\Controllers\Api\v1\AddressController::class, 'save']);
     Route::post('/address/delete', [\App\Http\Controllers\Api\v1\AddressController::class, 'delete']);