Browse Source

🔧Fixed Failed Subscribe

BrettonYe 2 years ago
parent
commit
ffe9cafaea

+ 3 - 1
app/Http/Controllers/User/SubscribeController.php

@@ -31,6 +31,7 @@ class SubscribeController extends Controller
 
         // 检查订阅码是否有效
         $subscribe = UserSubscribe::whereCode($code)->first();
+        $this->proxyServer = new ProxyService();
         if (! $subscribe) {
             return $this->failed(trans('errors.subscribe.unknown'));
         }
@@ -41,6 +42,7 @@ class SubscribeController extends Controller
 
         // 检查用户是否有效
         $user = $subscribe->user;
+        $this->proxyServer->setUser($user);
         if (! $user) {
             return $this->failed(trans('errors.subscribe.user'));
         }
@@ -65,7 +67,7 @@ class SubscribeController extends Controller
 
             return $this->failed(trans('errors.subscribe.question'));
         }
-        $this->proxyServer = new ProxyService($user);
+
         $subscribe->increment('times'); // 更新访问次数
         $this->subscribeLog($subscribe->id, IP::getClientIp(), json_encode(['Host' => $request->getHost(), 'User-Agent' => $request->userAgent()])); // 记录每次请求
 

+ 7 - 2
app/Services/ProxyService.php

@@ -17,9 +17,14 @@ class ProxyService
 
     private static array $servers;
 
-    public function __construct(?User $user = null)
+    public function __construct(User|null $user = null)
     {
-        self::$user = $user ?? auth()->user();
+        $this->setUser($user ?? auth()->user());
+    }
+
+    public function setUser(User|null $user): void
+    {
+        self::$user = $user;
     }
 
     public function getUser(): User

+ 9 - 2
app/Utils/Clients/URLSchemes.php

@@ -9,7 +9,7 @@ class URLSchemes implements Client
     public static function buildShadowsocks(array $server): string
     {
         $name = rawurlencode($server['name']);
-        $str = base64url_encode("{$server['method']}:{$server['method']}");
+        $str = base64url_encode("{$server['method']}:{$server['passwd']}");
 
         return "ss://$str@{$server['host']}:{$server['port']}#$name".PHP_EOL;
     }
@@ -18,7 +18,14 @@ class URLSchemes implements Client
     {
         $setting = "{$server['host']}:{$server['port']}:{$server['protocol']}:{$server['method']}:{$server['obfs']}:";
 
-        return 'ssr://'.base64url_encode($setting.base64url_encode($server['passwd']).'/?obfsparam='.base64url_encode($server['obfs_param']).'&protoparam='.base64url_encode($server['protocol_param']).'&remarks='.base64url_encode($server['name']).'&group='.base64url_encode($server['group']).'&udpport='.$server['udp'].'&uot=0').PHP_EOL;
+        return 'ssr://'.base64url_encode($setting.base64url_encode($server['passwd']).'/?'.http_build_query([
+            'obfsparam' => $server['obfs_param'] ? base64url_encode($server['obfs_param']) : '',
+            'protoparam' => $server['protocol_param'] ? base64url_encode($server['protocol_param']) : '',
+            'remarks' => $server['name'] ? base64url_encode($server['name']) : '',
+            'group' => $server['group'] ? base64url_encode($server['group']) : '',
+            'udpport' => $server['udp'],
+            'uot' => 0,
+        ])).PHP_EOL;
     }
 
     public static function buildVmess(array $server): string

+ 24 - 24
app/Utils/IP.php

@@ -21,7 +21,7 @@ class IP
 {
     private static bool $is_ipv4;
 
-    public static function getClientIP(): string|null
+    public static function getClientIP(): ?string
     { // 获取访客真实IP
         return request()?->ip();
     }
@@ -109,7 +109,7 @@ class IP
         return $ret;
     }
 
