Files
stemcell/app/code/Stemcell/Customer/Controller/Sms/Send.php
T
2026-09-15 10:26:34 +08:00

140 lines
4.6 KiB
PHP

<?php
namespace Stemcell\Customer\Controller\Sms;
use Stemcell\Customer\Api\Data\Http\JsonResponse;
use Stemcell\Customer\Observer\CheckRegisterSmsObserver;
use Stemcell\Sms\Model\AliyunSmsSender;
use Stemcell\Sms\Model\AliyunSmsSenderFactory;
use Magento\Backend\Model\View\Result\RedirectFactory;
use Magento\Framework\App\Action\HttpPostActionInterface as HttpPostActionInterface;
use Magento\Framework\App\CsrfAwareActionInterface;
use Magento\Framework\App\Request\InvalidRequestException;
use Magento\Framework\App\RequestInterface;
use Magento\Framework\App\Response\RedirectInterface;
use Magento\Framework\Controller\Result\JsonFactory as ResultJsonFactory;
use Magento\Framework\Controller\Result\Json as ResultJson;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Session\SessionManagerInterface;
use Magento\Framework\Stdlib\DateTime\DateTimeFactory;
use Magento\Framework\UrlFactory;
use Magento\Framework\Data\Form\FormKey;
use Psr\Log\LoggerInterface;
class Send implements CsrfAwareActionInterface, HttpPostActionInterface
{
/**
* @var \Magento\Framework\Controller\Result\RedirectFactory
*/
protected $resultRedirectFactory;
/**
* @var \Magento\Framework\UrlInterface
*/
protected $urlModel;
protected RedirectInterface $_redirect;
protected ResultJson $resultJson;
protected FormKey\Validator $formKeyValidator;
protected DateTimeFactory $dateTimeFactory;
protected SessionManagerInterface $session;
protected FormKey $formKey;
protected JsonResponse $jsonResponse;
protected RequestInterface $request;
protected AliyunSmsSenderFactory $aliyunSmsSenderFactory;
protected LoggerInterface $logger;
public function __construct(
RedirectFactory $redirectFactory,
UrlFactory $urlFactory,
RedirectInterface $redirect,
ResultJsonFactory $resultJsonFactory,
FormKey\Validator $formKeyValidator,
FormKey $formKey,
SessionManagerInterface $session,
DateTimeFactory $dateTimeFactory,
JsonResponse $jsonResponse,
RequestInterface $request,
LoggerInterface $logger,
AliyunSmsSenderFactory $aliyunSmsSenderFactory
) {
$this->resultRedirectFactory = $redirectFactory;
$this->urlModel = $urlFactory;
$this->_redirect = $redirect;
$this->formKeyValidator = $formKeyValidator;
$this->resultJson = $resultJsonFactory->create();
$this->dateTimeFactory = $dateTimeFactory;
$this->session = $session;
$this->formKey = $formKey;
$this->request = $request;
$this->jsonResponse = $jsonResponse;
$this->aliyunSmsSenderFactory = $aliyunSmsSenderFactory;
$this->logger = $logger;
}
protected function _beforeExecute(RequestInterface $request) {
if (!$this->formKeyValidator->validate($request)) {
throw new LocalizedException(__('Please refresh current page'));
}
if ($request->getParam('captcha_fail')) {
throw new LocalizedException(__('Incorrect CAPTCHA.'));
}
return true;
}
protected function getType() {
$type = $this->request->getParam('form_id');
return $type?:CheckRegisterSmsObserver::FORMID;
}
public function execute()
{
$aliyunSmsSender = $this->aliyunSmsSenderFactory->create([
'data' => [
'type' => $this->getType(),
'mobile' => $this->request->getParam('mobile'),
]
]);
try {
$this->_beforeExecute($this->request);
$response = $aliyunSmsSender->send();
$data = [
'formKey' => $this->formKey->getFormKey(),
'result' => $response->getIsSuccess()
];
if ($aliyunSmsSender->getAppConfig()->getValue('sms/sms/debug')) {
$data['code'] = $aliyunSmsSender->getCode();
}
$this->jsonResponse->setErrors(!$response->getIsSuccess())->setData($data)->setMessages([$response->getMessage()]);
} catch (LocalizedException $e) {
$this->logger->critical('Sms send fail, '.$e->getMessage());
$this->jsonResponse->setErrors(true)
->setMessages([__($e->getMessage())->render()]);
// ->setMessages([__('Sms send fail')->render()]);
}
return $this->resultJson->setData($this->jsonResponse);
}
public function createCsrfValidationException(RequestInterface $request): ?InvalidRequestException
{
return null;
}
public function validateForCsrf(RequestInterface $request): ?bool
{
return true;
}
}