| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- <?php
- namespace App\Http\Middleware\Api;
- use Illuminate\Http\Request;
- use Closure;
- class SwitchCompanyDb
- {
- // 无需验证的路径
- protected $except = [
- 'api/wechat_pay/notify', // 微信支付回调无需通过验证
- 'api/wechat_transfer/notify', // 微信支付回调无需通过验证
- 'api/question_bank/question_reception/wechat_transfer/notify', // 题库微信支付回调无需通过验证
- 'api/login/wxop_login_uri', // 微信公众号登录
- 'api/login/wxop_auth', // 微信公众号登录
- 'api/question_bank/question_reception/orders/jsapi_notify', //题库小程序微信支付回调
- 'api/live_push_notify/notify', //直播推流回调
- 'api/short_link/get_origin_url', //解析短链
- 'api/short_link/create' //创建短链
- ];
- public function handle(Request $request, Closure $next)
- {
- // 当前路径
- $path = ltrim($request->getPathInfo(), '/');
- // 判断是否需要切换数据库
- if ( in_array($path, $this->except) ) return $next($request);
- // 提现通知需要单独判断
- if( stripos('&'.$path,'api/wechat_transfer/notify') == 1 ) return $next($request);
- // 题库提现通知需要单独判断
- if( stripos('&'.$path,'api/question_bank/question_reception/wechat_transfer/notify') == 1 ) return $next($request);
- // 退款回调需要单独判断
- if( stripos('&'.$path,'api/wechat_pay/refund_notify') == 1 ) return $next($request);
- // 退款回调需要单独判断
- if( stripos('&'.$path,'api/login/wxop_auth') == 1 ) return $next($request);
- // 判断有没有companyid
- $companyId = $request->input('company_id', 0);
- // 没有获取appid对应的
- if( !$companyId ) {
- //从请求中获取appid
- $appId = $request->input('app_id', '');
- //通过corpId获取company_id
- $companyId = $appId ? (new Component)->getOne($appId,'company_id') : $companyId;
- // 没有获取appid对应的
- if( !$companyId ) {
- // 店铺ID
- $shopId = $request->input('shop_id', 0);
- // 店铺查询商户ID
- $companyId = $shopId ? (new Shop)->getOne($appId,'company_id') : $companyId;
- // 如果还是没有company_id
- if( !$companyId ) {
- // 获取请求的域名来源
- $domain = $request->server('HTTP_REFERER');
- // 如果有来源
- if( $domain ) {
- // 获取数据
- $domain = parse_url($domain, PHP_URL_HOST);
- // 从域名中获取company_id
- $companyId = $domain ? (new CompanyDomainConfig)->getOne($domain,'company_id') : $companyId;
- }
- }
- }
- }
- // 测试服默认访问商户1 大方无隅测试,正式服默认访问商户3 大方无隅测试
- $companyId = $companyId ? (int) $companyId : (config('app.env','') == 'local' ? 1 : 3);
- // 切换数据库
- $result = (new CompanyDbConfig)->reconnectDb($companyId);
- // 如果有错误
- if ( isset($result['error']) ) return json_send(['code'=>'no_company','msg'=>$result['error']]);
- // 商户ID
- $request['company_id'] = $companyId;
- // 下一个中间件
- return $next($request);
- }
- }
|