* * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Overtrue\EasySms\Gateways; use Overtrue\EasySms\Contracts\MessageInterface; use Overtrue\EasySms\Contracts\PhoneNumberInterface; use Overtrue\EasySms\Exceptions\GatewayErrorException; use Overtrue\EasySms\Support\Config; use Overtrue\EasySms\Traits\HasHttpRequest; /** * Class ModuyunGateway. * * @see https://www.moduyun.com/doc/index.html#10002 */ class ModuyunGateway extends Gateway { use HasHttpRequest; const ENDPOINT_URL = 'https://live.moduyun.com/sms/v2/sendsinglesms'; /** * @param \Overtrue\EasySms\Contracts\PhoneNumberInterface $to * @param \Overtrue\EasySms\Contracts\MessageInterface $message * @param \Overtrue\EasySms\Support\Config $config * * @return array * * @throws \Overtrue\EasySms\Exceptions\GatewayErrorException ; */ public function send(PhoneNumberInterface $to, MessageInterface $message, Config $config) { $urlParams = [ 'accesskey' => $config->get('accesskey'), 'random' => rand(100000, 999999), ]; $params = [ 'tel' => [ 'mobile' => $to->getNumber(), 'nationcode' => $to->getIDDCode() ?: '86', ], 'signId' => $config->get('signId', ''), 'templateId' => $message->getTemplate($this), 'time' => time(), 'type' => $config->get('type', 0), 'params' => array_values($message->getData($this)), 'ext' => '', 'extend' => '', ]; $params['sig'] = $this->generateSign($params, $urlParams['random']); $result = $this->postJson($this->getEndpointUrl($urlParams), $params); $result = is_string($result) ? json_decode($result, true) : $result; if (0 != $result['result']) { throw new GatewayErrorException($result['errmsg'], $result['result'], $result); } return $result; } /** * @param array $params * * @return string */ protected function getEndpointUrl($params) { return self::ENDPOINT_URL . '?' . http_build_query($params); } /** * Generate Sign. * * @param array $params * @param string $random * * @return string */ protected function generateSign($params, $random) { return hash('sha256', sprintf( 'secretkey=%s&random=%d&time=%d&mobile=%s', $this->config->get('secretkey'), $random, $params['time'], $params['tel']['mobile'] )); } }