-    private static function ipApi(string $ip): array|null
+    private static function ipApi(string $ip): ?array
     { // 开发依据: https://ip-api.com/docs/api:json
         $key = config('services.ip.ip-api_key');
         if ($key) {
@@ -148,7 +148,7 @@ class IP
         return Http::timeout(10)->withOptions(['http_errors' => false])->withUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36');
     }
 
-    private static function Baidu(string $ip): array|null
+    private static function Baidu(string $ip): ?array
     {// 通过api.map.baidu.com查询IP地址的详细信息
         $key = config('services.ip.baidu_ak');
         if ($key) {
@@ -180,7 +180,7 @@ class IP
         return null;
     }
 
-    private static function baiduBce(string $ip): array|null
+    private static function baiduBce(string $ip): ?array
     {
         if (self::$is_ipv4) {
             $url = "https://qifu-api.baidubce.com/ip/geo/v1/district?ip=$ip";
@@ -210,7 +210,7 @@ class IP
         return null;
     }
 
-    private static function ipGeoLocation(string $ip): array|null
+    private static function ipGeoLocation(string $ip): ?array
     { // 开发依据: https://ipgeolocation.io/documentation.html
         $response = self::setBasicHttp()->withHeaders(['Origin' => 'https://ipgeolocation.io'])
             ->get("https://api.ipgeolocation.io/ipgeo?ip=$ip&fields=country_name,state_prov,district,city,isp,latitude,longitude&lang=".config('common.language.'.app()->getLocale().'.1'));
@@ -231,7 +231,7 @@ class IP
         return null;
     }
 
-    private static function TaoBao(string $ip): array|null
+    private static function TaoBao(string $ip): ?array
     { // 通过ip.taobao.com查询IP地址的详细信息 依据 https://ip.taobao.com/instructions 开发
         $response = self::setBasicHttp()->retry(2)->post("https://ip.taobao.com/outGetIpInfo?ip=$ip&accessKey=alibaba-inc");
 
@@ -256,7 +256,7 @@ class IP
         return null;
     }
 
-    private static function speedtest(string $ip): array|null
+    private static function speedtest(string $ip): ?array
     {
         $response = self::setBasicHttp()->get("https://forge.speedtest.cn/api/location/info?ip=$ip");
         $data = $response->json();
@@ -281,7 +281,7 @@ class IP
         return null;
     }
 
-    private static function TenAPI(string $ip): array|null
+    private static function TenAPI(string $ip): ?array
     { // 开发依据: https://docs.tenapi.cn/utility/getip.html
         $response = self::setBasicHttp()->asForm()->post('https://tenapi.cn/v2/getip', ['ip' => $ip]);
         if ($response->ok()) {
@@ -301,7 +301,7 @@ class IP
         return null;
     }
 
-    private static function fkcoder(string $ip): array|null
+    private static function fkcoder(string $ip): ?array
     { // 开发依据: https://www.fkcoder.com/
         $response = self::setBasicHttp()->acceptJson()->get("https://www.fkcoder.com/ip?ip=$ip");
         if ($response->ok()) {
@@ -319,7 +319,7 @@ class IP
         return null;
     }
 
-    private static function juHe(string $ip): array|null
+    private static function juHe(string $ip): ?array
     { // 开发依据: https://www.juhe.cn/docs/api/id/1
         $response = self::setBasicHttp()->asForm()->post('https://apis.juhe.cn/ip/Example/query.php', ['IP' => $ip]);
         if ($response->ok()) {
@@ -338,7 +338,7 @@ class IP
         return null;
     }
 
-    private static function ip2Region(string $ip): array|null
+    private static function ip2Region(string $ip): ?array
     { // 通过ip2Region查询IP地址的详细信息 数据库不经常更新
         try {
             $data = (new XdbSearcher())->search($ip);
@@ -376,7 +376,7 @@ class IP
         ];
     }
 
-    private static function ipjiance(string $ip): array|null
+    private static function ipjiance(string $ip): ?array
     {
         $response = self::setBasicHttp()->get("https://www.ipjiance.com/api/geoip/report?ip=$ip");
         $data = $response->json();
@@ -401,7 +401,7 @@ class IP
         return null;
     }
 
-    private static function IPSB(string $ip): array|null
+    private static function IPSB(string $ip): ?array
     { // 通过api.ip.sb查询IP地址的详细信息
         try {
             $response = self::setBasicHttp()->post("https://api.ip.sb/geoip/$ip");
@@ -424,7 +424,7 @@ class IP
         return null;
     }
 
-    private static function ipinfo(string $ip): array|null
+    private static function ipinfo(string $ip): ?array
     { // 开发依据: https://ipinfo.io/account/home
         $key = config('services.ip.ipinfo_token');
         if ($key) {
@@ -452,7 +452,7 @@ class IP
         return null;
     }
 
-    private static function ip234(string $ip): array|null
+    private static function ip234(string $ip): ?array
     {
         $response = self::setBasicHttp()->get("https://ip234.in/search_ip?ip=$ip");
         $data = $response->json();
@@ -477,7 +477,7 @@ class IP
         return null;
     }
 
-    private static function dbIP(string $ip): array|null
+    private static function dbIP(string $ip): ?array
     { // 开发依据: https://db-ip.com/api/doc.php
         $response = self::setBasicHttp()->acceptJson()->get("https://api.db-ip.com/v2/free/$ip");
         if ($response->ok()) {
@@ -495,7 +495,7 @@ class IP
         return null;
     }
 
-    private static function IP2Online(string $ip): array|null
+    private static function IP2Online(string $ip): ?array
     { // 开发依据: https://www.ip2location.io/ip2location-documentation
         $key = config('services.ip.IP2Location_key');
         if ($key) {
@@ -518,7 +518,7 @@ class IP
         return null;
     }
 
-    private static function ipdata(string $ip): array|null
+    private static function ipdata(string $ip): ?array
     { // 开发依据: https://docs.ipdata.co/docs
         $key = config('services.ip.ipdata_key');
         if ($key) {
@@ -541,7 +541,7 @@ class IP
         return null;
     }
 
-    private static function ipApiCo(string $ip): array|null
+    private static function ipApiCo(string $ip): ?array
     { // 开发依据: https://ipapi.co/api/
         $response = self::setBasicHttp()->get("https://ipapi.co/$ip/json/");
         if ($response->ok()) {
@@ -561,7 +561,7 @@ class IP
         return null;
     }
 
-    private static function ip2Location(string $ip): array|null
+    private static function ip2Location(string $ip): ?array
     { // 通过ip2Location查询IP地址的详细信息
         $filePath = database_path('IP2LOCATION-LITE-DB5.IPV6.BIN'); // 来源: https://lite.ip2location.com/database-download
         try {
@@ -584,7 +584,7 @@ class IP
         return null;
     }
 
-    private static function GeoIP2(string $ip): array|null
+    private static function GeoIP2(string $ip): ?array
     {// 通过GeoIP2查询IP地址的详细信息
         $filePath = database_path('GeoLite2-City.mmdb'); // 来源:https://github.com/PrxyHunter/GeoLite2/releases
         try {
@@ -606,7 +606,7 @@ class IP
         return null;
     }
 
-    private static function ipApiCom(string $ip): array|null
+    private static function ipApiCom(string $ip): ?array
     { // 开发依据: https://docs.ipdata.co/docs
         $response = self::setBasicHttp()->get("https://ipapi.com/ip_api.php?ip=$ip");
         if ($response->ok()) {
@@ -626,7 +626,7 @@ class IP
         return null;
     }
 
-    public static function getIPGeo(string $ip): array|null
+    public static function getIPGeo(string $ip): ?array
     {
         $ret = null;
         $source = 0;
@@ -653,7 +653,7 @@ class IP
         return Arr::only($ret, ['latitude', 'longitude']);
     }
 
-    private static function userAgentInfo(string $ip): array|null
+    private static function userAgentInfo(string $ip): ?array
     { // 开发依据: https://ip.useragentinfo.com/api
         if (self::$is_ipv4) {
             $response = self::setBasicHttp()->withBody("ip:$ip")->get('https://ip.useragentinfo.com/json');