12 Коміти c30f4665bc ... 0fdc4366de

Автор SHA1 Опис Дата
  lh 0fdc4366de '订单接口新增公众号强关open_id' 3 роки тому
  lh 77d3c59e34 修改capi接口 3 роки тому
  lh b7eeda156c 中间件添加对渠道对应app_id是否正确的判断 3 роки тому
  lh 90d3258a12 中间件添加对渠道对应app_id是否正确的判断 3 роки тому
  lh 878b7e5f20 fix 3 роки тому
  lh f954255c6a 1.更新capi文档 3 роки тому
  lh 54182f2f66 1.更新capi文档 3 роки тому
  lh 63c0421d53 1.更新capi文档 3 роки тому
  lh a1885fd1c6 '新增添加书币或会员有效期接口' 3 роки тому
  lh f2b883e50c '新增添加书币或会员有效期接口' 3 роки тому
  lh 87f07dfbf8 ' 3 роки тому
  lh 8d558e85ff '用户信息接口增加用户昵称字段' 3 роки тому

+ 200 - 5
src/Controllers/CompanyAuth/AppController.php

@@ -192,7 +192,8 @@ class AppController extends Controller
      * @apiSuccess {String}      register_time 用户注册时间
      * @apiSuccess {String}      register_time 用户注册时间
      * @apiSuccess {String}      subscribe_time 关注时间
      * @apiSuccess {String}      subscribe_time 关注时间
      * @apiSuccess {String}      app_id 关注app_id
      * @apiSuccess {String}      app_id 关注app_id
-     * @apiSuccess {String}      opend_id 关注open_id
+     * @apiSuccess {String}      opend_id 关注公众号的openid,只有强关了才有(公众号号是渠道授权的,用户得点击系统返回的带openid的参数的链接,访问后才算强关,或者从强关二维码进来的也算)
+     * @apiSuccess {String}      register_open_id 分销后台订单的openid(是平台系统默认的静默登录的openid)
      * @apiSuccess {String}      wechat_name 关注公众号
      * @apiSuccess {String}      wechat_name 关注公众号
      * @apiSuccess {String}      order_type 订单类型[普通充值、包年、包月、包季]
      * @apiSuccess {String}      order_type 订单类型[普通充值、包年、包月、包季]
      * @apiSuccess {String}      push_msg_id 推送消息id,标记用[custom_开头是客服消息,template_开头是模板消息,下划线后是id]
      * @apiSuccess {String}      push_msg_id 推送消息id,标记用[custom_开头是客服消息,template_开头是模板消息,下划线后是id]
@@ -243,26 +244,56 @@ class AppController extends Controller
         } else {
         } else {
             $service = new OrderService;
             $service = new OrderService;
             $result = $service->companyAuthOrders(compact('channel_id', 'status', 'begin_date', 'end_date'));
             $result = $service->companyAuthOrders(compact('channel_id', 'status', 'begin_date', 'end_date'));
+            $app_id = $request->get('app_id', '');
+            foreach ($result->items() as $k => $v) {
+                $result->items()[$k]->app_id = $app_id;
+            }
             return response()->pagination(new OrderTransformer, $result);
             return response()->pagination(new OrderTransformer, $result);
         }
         }
     }
     }
 
 
