fix: update KavehNegarProvider to use GET requests with query parameters to resolve 431 and idle timeout errors
This commit is contained in:
@@ -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]);
|
||||
|
||||
Reference in New Issue
Block a user