提交 27a86912 编写于 作者: O overtrue

国际短信支持

上级 9d889d4f
......@@ -178,6 +178,25 @@ $easySms->send(13188888888, [
]);
```
## 国际短信
国际短信与国内短信的区别是号码前面需要加国际码,但是由于各平台对国际号码的写法不一致,所以在发送国际短信的时候有一点区别:
```php
use Overtrue\EasySms\PhoneNumber;
// 发送到国际码为 31 的国际号码
$number = new PhoneNumber(13188888888, 31);
$easySms->send($number, [
'content' => '您的验证码为: 6379',
'template' => 'SMS_001',
'data' => [
'code' => 6379
],
]);
```
## 定义短信
你可以根据发送场景的不同,定义不同的短信类,从而实现一处定义多处调用,你可以继承 `Overtrue\EasySms\Message` 来定义短信模型:
......
......@@ -28,13 +28,11 @@ interface GatewayInterface
/**
* Send a short message.
*
* @param int|string|array $to
* @param \Overtrue\EasySms\Contracts\MessageInterface $message
* @param \Overtrue\EasySms\Support\Config $config
* @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($to, MessageInterface $message, Config $config);
public function send(PhoneNumberInterface $to, MessageInterface $message, Config $config);
}
<?php
/*
* This file is part of the overtrue/easy-sms.
*
* (c) overtrue <i@overtrue.me>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
namespace Overtrue\EasySms\Contracts;
/**
* Interface PhoneNumberInterface.
*
* @author overtrue <i@overtrue.me>
*/
interface PhoneNumberInterface extends \JsonSerializable
{
/**
* 86.
*
* @return int
*/
public function getIDDCode();
/**
* 18888888888.
*
* @return int
*/
public function getNumber();
/**
* +8618888888888.
*
* @return string
*/
public function getUniversalNumber();
/**
* 008618888888888.
*
* @return string
*/
public function getZeroPrefixedNumber();
/**
* @return string
*/
public function __toString();
}
......@@ -13,6 +13,8 @@ namespace Overtrue\EasySms;
use Closure;
use Overtrue\EasySms\Contracts\GatewayInterface;
use Overtrue\EasySms\Contracts\MessageInterface;
use Overtrue\EasySms\Contracts\PhoneNumberInterface;
use Overtrue\EasySms\Contracts\StrategyInterface;
use Overtrue\EasySms\Exceptions\InvalidArgumentException;
use Overtrue\EasySms\Strategies\OrderStrategy;
......@@ -82,9 +84,47 @@ class EasySms
*/
public function send($to, $message, array $gateways = [])
{
$to = $this->formatPhoneNumber($to);
$message = $this->formatMessage($message);
return $this->getMessenger()->send($to, $message, $gateways);
}
/**
* @param string|\Overtrue\EasySms\Contracts\PhoneNumberInterface $number
*
* @return \Overtrue\EasySms\PhoneNumber
*/
protected function formatPhoneNumber($number)
{
if ($number instanceof PhoneNumberInterface) {
return $number;
}
return new PhoneNumber(intval($number));
}
/**
* @param array|string|\Overtrue\EasySms\Contracts\MessageInterface $message
*
* @return \Overtrue\EasySms\Contracts\MessageInterface
*/
protected function formatMessage($message)
{
if (!($message instanceof MessageInterface)) {
if (!is_array($message)) {
$message = [
'content' => strval($message),
'template' => strval($message),
];
}
$message = new Message($message);
}
return $message;
}
/**
* Create a gateway.
*
......
......@@ -12,6 +12,7 @@
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;
......@@ -34,25 +35,15 @@ class AlidayuGateway extends Gateway
const ENDPOINT_FORMAT = 'json';
/**
* Get gateway name.
*
* @return string
*/
public function getName()
{
return 'alidayu';
}
/**
* @param array|int|string $to
* @param \Overtrue\EasySms\Contracts\MessageInterface $message
* @param \Overtrue\EasySms\Support\Config $config
* @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;
* @throws \Overtrue\EasySms\Exceptions\GatewayErrorException ;
*/
public function send($to, MessageInterface $message, Config $config)
public function send(PhoneNumberInterface $to, MessageInterface $message, Config $config)
{
$params = [
'method' => self::ENDPOINT_METHOD,
......
......@@ -12,6 +12,7 @@
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;
......@@ -42,25 +43,15 @@ class AliyunGateway extends Gateway
const ENDPOINT_SIGNATURE_VERSION = '1.0';
/**
* Get gateway name.
*
* @return string
*/
public function getName()
{
return 'aliyun';
}
/**
* @param array|int|string $to
* @param \Overtrue\EasySms\Contracts\MessageInterface $message
* @param \Overtrue\EasySms\Support\Config $config
* @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;
* @throws \Overtrue\EasySms\Exceptions\GatewayErrorException ;
*/
public function send($to, MessageInterface $message, Config $config)
public function send(PhoneNumberInterface $to, MessageInterface $message, Config $config)
{
$params = [
'RegionId' => self::ENDPOINT_REGION_ID,
......@@ -72,7 +63,7 @@ class AliyunGateway extends Gateway
'Timestamp' => $this->getTimestamp(),
'Action' => self::ENDPOINT_METHOD,
'Version' => self::ENDPOINT_VERSION,
'PhoneNumbers' => strval($to),
'PhoneNumbers' => strval($to->getZeroPrefixedNumber()),
'SignName' => $config->get('sign_name'),
'TemplateCode' => $message->getTemplate($this),
'TemplateParam' => json_encode($message->getData($this), JSON_FORCE_OBJECT),
......
......@@ -12,6 +12,7 @@
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;
......@@ -35,32 +36,22 @@ class BaiduGateway extends Gateway
const SUCCESS_CODE = 1000;
/**
* Get gateway name.
*
* @return string
*/
public function getName()
{
return 'baidu';
}
/**
* Send message.
*
* @param array|int|string $to
* @param \Overtrue\EasySms\Contracts\MessageInterface $message
* @param \Overtrue\EasySms\Support\Config $config
* @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;
* @throws \Overtrue\EasySms\Exceptions\GatewayErrorException ;
*/
public function send($to, MessageInterface $message, Config $config)
public function send(PhoneNumberInterface $to, MessageInterface $message, Config $config)
{
$params = [
'invokeId' => $config->get('invoke_id'),
'phoneNumber' => $to,
'phoneNumber' => $to->getNumber(),
'templateCode' => $message->getTemplate($this),
'contentVar' => $message->getData($this),
];
......
......@@ -12,6 +12,7 @@
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;
......@@ -28,30 +29,20 @@ class ChuanglanGateway extends Gateway
const ENDPOINT_URL = 'https://sms.253.com/msg/send';
/**
* Get gateway name.
*
* @return string
*/
public function getName()
{
return 'chuanglan';
}
/**
* @param array|int|string $to
* @param \Overtrue\EasySms\Contracts\MessageInterface $message
* @param \Overtrue\EasySms\Support\Config $config
* @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;
* @throws \Overtrue\EasySms\Exceptions\GatewayErrorException ;
*/
public function send($to, MessageInterface $message, Config $config)
public function send(PhoneNumberInterface $to, MessageInterface $message, Config $config)
{
$params = [
'un' => $config->get('username'),
'pw' => $config->get('password'),
'phone' => $to,
'phone' => $to->getIDDCode().$to->getNumber(),
'msg' => $message->getContent($this),
];
......
......@@ -12,6 +12,7 @@
namespace Overtrue\EasySms\Gateways;
use Overtrue\EasySms\Contracts\MessageInterface;
use Overtrue\EasySms\Contracts\PhoneNumberInterface;
use Overtrue\EasySms\Support\Config;
/**
......@@ -20,23 +21,13 @@ use Overtrue\EasySms\Support\Config;
class ErrorlogGateway extends Gateway
{
/**
* Get gateway name.
*
* @return string
*/
public function getName()
{
return 'errorlog';
}
/**
* @param array|int|string $to
* @param \Overtrue\EasySms\Contracts\MessageInterface $message
* @param \Overtrue\EasySms\Support\Config $config
* @param \Overtrue\EasySms\Contracts\PhoneNumberInterface $to
* @param \Overtrue\EasySms\Contracts\MessageInterface $message
* @param \Overtrue\EasySms\Support\Config $config
*
* @return array
*/
public function send($to, MessageInterface $message, Config $config)
public function send(PhoneNumberInterface $to, MessageInterface $message, Config $config)
{
if (is_array($to)) {
$to = implode(',', $to);
......
......@@ -90,6 +90,6 @@ abstract class Gateway implements GatewayInterface
*/
public function getName()
{
return '';
return \strtolower(str_replace([__NAMESPACE__.'\\', 'Gateway'], '', \get_class($this)));
}
}
......@@ -12,6 +12,7 @@
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;
......@@ -28,25 +29,15 @@ class HuaxinGateway extends Gateway
const ENDPOINT_TEMPLATE = 'http://%s/smsJson.aspx';
/**
* Get gateway name.
*
* @return string
*/
public function getName()
{
return 'huaxin';
}
/**
* @param array|int|string $to
* @param \Overtrue\EasySms\Contracts\MessageInterface $message
* @param \Overtrue\EasySms\Support\Config $config
* @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;
* @throws \Overtrue\EasySms\Exceptions\GatewayErrorException ;
*/
public function send($to, MessageInterface $message, Config $config)
public function send(PhoneNumberInterface $to, MessageInterface $message, Config $config)
{
$endpoint = $this->buildEndpoint($config->get('ip'));
......
......@@ -12,6 +12,7 @@
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;
......@@ -32,29 +33,19 @@ class HuyiGateway extends Gateway
const SUCCESS_CODE = 2;
/**
* Get gateway name.
*
* @return string
*/
public function getName()
{
return 'huyi';
}
/**
* @param array|int|string $to
* @param \Overtrue\EasySms\Contracts\MessageInterface $message
* @param \Overtrue\EasySms\Support\Config $config
* @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;
* @throws \Overtrue\EasySms\Exceptions\GatewayErrorException ;
*/
public function send($to, MessageInterface $message, Config $config)
public function send(PhoneNumberInterface $to, MessageInterface $message, Config $config)
{
$params = [
'account' => $config->get('api_id'),
'mobile' => strval($to),
'mobile' => $to->getIDDCode() ? \sprintf('%s %s', $to->getIDDCode(), $to->getNumber()) : $to->getNumber(),
'content' => $message->getContent($this),
'time' => time(),
'format' => self::ENDPOINT_FORMAT,
......
......@@ -12,6 +12,7 @@
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;
......@@ -30,28 +31,18 @@ class JuheGateway extends Gateway
const ENDPOINT_FORMAT = 'json';
/**
* Get gateway name.
*
* @return string
*/
public function getName()
{
return 'juhe';
}
/**
* @param array|int|string $to
* @param \Overtrue\EasySms\Contracts\MessageInterface $message
* @param \Overtrue\EasySms\Support\Config $config
* @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;
* @throws \Overtrue\EasySms\Exceptions\GatewayErrorException ;
*/
public function send($to, MessageInterface $message, Config $config)
public function send(PhoneNumberInterface $to, MessageInterface $message, Config $config)
{
$params = [
'mobile' => $to,
'mobile' => $to->getNumber(),
'tpl_id' => $message->getTemplate($this),
'tpl_value' => $this->formatTemplateVars($message->getData($this)),
'dtype' => self::ENDPOINT_FORMAT,
......
......@@ -12,6 +12,7 @@
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;
......@@ -32,30 +33,20 @@ class LuosimaoGateway extends Gateway
const ENDPOINT_FORMAT = 'json';
/**
* Get gateway name.
*
* @return string
*/
public function getName()
{
return 'luosimao';
}
/**
* @param array|int|string $to
* @param \Overtrue\EasySms\Contracts\MessageInterface $message
* @param \Overtrue\EasySms\Support\Config $config
* @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;
* @throws \Overtrue\EasySms\Exceptions\GatewayErrorException ;
*/
public function send($to, MessageInterface $message, Config $config)
public function send(PhoneNumberInterface $to, MessageInterface $message, Config $config)
{
$endpoint = $this->buildEndpoint('sms-api', 'send');
$result = $this->post($endpoint, [
'mobile' => $to,
'mobile' => $to->getNumber(),
'message' => $message->getContent($this),
], [
'Authorization' => 'Basic '.base64_encode('api:key-'.$config->get('api_key')),
......
......@@ -12,14 +12,15 @@
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 AlidayuGateway.
* Class QcloudGateway.
*
* @see https://yun.tim.qq.com/v5/tlssmssvr/sendsms?sdkappid=xxxxx&random=xxxx
* @see https://cloud.tencent.com/document/product/382/13297
*/
class QcloudGateway extends Gateway
{
......@@ -34,32 +35,23 @@ class QcloudGateway extends Gateway
const ENDPOINT_FORMAT = 'json';
/**
* Get gateway name.
*
* @return string
*/
public function getName()
{
return 'qcloud';
}
/**
* @param array|int|string $to
* @param \Overtrue\EasySms\Contracts\MessageInterface $message
* @param \Overtrue\EasySms\Support\Config $config
* @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;
* @throws \Overtrue\EasySms\Exceptions\GatewayErrorException ;
*/
public function send($to, MessageInterface $message, Config $config)
public function send(PhoneNumberInterface $to, MessageInterface $message, Config $config)
{
$type = !empty($message->getData($this)['type']) ? $message->getData($this)['type'] : 0;
$params = [
'tel' => [
'nationcode' => $message->getData($this)['nationcode'] ?? '86',
'mobile' => $to,
'nationcode' => $to->getIDDCode() ?: 86,
'mobile' => $to->getNumber(),
],
'type' => $message->getData($this)['type'] ?? 0,
'type' => $type,
'msg' => $message->getContent($this),
'time' => time(),
'extend' => '',
......
......@@ -13,6 +13,7 @@ namespace Overtrue\EasySms\Gateways;
use GuzzleHttp\Exception\ClientException;
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;
......@@ -39,46 +40,31 @@ class RongcloudGateway extends Gateway
const SUCCESS_CODE = 200;
/**
* Get gateway name.
*
* @return string
*/
public function getName()
{
return 'rongcloud';
}
/**
* @param array|int|string $to
* @param \Overtrue\EasySms\Contracts\MessageInterface $message
* @param \Overtrue\EasySms\Support\Config $config
* @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;
* @throws \Overtrue\EasySms\Exceptions\GatewayErrorException ;
*/
public function send($to, MessageInterface $message, Config $config)
public function send(PhoneNumberInterface $to, MessageInterface $message, Config $config)
{
$data = $message->getData();
if (array_key_exists('action', $data)) {
$action = $data['action'];
} else {
$action = self::ENDPOINT_ACTION;
}
$action = array_key_exists('action', $data) ? $data['action'] : self::ENDPOINT_ACTION;
$endpoint = $this->buildEndpoint($action);
$headers = [
'Nonce' => uniqid(),
'App-Key' => $config->get('app_key'),
'Timestamp' => time(),
];
];
$headers['Signature'] = $this->generateSign($headers, $config);
switch ($action) {
case 'sendCode':
$params = [
'mobile' => $to,
'mobile' => $to->getNumber(),
'region' => self::ENDPOINT_REGION,
'templateId' => $message->getTemplate($this),
];
......@@ -97,7 +83,7 @@ class RongcloudGateway extends Gateway
break;
case 'sendNotify':
$params = [
'mobile' => $to,
'mobile' => $to->getNumber(),
'region' => self::ENDPOINT_REGION,
'templateId' => $message->getTemplate($this),
];
......
......@@ -12,6 +12,7 @@
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;
......@@ -27,33 +28,24 @@ class SendcloudGateway extends Gateway
const ENDPOINT_TEMPLATE = 'http://www.sendcloud.net/smsapi/%s';
/**
* Get gateway name.
*
* @return string
*/
public function getName()
{
return 'sendcloud';
}
/**
* Send a short message.
*
* @param int|string|array $to
* @param \Overtrue\EasySms\Contracts\MessageInterface $message
* @param \Overtrue\EasySms\Support\Config $config
* @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($to, MessageInterface $message, Config $config)
public function send(PhoneNumberInterface $to, MessageInterface $message, Config $config)
{
$params = [
'smsUser' => $config->get('sms_user'),
'templateId' => $message->getTemplate($this),
'phone' => is_array($to) ? implode(',', $to) : $to,
'msgType' => $to->getIDDCode() ? 2 : 0,
'phone' => $to->getNumber(),
'vars' => $this->formatTemplateVars($message->getData($this)),
];
......
......@@ -12,6 +12,7 @@
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;
......@@ -25,38 +26,28 @@ class SubmailGateway extends Gateway
{
use HasHttpRequest;
const ENDPOINT_TEMPLATE = 'https://api.mysubmail.com/message/%s.%s';
const ENDPOINT_TEMPLATE = 'https://api.mysubmail.com/%s.%s';
const ENDPOINT_FORMAT = 'json';
/**
* Get gateway name.
*
* @return string
*/
public function getName()
{
return 'submail';
}
/**
* @param array|int|string $to
* @param \Overtrue\EasySms\Contracts\MessageInterface $message
* @param \Overtrue\EasySms\Support\Config $config
* @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;
* @throws \Overtrue\EasySms\Exceptions\GatewayErrorException ;
*/
public function send($to, MessageInterface $message, Config $config)
public function send(PhoneNumberInterface $to, MessageInterface $message, Config $config)
{
$endpoint = $this->buildEndpoint('xsend');
$endpoint = $this->buildEndpoint($to->getIDDCode() ? 'internationalsms/xsend' : 'message/xsend');
$result = $this->post($endpoint, [
'appid' => $config->get('app_id'),
'signature' => $config->get('app_key'),
'project' => $config->get('project'),
'to' => $to,
'to' => $to->getUniversalNumber(),
'vars' => json_encode($message->getData($this), JSON_FORCE_OBJECT),
]);
......
......@@ -12,6 +12,7 @@
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;
......@@ -38,15 +39,15 @@ class TianyiwuxianGateway extends Gateway
const SUCCESS_CODE = '0';
/**
* @param array|int|string $to
* @param \Overtrue\EasySms\Contracts\MessageInterface $message
* @param \Overtrue\EasySms\Support\Config $config
* @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;
* @throws \Overtrue\EasySms\Exceptions\GatewayErrorException ;
*/
public function send($to, MessageInterface $message, Config $config)
public function send(PhoneNumberInterface $to, MessageInterface $message, Config $config)
{
$endpoint = $this->buildEndpoint();
......@@ -54,7 +55,7 @@ class TianyiwuxianGateway extends Gateway
'gwid' => $config->get('gwid'),
'type' => self::ENDPOINT_TYPE,
'rece' => self::ENDPOINT_FORMAT,
'mobile' => $to,
'mobile' => $to->getNumber(),
'message' => $message->getContent($this),
'username' => $config->get('username'),
'password' => strtoupper(md5($config->get('password'))),
......
......@@ -13,6 +13,7 @@ namespace Overtrue\EasySms\Gateways;
use GuzzleHttp\Exception\ClientException;
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;
......@@ -38,13 +39,22 @@ class TwilioGateway extends Gateway
return 'twilio';
}
public function send($to, MessageInterface $message, Config $config)
/**
* @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)
{
$accountSid = $config->get('account_sid');
$endpoint = $this->buildEndPoint($accountSid);
$params = [
'To' => $to,
'To' => $to->getUniversalNumber(),
'From' => $config->get('from'),
'Body' => $message->getContent($this),
];
......
......@@ -12,6 +12,7 @@
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;
......@@ -19,7 +20,7 @@ use Overtrue\EasySms\Traits\HasHttpRequest;
/**
* Class YunpianGateway.
*
* @see https://www.yunpian.com/api2.0/api-domestic/single_send.html
* @see https://www.yunpian.com/doc/zh_CN/intl/single_send.html
*/
class YunpianGateway extends Gateway
{
......@@ -32,31 +33,21 @@ class YunpianGateway extends Gateway
const ENDPOINT_FORMAT = 'json';
/**
* Get gateway name.
*
* @return string
*/
public function getName()
{
return 'yunpian';
}
/**
* @param array|int|string $to
* @param \Overtrue\EasySms\Contracts\MessageInterface $message
* @param \Overtrue\EasySms\Support\Config $config
* @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;
* @throws \Overtrue\EasySms\Exceptions\GatewayErrorException ;
*/
public function send($to, MessageInterface $message, Config $config)
public function send(PhoneNumberInterface $to, MessageInterface $message, Config $config)
{
$endpoint = $this->buildEndpoint('sms', 'sms', 'single_send');
$result = $this->post($endpoint, [
'apikey' => $config->get('api_key'),
'mobile' => $to,
'mobile' => $to->getUniversalNumber(),
'text' => $message->getContent($this),
]);
......
......@@ -12,6 +12,7 @@
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;
......@@ -40,25 +41,15 @@ class YuntongxunGateway extends Gateway
const SUCCESS_CODE = '000000';
/**
* Get gateway name.
*
* @return string
*/
public function getName()
{
return 'yuntongxun';
}
/**
* @param array|int|string $to
* @param \Overtrue\EasySms\Contracts\MessageInterface $message
* @param \Overtrue\EasySms\Support\Config $config
* @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;
* @throws \Overtrue\EasySms\Exceptions\GatewayErrorException ;
*/
public function send($to, MessageInterface $message, Config $config)
public function send(PhoneNumberInterface $to, MessageInterface $message, Config $config)
{
$datetime = date('YmdHis');
......
......@@ -12,6 +12,7 @@
namespace Overtrue\EasySms;
use Overtrue\EasySms\Contracts\MessageInterface;
use Overtrue\EasySms\Contracts\PhoneNumberInterface;
use Overtrue\EasySms\Exceptions\NoGatewayAvailableException;
use Overtrue\EasySms\Support\Config;
......@@ -42,19 +43,17 @@ class Messenger
/**
* Send a message.
*
* @param string|array $to
* @param string|array|\Overtrue\EasySms\Contracts\MessageInterface $message
* @param array $gateways
* @param \Overtrue\EasySms\Contracts\PhoneNumberInterface $to
* @param \Overtrue\EasySms\Contracts\MessageInterface $message
* @param array $gateways
*
* @return array
*
* @throws \Overtrue\EasySms\Exceptions\InvalidArgumentException
* @throws \Overtrue\EasySms\Exceptions\NoGatewayAvailableException
*/
public function send($to, $message, array $gateways = [])
public function send(PhoneNumberInterface $to, MessageInterface $message, array $gateways = [])
{
$message = $this->formatMessage($message);
if (empty($gateways)) {
$gateways = $message->getGateways();
}
......@@ -97,27 +96,6 @@ class Messenger
return $results;
}
/**
* @param array|string|\Overtrue\EasySms\Contracts\MessageInterface $message
*
* @return \Overtrue\EasySms\Contracts\MessageInterface
*/
protected function formatMessage($message)
{
if (!($message instanceof MessageInterface)) {
if (!is_array($message)) {
$message = [
'content' => strval($message),
'template' => strval($message),
];
}
$message = new Message($message);
}
return $message;
}
/**
* @param array $gateways
*
......
<?php
/*
* This file is part of the overtrue/easy-sms.
*
* (c) overtrue <i@overtrue.me>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
namespace Overtrue\EasySms;
/**
* Class PhoneNumberInterface.
*
* @author overtrue <i@overtrue.me>
*/
class PhoneNumber implements \Overtrue\EasySms\Contracts\PhoneNumberInterface
{
/**
* @var int
*/
protected $number;
/**
* @var int
*/
protected $IDDCode;
/**
* PhoneNumberInterface constructor.
*
* @param int $numberWithoutIDDCode
* @param string $IDDCode
*/
public function __construct($numberWithoutIDDCode, $IDDCode = null)
{
$this->number = $numberWithoutIDDCode;
$this->IDDCode = $IDDCode ? intval(ltrim($IDDCode, '+0')) : null;
}
/**
* 86.
*
* @return int
*/
public function getIDDCode()
{
return $this->IDDCode;
}
/**
* 18888888888.
*
* @return int
*/
public function getNumber()
{
return $this->number;
}
/**
* +8618888888888.
*
* @return string
*/
public function getUniversalNumber()
{
return $this->getPrefixedIDDCode('+').$this->number;
}
/**
* 008618888888888.
*
* @return string
*/
public function getZeroPrefixedNumber()
{
return $this->getPrefixedIDDCode('00').$this->number;
}
/**
* @param string $prefix
*
* @return null|string
*/
public function getPrefixedIDDCode($prefix)
{
return $this->IDDCode ? $prefix.$this->IDDCode : null;
}
/**
* @return string
*/
public function __toString()
{
return $this->getUniversalNumber();
}
/**
* Specify data which should be serialized to JSON.
*
* @see http://php.net/manual/en/jsonserializable.jsonserialize.php
*
* @return mixed data which can be serialized by <b>json_encode</b>,
* which is a value of any type other than a resource
*
* @since 5.4.0
*/
public function jsonSerialize()
{
return $this->getUniversalNumber();
}
}
......@@ -13,10 +13,12 @@ namespace Overtrue\EasySms\Tests;
use Overtrue\EasySms\Contracts\GatewayInterface;
use Overtrue\EasySms\Contracts\MessageInterface;
use Overtrue\EasySms\Contracts\PhoneNumberInterface;
use Overtrue\EasySms\EasySms;
use Overtrue\EasySms\Exceptions\InvalidArgumentException;
use Overtrue\EasySms\Message;
use Overtrue\EasySms\Messenger;
use Overtrue\EasySms\PhoneNumber;
use Overtrue\EasySms\Support\Config;
use RuntimeException;
......@@ -76,14 +78,31 @@ class EasySmsTest extends TestCase
public function testSend()
{
$message = new Message(['content' => 'hello']);
$messenger = \Mockery::mock(Messenger::class);
$messenger->allows()->send(\Mockery::on(function ($number) {
return $number instanceof PhoneNumber && !empty($number->getNumber());
}), \Mockery::on(function ($message) {
return $message instanceof MessageInterface && !empty($message->getContent());
}), [])->andReturn('send-result');
$easySms = \Mockery::mock(EasySms::class.'[getMessenger]', [['default' => DummyGatewayForTest::class]]);
$messenger = \Mockery::mock(Messenger::class);
$messenger->shouldReceive('send')->with('mock-number', $message, [])->andReturn('send-result');
$easySms->shouldReceive('getMessenger')->andReturn($messenger);
$this->assertSame('send-result', $easySms->send('mock-number', $message, []));
// simple
$this->assertSame('send-result', $easySms->send('18888888888', ['content' => 'hello']));
// message object
$message = new Message(['content' => 'hello']);
$this->assertSame('send-result', $easySms->send('18888888888', $message, []));
// phone number object
$number = new PhoneNumber('18888888888', 35);
$message = new Message(['content' => 'hello']);
$messenger = \Mockery::mock(Messenger::class);
$messenger->expects()->send($number, $message, [])->andReturn('mock-result');
$easySms = \Mockery::mock(EasySms::class.'[getMessenger]', [['default' => DummyGatewayForTest::class]]);
$easySms->shouldReceive('getMessenger')->andReturn($messenger);
$this->assertSame('mock-result', $easySms->send($number, $message));
}
public function testGetMessenger()
......@@ -101,7 +120,7 @@ class DummyGatewayForTest implements GatewayInterface
return 'name';
}
public function send($to, MessageInterface $message, Config $config)
public function send(PhoneNumberInterface $to, MessageInterface $message, Config $config)
{
return 'send-result';
}
......
......@@ -14,16 +14,12 @@ namespace Overtrue\EasySms\Tests\Gateways;
use Overtrue\EasySms\Exceptions\GatewayErrorException;
use Overtrue\EasySms\Gateways\AlidayuGateway;
use Overtrue\EasySms\Message;
use Overtrue\EasySms\PhoneNumber;
use Overtrue\EasySms\Support\Config;
use Overtrue\EasySms\Tests\TestCase;
class AlidayuGatewayTest extends TestCase
{
public function testGetName()
{
$this->assertSame('alidayu', (new AlidayuGateway([]))->getName());
}
public function testSend()
{
$config = [
......@@ -43,7 +39,7 @@ class AlidayuGatewayTest extends TestCase
'sms_free_sign_name' => 'mock-api-sign-name',
'app_key' => 'mock-api-key',
'sms_template_code' => 'mock-template-code',
'rec_num' => strval(18888888888),
'rec_num' => strval(new PhoneNumber(18888888888)),
'sms_param' => json_encode(['code' => '123456', 'time' => '15']),
];
$gateway->shouldReceive('post')
......@@ -75,12 +71,12 @@ class AlidayuGatewayTest extends TestCase
$this->assertSame([
'success_response' => 'mock-result',
], $gateway->send(18888888888, $message, $config));
], $gateway->send(new PhoneNumber(18888888888), $message, $config));
$this->expectException(GatewayErrorException::class);
$this->expectExceptionCode(100);
$this->expectExceptionMessage('mock-msg');
$gateway->send(18888888888, $message, $config);
$gateway->send(new PhoneNumber(18888888888), $message, $config);
}
}
......@@ -14,16 +14,12 @@ namespace Overtrue\EasySms\Tests\Gateways;
use Overtrue\EasySms\Exceptions\GatewayErrorException;
use Overtrue\EasySms\Gateways\AliyunGateway;
use Overtrue\EasySms\Message;
use Overtrue\EasySms\PhoneNumber;
use Overtrue\EasySms\Support\Config;
use Overtrue\EasySms\Tests\TestCase;
class AliyunGatewayTest extends TestCase
{
public function testGetName()
{
$this->assertSame('aliyun', (new AliyunGateway([]))->getName());
}
public function testSend()
{
$config = [
......@@ -44,7 +40,7 @@ class AliyunGatewayTest extends TestCase
// 'Timestamp' => date('Y-m-d\TH:i:s\Z'),
'Action' => 'SendSms',
'Version' => '2017-05-25',
'PhoneNumbers' => strval(18888888888),
'PhoneNumbers' => strval(new PhoneNumber(18888888888)),
'SignName' => 'mock-api-sign-name',
'TemplateCode' => 'mock-template-code',
'TemplateParam' => json_encode(['code' => '123456']),
......@@ -81,12 +77,12 @@ class AliyunGatewayTest extends TestCase
$this->assertSame([
'Code' => 'OK',
'Message' => 'mock-result',
], $gateway->send(18888888888, $message, $config));
], $gateway->send(new PhoneNumber(18888888888), $message, $config));
$this->expectException(GatewayErrorException::class);
$this->expectExceptionCode(1234);
$this->expectExceptionMessage('mock-err-msg');
$gateway->send(18888888888, $message, $config);
$gateway->send(new PhoneNumber(18888888888), $message, $config);
}
}
......@@ -14,16 +14,12 @@ namespace Overtrue\EasySms\Tests\Gateways;
use Overtrue\EasySms\Exceptions\GatewayErrorException;
use Overtrue\EasySms\Gateways\BaiduGateway;
use Overtrue\EasySms\Message;
use Overtrue\EasySms\PhoneNumber;
use Overtrue\EasySms\Support\Config;
use Overtrue\EasySms\Tests\TestCase;
class BaiduGatewayTest extends TestCase
{
public function testGetName()
{
$this->assertSame('baidu', (new BaiduGateway([]))->getName());
}
public function testSend()
{
$config = [
......@@ -62,12 +58,12 @@ class BaiduGatewayTest extends TestCase
]);
$config = new Config($config);
$this->assertSame(['code' => BaiduGateway::SUCCESS_CODE, 'message' => 'success'], $gateway->send(18888888888, $message, $config));
$this->assertSame(['code' => BaiduGateway::SUCCESS_CODE, 'message' => 'success'], $gateway->send(new PhoneNumber(18888888888), $message, $config));
$this->expectException(GatewayErrorException::class);
$this->expectExceptionCode(100);
$this->expectExceptionMessage('mock-msg');
$gateway->send(18888888888, $message, $config);
$gateway->send(new PhoneNumber(18888888888), $message, $config);
}
}
......@@ -13,6 +13,7 @@ namespace Overtrue\EasySms\Tests\Gateways;
use Overtrue\EasySms\Gateways\ErrorlogGateway;
use Overtrue\EasySms\Message;
use Overtrue\EasySms\PhoneNumber;
use Overtrue\EasySms\Support\Config;
use Overtrue\EasySms\Tests\TestCase;
......@@ -37,7 +38,7 @@ class ErrorlogGatewayTest extends TestCase
'data' => ['foo' => 'bar'],
]);
$gateway->send(18188888888, $message, new Config());
$gateway->send(new PhoneNumber(new PhoneNumber(18188888888)), $message, new Config());
$this->assertTrue(file_exists($this->logFile));
$this->assertContains(
......
......@@ -12,6 +12,7 @@
namespace Overtrue\EasySms\Tests\Gateways;
use Overtrue\EasySms\Contracts\MessageInterface;
use Overtrue\EasySms\Contracts\PhoneNumberInterface;
use Overtrue\EasySms\Gateways\Gateway;
use Overtrue\EasySms\Support\Config;
use Overtrue\EasySms\Tests\TestCase;
......@@ -44,7 +45,7 @@ class GatewayTest extends TestCase
class DummyGatewayForGatewayTest extends Gateway
{
public function send($to, MessageInterface $message, Config $config)
public function send(PhoneNumberInterface $to, MessageInterface $message, Config $config)
{
return 'mock-result';
}
......
......@@ -14,16 +14,12 @@ namespace Overtrue\EasySms\Tests\Gateways;
use Overtrue\EasySms\Exceptions\GatewayErrorException;
use Overtrue\EasySms\Gateways\HuaxinGateway;
use Overtrue\EasySms\Message;
use Overtrue\EasySms\PhoneNumber;
use Overtrue\EasySms\Support\Config;
use Overtrue\EasySms\Tests\TestCase;
class HuaxinGatewayTest extends TestCase
{
public function testGetName()
{
$this->assertSame('huaxin', (new HuaxinGateway([]))->getName());
}
public function testSend()
{
$config = [
......@@ -39,7 +35,7 @@ class HuaxinGatewayTest extends TestCase
'userid' => 'mock-user-id',
'password' => 'mock-password',
'account' => 'mock-account',
'mobile' => 18188888888,
'mobile' => new PhoneNumber(18188888888),
'content' => 'This is a test message.',
'sendTime' => '',
'action' => 'send',
......@@ -68,13 +64,13 @@ class HuaxinGatewayTest extends TestCase
'taskID' => '1504080852350206',
'successCounts' => '1',
],
$gateway->send(18188888888, $message, $config)
$gateway->send(new PhoneNumber(18188888888), $message, $config)
);
$this->expectException(GatewayErrorException::class);
$this->expectExceptionCode(400);
$this->expectExceptionMessage('操作失败');
$gateway->send(18188888888, $message, $config);
$gateway->send(new PhoneNumber(18188888888), $message, $config);
}
}
......@@ -14,16 +14,12 @@ namespace Overtrue\EasySms\Tests\Gateways;
use Overtrue\EasySms\Exceptions\GatewayErrorException;
use Overtrue\EasySms\Gateways\HuyiGateway;
use Overtrue\EasySms\Message;
use Overtrue\EasySms\PhoneNumber;
use Overtrue\EasySms\Support\Config;
use Overtrue\EasySms\Tests\TestCase;
class HuyiGatewayTest extends TestCase
{
public function testGetName()
{
$this->assertSame('huyi', (new HuyiGateway([]))->getName());
}
public function testSend()
{
$config = [
......@@ -34,7 +30,7 @@ class HuyiGatewayTest extends TestCase
$params = [
'account' => 'mock-api-id',
'mobile' => strval(18188888888),
'mobile' => 18188888888,
'content' => 'This is a test message.',
'format' => 'json',
];
......@@ -53,12 +49,12 @@ class HuyiGatewayTest extends TestCase
$this->assertSame([
'code' => HuyiGateway::SUCCESS_CODE,
'msg' => 'mock-result',
], $gateway->send(18188888888, $message, $config));
], $gateway->send(new PhoneNumber(18188888888), $message, $config));
$this->expectException(GatewayErrorException::class);
$this->expectExceptionCode(1234);
$this->expectExceptionMessage('mock-err-msg');
$gateway->send(18188888888, $message, $config);
$gateway->send(new PhoneNumber(18188888888), $message, $config);
}
}
......@@ -14,16 +14,12 @@ namespace Overtrue\EasySms\Tests\Gateways;
use Overtrue\EasySms\Exceptions\GatewayErrorException;
use Overtrue\EasySms\Gateways\JuheGateway;
use Overtrue\EasySms\Message;
use Overtrue\EasySms\PhoneNumber;
use Overtrue\EasySms\Support\Config;
use Overtrue\EasySms\Tests\TestCase;
class JuheGatewayTest extends TestCase
{
public function testGetName()
{
$this->assertSame('juhe', (new JuheGateway([]))->getName());
}
public function testSend()
{
$config = [
......@@ -60,12 +56,12 @@ class JuheGatewayTest extends TestCase
$this->assertSame([
'reason' => '操作成功',
'error_code' => 0,
], $gateway->send(18188888888, $message, $config));
], $gateway->send(new PhoneNumber(18188888888), $message, $config));
$this->expectException(GatewayErrorException::class);
$this->expectExceptionCode(21000);
$this->expectExceptionMessage('操作失败');
$gateway->send(18188888888, $message, $config);
$gateway->send(new PhoneNumber(18188888888), $message, $config);
}
}
......@@ -14,16 +14,12 @@ namespace Overtrue\EasySms\Tests\Gateways;
use Overtrue\EasySms\Exceptions\GatewayErrorException;
use Overtrue\EasySms\Gateways\LuosimaoGateway;
use Overtrue\EasySms\Message;
use Overtrue\EasySms\PhoneNumber;
use Overtrue\EasySms\Support\Config;
use Overtrue\EasySms\Tests\TestCase;
class LuosimaoGatewayTest extends TestCase
{
public function testGetName()
{
$this->assertSame('luosimao', (new LuosimaoGateway([]))->getName());
}
public function testSend()
{
$config = [
......@@ -50,12 +46,12 @@ class LuosimaoGatewayTest extends TestCase
$this->assertSame([
'error' => 0,
'msg' => 'success',
], $gateway->send(18188888888, $message, $config));
], $gateway->send(new PhoneNumber(18188888888), $message, $config));
$this->expectException(GatewayErrorException::class);
$this->expectExceptionCode(10000);
$this->expectExceptionMessage('mock-err-msg');
$gateway->send(18188888888, $message, $config);
$gateway->send(new PhoneNumber(18188888888), $message, $config);
}
}
......@@ -14,16 +14,12 @@ namespace Overtrue\EasySms\Tests\Gateways;
use Overtrue\EasySms\Exceptions\GatewayErrorException;
use Overtrue\EasySms\Gateways\QcloudGateway;
use Overtrue\EasySms\Message;
use Overtrue\EasySms\PhoneNumber;
use Overtrue\EasySms\Support\Config;
use Overtrue\EasySms\Tests\TestCase;
class QcloudGatewayTest extends TestCase
{
public function testGetName()
{
$this->assertSame('qcloud', (new QcloudGateway([]))->getName());
}
public function testSend()
{
$config = [
......@@ -35,7 +31,7 @@ class QcloudGatewayTest extends TestCase
$expected = [
'tel' => [
'nationcode' => '86',
'mobile' => strval(18888888888),
'mobile' => strval(new PhoneNumber(18888888888)),
],
'type' => 0,
'msg' => 'This is a test message.',
......@@ -66,12 +62,63 @@ class QcloudGatewayTest extends TestCase
'ext' => '',
'sid' => 3310228982,
'fee' => 1,
], $gateway->send(18888888888, $message, $config));
], $gateway->send(new PhoneNumber(18888888888), $message, $config));
$this->expectException(GatewayErrorException::class);
$this->expectExceptionCode(1001);
$this->expectExceptionMessage('sig校验失败');
$gateway->send(new PhoneNumber(18888888888), $message, $config);
}
public function testSendUsingNationCode()
{
$config = [
'sdk_app_id' => 'mock-sdk-app-id',
'app_key' => 'mock-api-key',
];
$gateway = \Mockery::mock(QcloudGateway::class.'[request]', [$config])->shouldAllowMockingProtectedMethods();
$expected = [
'tel' => [
'nationcode' => 251,
'mobile' => 18888888888,
],
'type' => 0,
'msg' => 'This is a test message.',
'timestamp' => time(),
'extend' => '',
'ext' => '',
];
$gateway->shouldReceive('request')
->andReturn([
'result' => 0,
'errmsg' => 'OK',
'ext' => '',
'sid' => 3310228982,
'fee' => 1,
], [
'result' => 1001,
'errmsg' => 'sig校验失败',
])->twice();
$message = new Message(['data' => ['type' => 0], 'content' => 'This is a test message.']);
$config = new Config($config);
$this->assertSame([
'result' => 0,
'errmsg' => 'OK',
'ext' => '',
'sid' => 3310228982,
'fee' => 1,
], $gateway->send(new PhoneNumber(18888888888, 251), $message, $config));
$this->expectException(GatewayErrorException::class);
$this->expectExceptionCode(1001);
$this->expectExceptionMessage('sig校验失败');
$gateway->send(18888888888, $message, $config);
$gateway->send(new PhoneNumber(18888888888, 251), $message, $config);
}
}
......@@ -14,16 +14,12 @@ namespace Overtrue\EasySms\Tests\Gateways;
use Overtrue\EasySms\Exceptions\GatewayErrorException;
use Overtrue\EasySms\Gateways\SendcloudGateway;
use Overtrue\EasySms\Message;
use Overtrue\EasySms\PhoneNumber;
use Overtrue\EasySms\Support\Config;
use Overtrue\EasySms\Tests\TestCase;
class SendcloudGatewayTest extends TestCase
{
public function testGetName()
{
$this->assertSame('sendcloud', (new SendcloudGateway([]))->getName());
}
public function testSend()
{
$config = [
......@@ -35,6 +31,7 @@ class SendcloudGatewayTest extends TestCase
$expected = [
'smsUser' => 'mock-user',
'templateId' => 'mock-tpl-id',
'msgType' => 0,
'phone' => 18188888888,
'vars' => json_encode(['%code%' => 1234]),
];
......@@ -81,13 +78,13 @@ class SendcloudGatewayTest extends TestCase
'message' => '操作成功',
'result' => true,
'statusCode' => 200,
], $gateway->send(18188888888, $message, $config));
], $gateway->send(new PhoneNumber(18188888888), $message, $config));
$this->expectException(GatewayErrorException::class);
$this->expectExceptionCode(400);
$this->expectExceptionMessage('手机号不存在');
$gateway->send(18188888888, $message, $config);
$gateway->send(new PhoneNumber(18188888888), $message, $config);
}
public function testTimestampConfig()
......@@ -121,8 +118,8 @@ class SendcloudGatewayTest extends TestCase
'message' => '操作成功',
'result' => true,
'statusCode' => 200,
], $gateway->send(18188888888, $message, $config));
], $gateway->send(new PhoneNumber(18188888888), $message, $config));
$gateway->send(18188888888, $message, $config);
$gateway->send(new PhoneNumber(18188888888), $message, $config);
}
}
......@@ -14,16 +14,12 @@ namespace Overtrue\EasySms\Tests\Gateways;
use Overtrue\EasySms\Exceptions\GatewayErrorException;
use Overtrue\EasySms\Gateways\SubmailGateway;
use Overtrue\EasySms\Message;
use Overtrue\EasySms\PhoneNumber;
use Overtrue\EasySms\Support\Config;
use Overtrue\EasySms\Tests\TestCase;
class SubmailGatewayTest extends TestCase
{
public function testGetName()
{
$this->assertSame('submail', (new SubmailGateway([]))->getName());
}
public function testSend()
{
$config = [
......@@ -37,7 +33,7 @@ class SubmailGatewayTest extends TestCase
'appid' => 'mock-app-id',
'signature' => 'mock-app-key',
'project' => 'mock-project',
'to' => 18188888888,
'to' => new PhoneNumber(18188888888),
'vars' => json_encode(['code' => '123456', 'time' => '15']),
])->andReturn([
'status' => 'success',
......@@ -58,12 +54,12 @@ class SubmailGatewayTest extends TestCase
'send_id' => '093c0a7df143c087d6cba9cdf0cf3738',
'fee' => 1,
'sms_credits' => 14197,
], $gateway->send(18188888888, $message, $config));
], $gateway->send(new PhoneNumber(18188888888), $message, $config));
$this->expectException(GatewayErrorException::class);
$this->expectExceptionCode(100);
$this->expectExceptionMessage('mock-err-msg');
$gateway->send(18188888888, $message, $config);
$gateway->send(new PhoneNumber(18188888888), $message, $config);
}
}
......@@ -13,16 +13,12 @@ namespace Overtrue\EasySms\Tests\Gateways;
use Overtrue\EasySms\Gateways\TwilioGateway;
use Overtrue\EasySms\Message;
use Overtrue\EasySms\PhoneNumber;
use Overtrue\EasySms\Support\Config;
use Overtrue\EasySms\Tests\TestCase;
class TwilioGatewayTest extends TestCase
{
public function testGetName()
{
$this->assertSame('twilio', (new TwilioGateway([]))->getName());
}
public function testSend()
{
$config = [
......@@ -51,6 +47,6 @@ class TwilioGatewayTest extends TestCase
'body' => '【twilio】This is a test message.',
'sid' => 'mock-api-account-sid',
'error_code' => null,
], $gateway->send('+8618888888888', $message, $config));
], $gateway->send(new PhoneNumber(18888888888, 86), $message, $config));
}
}
......@@ -14,16 +14,12 @@ namespace Overtrue\EasySms\Tests\Gateways;
use Overtrue\EasySms\Exceptions\GatewayErrorException;
use Overtrue\EasySms\Gateways\YunpianGateway;
use Overtrue\EasySms\Message;
use Overtrue\EasySms\PhoneNumber;
use Overtrue\EasySms\Support\Config;
use Overtrue\EasySms\Tests\TestCase;
class YunpianGatewayTest extends TestCase
{
public function testGetName()
{
$this->assertSame('yunpian', (new YunpianGateway([]))->getName());
}
public function testSend()
{
$config = [
......@@ -33,7 +29,7 @@ class YunpianGatewayTest extends TestCase
$gateway->shouldReceive('post')->with('https://sms.yunpian.com/v2/sms/single_send.json', [
'apikey' => 'mock-api-key',
'mobile' => 18188888888,
'mobile' => '18188888888',
'text' => '【overtrue】This is a test message.',
])->andReturn([
'code' => 0,
......@@ -41,7 +37,7 @@ class YunpianGatewayTest extends TestCase
'count' => 1, //成功发送的短信计费条数
'fee' => 0.05, //扣费条数,70个字一条,超出70个字时按每67字一条计
'unit' => 'RMB', // 计费单位
'mobile' => '13200000000', // 发送手机号
'mobile' => '18188888888', // 发送手机号
'sid' => 3310228982, // 短信ID
], [
'code' => 100,
......@@ -56,14 +52,14 @@ class YunpianGatewayTest extends TestCase
'count' => 1, //成功发送的短信计费条数
'fee' => 0.05, //扣费条数,70个字一条,超出70个字时按每67字一条计
'unit' => 'RMB', // 计费单位
'mobile' => '13200000000', // 发送手机号
'mobile' => '18188888888', // 发送手机号
'sid' => 3310228982, // 短信ID
], $gateway->send(18188888888, $message, $config));
], $gateway->send(new PhoneNumber(18188888888), $message, $config));
$this->expectException(GatewayErrorException::class);
$this->expectExceptionCode(100);
$this->expectExceptionMessage('发送失败');
$gateway->send(18188888888, $message, $config);
$gateway->send(new PhoneNumber(18188888888), $message, $config);
}
}
......@@ -14,16 +14,12 @@ namespace Overtrue\EasySms\Tests\Gateways;
use Overtrue\EasySms\Exceptions\GatewayErrorException;
use Overtrue\EasySms\Gateways\YuntongxunGateway;
use Overtrue\EasySms\Message;
use Overtrue\EasySms\PhoneNumber;
use Overtrue\EasySms\Support\Config;
use Overtrue\EasySms\Tests\TestCase;
class YuntongxunGatewayTest extends TestCase
{
public function testGetName()
{
$this->assertSame('yuntongxun', (new YuntongxunGateway([]))->getName());
}
public function testSend()
{
$config = [
......@@ -42,7 +38,7 @@ class YuntongxunGatewayTest extends TestCase
}),
\Mockery::on(function ($params) {
return $params['json'] == [
'to' => 18188888888,
'to' => '18188888888',
'templateId' => 5589,
'appId' => 'mock-app-id',
'datas' => ['mock-data-1', 'mock-data-2'],
......@@ -61,12 +57,12 @@ class YuntongxunGatewayTest extends TestCase
$this->assertSame([
'statusCode' => YuntongxunGateway::SUCCESS_CODE,
], $gateway->send(18188888888, $message, $config));
], $gateway->send(new PhoneNumber(18188888888), $message, $config));
$this->expectException(GatewayErrorException::class);
$this->expectExceptionCode(100);
$this->expectExceptionMessage('100');
$gateway->send(18188888888, $message, $config);
$gateway->send(new PhoneNumber(18188888888), $message, $config);
}
}
<?php
/*
* This file is part of the overtrue/easy-sms.
*
* (c) overtrue <i@overtrue.me>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
namespace Overtrue\EasySms\Tests;
use Overtrue\EasySms\PhoneNumber;
/**
* Class PhoneNumberTest.
*
* @author overtrue <i@overtrue.me>
*/
class PhoneNumberTest extends TestCase
{
public function testOnlyNumber()
{
$n = new PhoneNumber(18888888888);
$this->assertSame(18888888888, $n->getNumber());
$this->assertNull($n->getIDDCode());
$this->assertSame('18888888888', $n->getUniversalNumber());
$this->assertSame('18888888888', $n->getZeroPrefixedNumber());
$this->assertSame('18888888888', \strval($n));
}
public function testDiffCode()
{
$n = new PhoneNumber(18888888888, 68);
$this->assertSame(68, $n->getIDDCode());
$n = new PhoneNumber(18888888888, '+68');
$this->assertSame(68, $n->getIDDCode());
$n = new PhoneNumber(18888888888, '0068');
$this->assertSame(68, $n->getIDDCode());
}
public function testJsonEncode()
{
$n = new PhoneNumber(18888888888, 68);
$this->assertSame(json_encode(['number' => $n->getUniversalNumber()]), \json_encode(['number' => $n]));
}
}
......@@ -12,9 +12,8 @@
namespace Overtrue\EasySms\Tests;
use Mockery;
use PHPUnit\Framework\TestCase as PHPUnitTestCase;
class TestCase extends PHPUnitTestCase
class TestCase extends \PHPUnit\Framework\TestCase
{
public function setUp()
{
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册