fix: update KavehNegarProvider to use GET requests with query parameters to resolve 431 and idle timeout errors

This commit is contained in:
hamed
2026-07-08 09:51:30 +03:30
parent 5e5455cf8c
commit 8f4f7fc951
4 changed files with 239 additions and 18 deletions
+32 -18
View File
@@ -3,6 +3,7 @@
namespace App\Sms\Provider;
use Psr\Log\LoggerInterface;
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
use Symfony\Contracts\HttpClient\HttpClientInterface;
class KavehNegarProvider implements SmsProviderInterface
@@ -22,20 +23,39 @@ class KavehNegarProvider implements SmsProviderInterface
public function getName(): string { return 'kavenegar'; }
// Kavenegar فقط GET با query را می‌پذیرد (مطابق مستند رسمی). هیچ درخواست POST/body نباید ساخته شود.
// GET بدنه ندارد پس curl هدر `Expect: 100-continue` نمی‌فرستد (رفع idle timeout) و حجم درخواست کوچک می‌ماند.
private const MAX_ATTEMPTS = 3;
/** یک GET به کاوه‌نگار با query params و retry برای خطاهای گذرا؛ آرایهٔ پاسخ را برمی‌گرداند. */
private function get(string $path, array $query): array
{
$url = self::BASE . '/' . $this->key() . $path;
for ($attempt = 1; ; $attempt++) {
try {
return $this->httpClient->request('GET', $url, [
'query' => $query,
'timeout' => 15,
'max_duration' => 30,
'proxy' => null,
])->toArray();
} catch (TransportExceptionInterface $e) {
if ($attempt >= self::MAX_ATTEMPTS) {
throw $e;
}
usleep(500_000 * $attempt);
}
}
}
public function send(string $mobile, string $message): bool
{
try {
$resp = $this->httpClient->request('POST',
self::BASE . '/' . $this->key() . '/sms/send.json', [
'body' => http_build_query([
'receptor' => $mobile,
'message' => $message,
'sender' => $this->sender(),
]),
'timeout' => 10,
]
);
$data = $resp->toArray();
$data = $this->get('/sms/send.json', [
'receptor' => $mobile,
'message' => $message,
'sender' => $this->sender(),
]);
return ($data['return']['status'] ?? 0) === 200;
} catch (\Throwable $e) {
$this->logger->error(sprintf('SMS send failed (kavenegar): %s @ %s:%d', $e->getMessage(), $e->getFile(), $e->getLine()), ['exception' => $e, 'mobile' => $mobile]);
@@ -73,13 +93,7 @@ class KavehNegarProvider implements SmsProviderInterface
$params[$slot] = $this->forSlot($slot, (string) $v);
}
}
$resp = $this->httpClient->request('POST',
self::BASE . '/' . $this->key() . '/verify/lookup.json', [
'body' => http_build_query($params),
'timeout' => 10,
]
);
$data = $resp->toArray();
$data = $this->get('/verify/lookup.json', $params);
return ($data['return']['status'] ?? 0) === 200;
} catch (\Throwable $e) {
$this->logger->error(sprintf('SMS sendTemplate failed (kavenegar): %s @ %s:%d', $e->getMessage(), $e->getFile(), $e->getLine()), ['exception' => $e, 'mobile' => $mobile, 'template' => $templateCode]);