+    /**
+     * 添加书币
+     * @apiVersion 1.0.0
+     * @apiName addBookCoin
+     * @apiGroup CompanyAuth
+     * @apiParam {String} channel_id 站点id
+     * @apiParam {String} uid 用户ID
+     * @apiParam {String} openid 用户openid
+     * @apiParam {String} amount 书币
+     * @apiParam {String} app_id 分配好的{app_id}
+     * @apiParam {String} nonce_str 随机字符串
+     * @apiParam {String} timestamp 时间戳
+     * @apiParam {String} sign 签名 规则同微信支付签名MD5(排序好的请求字符串&key=分配好的{app_secret})
+     * @apiSuccess {int}         code 状态码
+     * @apiSuccess {String}      msg  信息
+     * @apiSuccess {Object}      data 结果集
+     *     HTTP/1.1 200 OK
+     *   {
+     *       "code": 0,
+     *       "msg": "",
+     *       "data": {
+     *           "success": 1
+     *       }
+     *  }
+     */
     public function addBookCoin(ChannelQueryRequest $request)
     public function addBookCoin(ChannelQueryRequest $request)
     {
     {
         $channel_id = $request->get('channel_id');
         $channel_id = $request->get('channel_id');
         $uid = $request->get('uid');
         $uid = $request->get('uid');
         $openid = $request->get('openid');
         $openid = $request->get('openid');
         $amount = (int)$request->get('amount');
         $amount = (int)$request->get('amount');
+        $limit_amount = 2000;
 
 
         // 参数判断
         // 参数判断
-        if ((empty($openid) && empty($uid)) || empty($channel_id) || empty($amount) || $amount < 0 || $amount > 2000) {
+        if ((empty($openid) && empty($uid)) || empty($channel_id) || empty($amount) || $amount < 0 || $amount > $limit_amount) {
             return response()->json(['code'=>-1, 'msg'=>'传参有误!']);
             return response()->json(['code'=>-1, 'msg'=>'传参有误!']);
         }
         }
 
 
         // 获取当前用户信息
         // 获取当前用户信息
         $user_info = '';
         $user_info = '';
         if (!empty($uid)) {
         if (!empty($uid)) {
-            $user_info = $prev_coin = DB::connection('mysql')->table('users')->where(['id'=>$uid])
+            $user_info = $prev_coin = DB::connection('mysql')->table('users')->where(['id'=>$uid, 'distribution_channel_id'=>$channel_id])
                 ->select('id', 'distribution_channel_id', 'balance', 'reward_balance')->first();
                 ->select('id', 'distribution_channel_id', 'balance', 'reward_balance')->first();
         }else if(!empty($openid)) {
         }else if(!empty($openid)) {
             $user_info = $prev_coin = DB::connection('mysql')->table('users')
             $user_info = $prev_coin = DB::connection('mysql')->table('users')
@@ -275,7 +306,6 @@ class AppController extends Controller
         // 当日该站点该用户获得的总书币
         // 当日该站点该用户获得的总书币
         $sum = DB::connection('mysql')->table('user_coin_logs')->where(['distribution_channel_id'=>$channel_id, 'uid'=>$user_info['id'], 'day'=>date('Y-m-d')])->sum('amount');
         $sum = DB::connection('mysql')->table('user_coin_logs')->where(['distribution_channel_id'=>$channel_id, 'uid'=>$user_info['id'], 'day'=>date('Y-m-d')])->sum('amount');
 
 
-        $limit_amount = 2000;
         if ($sum + $amount > $limit_amount) {
         if ($sum + $amount > $limit_amount) {
             return response()->json(['code' => -1, 'msg' => '每个用户每个站点每日加书币的总额不得超过'.$limit_amount.'!']);
             return response()->json(['code' => -1, 'msg' => '每个用户每个站点每日加书币的总额不得超过'.$limit_amount.'!']);
         }
         }
@@ -313,7 +343,172 @@ class AppController extends Controller
             DB::connection('mysql')->rollback();
             DB::connection('mysql')->rollback();
             return response()->json(['code'=>-1, 'msg'=>$e->getMessage()]);
             return response()->json(['code'=>-1, 'msg'=>$e->getMessage()]);
         }
         }
-        return response()->json(['code'=>1, 'msg'=>'', 'data'=>['success' => $result]]);
+        return response()->json(['code'=>1, 'msg'=>'', 'data'=>['success' => 1]]);
+    }
+
+    /**
+     * 添加书币或会员有效期
+     * @apiVersion 1.0.0
+     * @apiName addBookCoinV2
+     * @apiGroup CompanyAuth
+     * @apiParam {String} channel_id 站点id
+     * @apiParam {String} uid 用户ID
+     * @apiParam {String} openid 用户openid
+     * @apiParam {String} type 类型(coin: 加书币 day: 加会员有效期,单位: 天)
+     * @apiParam {String} [amount]  书币(type类型为coin时必填)
+     * @apiParam {String} [day]  书币(type类型为day时必填)
+     * @apiParam {String} app_id 分配好的{app_id}
+     * @apiParam {String} nonce_str 随机字符串
+     * @apiParam {String} timestamp 时间戳
+     * @apiParam {String} sign 签名 规则同微信支付签名MD5(排序好的请求字符串&key=分配好的{app_secret})
+     * @apiSuccess {int}         code 状态码
+     * @apiSuccess {String}      msg  信息
+     * @apiSuccess {Object}      data 结果集
+     *     HTTP/1.1 200 OK
+     *   {
+     *       "code": 0,
+     *       "msg": "",
+     *       "data": {
+     *           "success": 1
+     *       }
+     *  }
+     */
+    public function addBookCoinV2(ChannelQueryRequest $request)
+    {
+        $channel_id = $request->get('channel_id');
+        $uid = $request->get('uid');
+        $openid = $request->get('openid');
+        $amount = (int)$request->get('amount');
+        $type = $request->get('type');
+        $day = $request->get('day');
+        $limit_amount = 20000;
+        $limit_users = 20;
+
+        // 参数判断
+        if ((empty($openid) && empty($uid)) || empty($channel_id)  || empty($type) || !in_array($type, ['coin', 'day'])) {
+            return response()->json(['code'=>-1, 'msg'=>'传参有误!']);
+        }
+
+        if ($type == 'coin' && (empty($amount) || $amount < 0 || $amount > $limit_amount)) return response()->json(['code'=>-1, 'msg'=>'传参有误!']);
+        if ($type == 'day' && (empty($day) || $day < 0 || $day > 366)) return response()->json(['code'=>-1, 'msg'=>'传参有误!']);
+
+        // 获取当前用户信息
+        $user_info = '';
+        if (!empty($uid)) {
+            $user_info = $prev_coin = DB::connection('mysql')->table('users')->where(['id'=>$uid, 'distribution_channel_id'=>$channel_id])
+                ->select('id', 'distribution_channel_id', 'balance', 'reward_balance')->first();
+        }else if(!empty($openid)) {
+            $user_info = $prev_coin = DB::connection('mysql')->table('users')
+                ->where(['distribution_channel_id'=>$channel_id, 'openid'=>$openid])
+                ->select('id', 'distribution_channel_id', 'balance', 'reward_balance')->first();
+        }
+        $user_info = (array)$user_info;
+        if (!$user_info) return response()->json(['code'=>-1, 'msg'=>'用户不存在!']);
+
+        if ($type == 'day') {   // 加包时日期
+            $year_order = DB::connection('mysql')->table('year_orders')->where(['distribution_channel_id'=>$channel_id, 'uid'=>$user_info['id']])->select('id', 'end_time')->first();
+
+            try {
+                DB::connection('mysql')->beginTransaction();
+
+                if ($year_order) {
+                    $year_order = (array)$year_order;
+                    $before_end_time = $year_order['end_time'];
+                    $after_end_time = date('Y-m-d H:i:s', (strtotime($before_end_time) + $day * 86400));
+                    $result = DB::connection('mysql')->table('year_orders')->where(['id'=>$year_order['id']])->update([
+                        'end_time'      => $after_end_time,
+                        'updated_at'    => date('Y-m-d H:i:s')
+                    ]);
+                }else {
+                    $before_end_time = date('Y-m-d H:i:s');
+                    $after_end_time = date('Y-m-d H:i:s', (time() + $day * 86400));
+                    $result = DB::connection('mysql')->table('year_orders')->insert([
+                        'uid'                       => $user_info['id'],
+                        'begin_time'                => $before_end_time,
+                        'end_time'                  => $after_end_time,
+                        'distribution_channel_id'   => $channel_id,
+                        'send_order_id'             => 0,
+                        'created_at'                => date('Y-m-d H:i:s'),
+                        'updated_at'                => date('Y-m-d H:i:s'),
+                    ]);
+                }
+
+                if (!$result) {
+                    DB::connection('mysql')->rollback();
+                    return response()->json(['code'=>-1, 'msg'=>'数据库异常!']);
+                }
+
+                $boolen = DB::connection('mysql')->table('user_coin_logs')->insert([
+                    'distribution_channel_id'   => $user_info['distribution_channel_id'],
+                    'uid'                       => $user_info['id'],
+                    'day'                       => date('Y-m-d'),
+                    'before_end_time'           => $before_end_time,
+                    'day_num'                   => $day,
+                    'after_end_time'            => $after_end_time,
+                    'type'                      => 2,
+                    'created_at'                => date('Y-m-d H:i:s'),
+                    'updated_at'                => date('Y-m-d H:i:s'),
+                ]);
+
+                if (!$boolen) {
+                    DB::connection('mysql')->rollback();
+                    return response()->json(['code'=>-1, 'msg'=>'数据库异常!']);
+                }
+
+                DB::connection('mysql')->commit();
+            }catch(\Exception $e) {
+                DB::connection('mysql')->rollback();
+                return response()->json(['code'=>-1, 'msg'=>$e->getMessage()]);
+            }
+            return response()->json(['code'=>1, 'msg'=>'', 'data'=>['success' => 1]]);
+        }else {     // 加书币
+            // 当日该站点该用户获得的总书币
+            $sum = DB::connection('mysql')->table('user_coin_logs')->where(['distribution_channel_id'=>$channel_id, 'uid'=>$user_info['id'], 'day'=>date('Y-m-d')])->sum('amount');
+
+            if ($sum + $amount > $limit_amount) {
+                return response()->json(['code' => -1, 'msg' => '每个用户每个站点每日加书币的总额不得超过'.$limit_amount.'!']);
+            }
+
+            // 当日该站点加过书币的总用户数
+            $today_users = DB::connection('mysql')->table('user_coin_logs')->where(['distribution_channel_id'=>$channel_id, 'day'=>date('Y-m-d')])->groupBy(['uid'])->get()->pluck('uid')->toArray();
+            if (count($today_users) > $limit_users) return response()->json(['code' => -1, 'msg' => '每个站点每日加书币的用户数不得超过'.$limit_users.'!']);
+            if (count($today_users) == $limit_users && !in_array($uid, $today_users)) return response()->json(['code' => -1, 'msg' => '每个站点每日加书币的用户数不得超过'.$limit_users.'!']);
+
+            try {
+                DB::connection('mysql')->beginTransaction();
+                $result = DB::connection('mysql')->table('users')->where(['id'=>$user_info['id']])->update([
+                    'balance' => $user_info['balance'] + $amount,
+                    'reward_balance' => $user_info['reward_balance'] + $amount,
+                ]);
+
+                if (!$result) {
+                    DB::connection('mysql')->rollback();
+                    return response()->json(['code'=>-1, 'msg'=>'数据库异常!']);
+                }
+
+                $boolen = DB::connection('mysql')->table('user_coin_logs')->insert([
+                    'distribution_channel_id'   => $user_info['distribution_channel_id'],
+                    'uid'                       => $user_info['id'],
+                    'day'                       => date('Y-m-d'),
+                    'before'                    => $user_info['balance'],
+                    'amount'                    => $amount,
+                    'after'                     => $user_info['balance'] + $amount,
+                    'created_at'                => date('Y-m-d H:i:s'),
+                    'updated_at'                => date('Y-m-d H:i:s'),
+                ]);
+
+                if (!$boolen) {
+                    DB::connection('mysql')->rollback();
+                    return response()->json(['code'=>-1, 'msg'=>'数据库异常!']);
+                }
+
+                DB::connection('mysql')->commit();
+            }catch(\Exception $e) {
+                DB::connection('mysql')->rollback();
+                return response()->json(['code'=>-1, 'msg'=>$e->getMessage()]);
+            }
+            return response()->json(['code'=>1, 'msg'=>'', 'data'=>['success' => 1]]);
+        }
     }
     }
 
 
     /**
     /**

+ 4 - 0
src/Controllers/CompanyAuth/Transformers/OrderTransformer.php

@@ -11,11 +11,13 @@ namespace General\Controllers\CompanyAuth\Transformers;
 use General\Helpers\CommonHelper;
 use General\Helpers\CommonHelper;
 use General\Models\OfficialAccount\WechatKeywordMsgs;
 use General\Models\OfficialAccount\WechatKeywordMsgs;
 use General\Models\Order\Order;
 use General\Models\Order\Order;
+use Illuminate\Support\Facades\DB;
 
 
 class OrderTransformer
 class OrderTransformer
 {
 {
     public function transform($item)
     public function transform($item)
     {
     {
+        $subscribe_open_id = DB::connection('mysql')->table('user_openids')->where('uid', '=', $item->uid)->where('appid', '=', $item->app_id)->value('openid');
         return [
         return [
             'uid' => $item->uid,
             'uid' => $item->uid,
             'price' => (float) $item->price,
             'price' => (float) $item->price,
@@ -38,6 +40,8 @@ class OrderTransformer
             'promotion_url' => $item->send_order ? CommonHelper::getPromotionUrl($item->send_order) : '',
             'promotion_url' => $item->send_order ? CommonHelper::getPromotionUrl($item->send_order) : '',
             'app_id' => $item->user && $item->user->force_subscribe_user ? $item->user->force_subscribe_user->appid : '',
             'app_id' => $item->user && $item->user->force_subscribe_user ? $item->user->force_subscribe_user->appid : '',
             'opend_id' => $item->user && $item->user->force_subscribe_user ? $item->user->force_subscribe_user->openid : '',
             'opend_id' => $item->user && $item->user->force_subscribe_user ? $item->user->force_subscribe_user->openid : '',
+            'register_open_id' => $item->user ? $item->user->openid : '',
+            'subscribe_open_id' => !empty($subscribe_open_id) ? $subscribe_open_id : '',
             'subscribe_time' => $item->user && $item->user->force_subscribe_user ? $item->user->force_subscribe_user->subscribe_time : '',
             'subscribe_time' => $item->user && $item->user->force_subscribe_user ? $item->user->force_subscribe_user->subscribe_time : '',
             'wechat_name' => $item->user && $item->user->force_subscribe_user && $item->user->force_subscribe_user->official_account ? $item->user->force_subscribe_user->official_account->nickname : '',
             'wechat_name' => $item->user && $item->user->force_subscribe_user && $item->user->force_subscribe_user->official_account ? $item->user->force_subscribe_user->official_account->nickname : '',
         ];
         ];

+ 5 - 0
src/Controllers/CompanyAuth/Transformers/UserTransformer.php

@@ -12,6 +12,7 @@ class UserTransformer
 {
 {
     public function transform($item)
     public function transform($item)
     {
     {
+        $sex = ['0'=>'无性别', '1'=>'男', '2'=>'女'];
         return [
         return [
             'id' => $item->id,
             'id' => $item->id,
             'channel_id' => $item->distribution_channel_id,
             'channel_id' => $item->distribution_channel_id,
@@ -21,7 +22,11 @@ class UserTransformer
             'ua' => $item->user_env ? $item->user_env->ua : '',
             'ua' => $item->user_env ? $item->user_env->ua : '',
             'app_id' => $item->force_subscribe_user ? $item->force_subscribe_user->appid : '',
             'app_id' => $item->force_subscribe_user ? $item->force_subscribe_user->appid : '',
             'opend_id' => $item->force_subscribe_user ? $item->force_subscribe_user->openid : '',
             'opend_id' => $item->force_subscribe_user ? $item->force_subscribe_user->openid : '',
+            'is_subscribed' => $item->force_subscribe_user ? '1' : '0',
             'subscribe_time' => $item->force_subscribe_user ? (string)$item->force_subscribe_user->subscribe_time : '',
             'subscribe_time' => $item->force_subscribe_user ? (string)$item->force_subscribe_user->subscribe_time : '',
+            'nickname' => $item->nickname ? (string)$item->nickname : '',
+            'balance' => $item->balance ? (string)$item->balance : '',
+            'sex' => isset($sex[$item->sex]) ? $sex[$item->sex] : ''
         ];
         ];
     }
     }
 }
 }

+ 8 - 3
src/Controllers/CompanyAuth/UserController.php

@@ -43,6 +43,10 @@ class UserController extends Controller
      * @apiSuccess {String}      register_ip 注册IP
      * @apiSuccess {String}      register_ip 注册IP
      * @apiSuccess {String}      register_time 注册时间
      * @apiSuccess {String}      register_time 注册时间
      * @apiSuccess {String}      subscribe_time 关注时间
      * @apiSuccess {String}      subscribe_time 关注时间
+     * @apiSuccess {String}      is_subscribed 是否关注(1.已关注 0.未关注)
+     * @apiSuccess {String}      nickname 用户昵称
+     * @apiSuccess {String}      balance 总书币
+     * @apiSuccess {String}      sex 性别
      * @apiSuccessExample {json} Success-Response:
      * @apiSuccessExample {json} Success-Response:
      *     HTTP/1.1 200 OK
      *     HTTP/1.1 200 OK
      *{
      *{
@@ -56,7 +60,8 @@ class UserController extends Controller
      *                "app_id": null,
      *                "app_id": null,
      *                "opend_id": "oq6ID0ovAjyxnWZRbm3YPz8Pz8nE",
      *                "opend_id": "oq6ID0ovAjyxnWZRbm3YPz8Pz8nE",
      *                "register_time": "2018-03-20 00:00:08",
      *                "register_time": "2018-03-20 00:00:08",
-     *                "subscribe_time": ""
+     *                "subscribe_time": "",
+     *                "nickname": "用户昵称"
      *            }
      *            }
      *        ],
      *        ],
      *        "meta": {
      *        "meta": {
@@ -88,12 +93,12 @@ class UserController extends Controller
     }
     }
 
 
     /**
     /**
-     * @api {post} company/auth/subscribeRecords 用户关注记录
+     * @api {post} company/auth/users/subscribes 用户关注记录
      * @apiVersion 1.0.0
      * @apiVersion 1.0.0
      * @apiName subscribeRecords
      * @apiName subscribeRecords
      * @apiGroup User
      * @apiGroup User
      * @apiParam {String} channel_id 站点id
      * @apiParam {String} channel_id 站点id
-     * @apiParam {String} uid (可以不传) 用户uid,','分隔;最多不超过100个
+     * @apiParam {String} uid 用户uid,','分隔;最多不超过100个
      * @apiParam {Int} page 分页页码
      * @apiParam {Int} page 分页页码
      * @apiParam {String} app_id 分配好的{app_id}
      * @apiParam {String} app_id 分配好的{app_id}
      * @apiParam {String} nonce_str 随机字符串
      * @apiParam {String} nonce_str 随机字符串

+ 8 - 0
src/Middleware/CompanyAuth.php

@@ -27,6 +27,14 @@ class CompanyAuth
             $diff = time() - $timestamp;
             $diff = time() - $timestamp;
             if ($diff < SysConsts::ONE_MINUTE_SECONDS * 60) {
             if ($diff < SysConsts::ONE_MINUTE_SECONDS * 60) {
                 $config = $service->findCompanyAuthConfig($params['app_id']);
                 $config = $service->findCompanyAuthConfig($params['app_id']);
+
+                // 检查channel_id所属appid
+                $channel_ids = $service->findCompanyChannelIds($config->company_id);    // 获取该公司下的所有渠道ID
+                $request_channel_id = $request->get('channel_id', '');
+                if ($request_channel_id && !in_array($request_channel_id, $channel_ids)) {
+                    return response()->error('CHANNEL_AUTH_INVALID');
+                }
+
                 if (isset($params['sign']) && strcasecmp(CommonHelper::sign($params, $config->app_secret), $params['sign']) == 0) {
                 if (isset($params['sign']) && strcasecmp(CommonHelper::sign($params, $config->app_secret), $params['sign']) == 0) {
                     $this->setGlobalConfig($config);
                     $this->setGlobalConfig($config);
                     return $next($request);
                     return $next($request);

+ 6 - 0
src/Services/Config/ConfigService.php

@@ -11,6 +11,7 @@ namespace General\Services\Config;
 
 
 use App\Consts\SysConsts;
 use App\Consts\SysConsts;
 use General\Models\Config\CompanyAuthConfig;
 use General\Models\Config\CompanyAuthConfig;
+use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Redis;
 use Illuminate\Support\Facades\Redis;
 
 
 class ConfigService
 class ConfigService
@@ -43,4 +44,9 @@ class ConfigService
         }
         }
         return explode(';', $ips);
         return explode(';', $ips);
     }
     }
+
+    public function findCompanyChannelIds($company_id) {
+        $channel_user_ids = DB::connection('mysql')->table('channel_users')->where('company_id', $company_id)->pluck('id')->all();
+        return DB::connection('mysql')->table('distribution_channels')->whereIn('channel_user_id', $channel_user_ids)->pluck('id')->all();
+    }
 }
 }