SwitchCompanyDb.php 4.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. <?php
  2. namespace App\Http\Middleware\Api;
  3. use Illuminate\Http\Request;
  4. use Closure;
  5. class SwitchCompanyDb
  6. {
  7. // 无需验证的路径
  8. protected $except = [
  9. 'api/wechat_pay/notify', // 微信支付回调无需通过验证
  10. 'api/wechat_transfer/notify', // 微信支付回调无需通过验证
  11. 'api/question_bank/question_reception/wechat_transfer/notify', // 题库微信支付回调无需通过验证
  12. 'api/login/wxop_login_uri', // 微信公众号登录
  13. 'api/login/wxop_auth', // 微信公众号登录
  14. 'api/question_bank/question_reception/orders/jsapi_notify', //题库小程序微信支付回调
  15. 'api/live_push_notify/notify', //直播推流回调
  16. 'api/short_link/get_origin_url', //解析短链
  17. 'api/short_link/create' //创建短链
  18. ];
  19. public function handle(Request $request, Closure $next)
  20. {
  21. // 当前路径
  22. $path = ltrim($request->getPathInfo(), '/');
  23. // 判断是否需要切换数据库
  24. if ( in_array($path, $this->except) ) return $next($request);
  25. // 提现通知需要单独判断
  26. if( stripos('&'.$path,'api/wechat_transfer/notify') == 1 ) return $next($request);
  27. // 题库提现通知需要单独判断
  28. if( stripos('&'.$path,'api/question_bank/question_reception/wechat_transfer/notify') == 1 ) return $next($request);
  29. // 退款回调需要单独判断
  30. if( stripos('&'.$path,'api/wechat_pay/refund_notify') == 1 ) return $next($request);
  31. // 退款回调需要单独判断
  32. if( stripos('&'.$path,'api/login/wxop_auth') == 1 ) return $next($request);
  33. // 判断有没有companyid
  34. $companyId = $request->input('company_id', 0);
  35. // 没有获取appid对应的
  36. if( !$companyId ) {
  37. //从请求中获取appid
  38. $appId = $request->input('app_id', '');
  39. //通过corpId获取company_id
  40. $companyId = $appId ? (new Component)->getOne($appId,'company_id') : $companyId;
  41. // 没有获取appid对应的
  42. if( !$companyId ) {
  43. // 店铺ID
  44. $shopId = $request->input('shop_id', 0);
  45. // 店铺查询商户ID
  46. $companyId = $shopId ? (new Shop)->getOne($appId,'company_id') : $companyId;
  47. // 如果还是没有company_id
  48. if( !$companyId ) {
  49. // 获取请求的域名来源
  50. $domain = $request->server('HTTP_REFERER');
  51. // 如果有来源
  52. if( $domain ) {
  53. // 获取数据
  54. $domain = parse_url($domain, PHP_URL_HOST);
  55. // 从域名中获取company_id
  56. $companyId = $domain ? (new CompanyDomainConfig)->getOne($domain,'company_id') : $companyId;
  57. }
  58. }
  59. }
  60. }
  61. // 测试服默认访问商户1 大方无隅测试,正式服默认访问商户3 大方无隅测试
  62. $companyId = $companyId ? (int) $companyId : (config('app.env','') == 'local' ? 1 : 3);
  63. // 切换数据库
  64. $result = (new CompanyDbConfig)->reconnectDb($companyId);
  65. // 如果有错误
  66. if ( isset($result['error']) ) return json_send(['code'=>'no_company','msg'=>$result['error']]);
  67. // 商户ID
  68. $request['company_id'] = $companyId;
  69. // 下一个中间件
  70. return $next($request);
  71. }
  72. }