You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
165 lines
4.7 KiB
165 lines
4.7 KiB
<?php
|
|
|
|
namespace app\sms\drivers;
|
|
|
|
use app\sms\contracts\SmsDriverInterface;
|
|
use GuzzleHttp\Client;
|
|
|
|
class WorldSmsDriver implements SmsDriverInterface
|
|
{
|
|
protected $config;
|
|
protected $client;
|
|
|
|
public function __construct(array $config)
|
|
{
|
|
$this->config = $config;
|
|
$this->client = new Client([
|
|
'base_uri' => rtrim($this->config['host'], '/') . '/',
|
|
'timeout' => 5.0,
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* 发送短信
|
|
* @param string $mobile 手机号(多个用逗号分隔)
|
|
* @param string $templateId 未使用模板可留空
|
|
* @param array $data ['content' => '短信内容']
|
|
* @return array
|
|
*/
|
|
public function send(string $mobile, string $templateId = '', array $data = []): array
|
|
{
|
|
$url = 'sendsms';
|
|
$body = [
|
|
'account' => $this->config['account'],
|
|
'password' => $this->config['password'],
|
|
'numbers' => $mobile,
|
|
'smstype' => $data['smstype'] ?? 0,
|
|
'sender' => $data['title'] ?? '',
|
|
'content' => $data['content'] ?? '',
|
|
];
|
|
try {
|
|
$response = $this->client->request('POST', $url, [
|
|
'headers' => [
|
|
'Content-Type' => 'application/json;charset=utf-8'
|
|
],
|
|
'body' => json_encode($body, JSON_UNESCAPED_UNICODE),
|
|
]);
|
|
$result = json_decode($response->getBody()->getContents(), true);
|
|
|
|
return [
|
|
'success' => $result['status'] === 0,
|
|
'data' => $result,
|
|
'msg' => $result['status'] === 0 ? '发送成功' : '发送失败',
|
|
];
|
|
} catch (\Throwable $e) {
|
|
|
|
return [
|
|
'success' => false,
|
|
'msg' => '请求失败:' . $e->getMessage(),
|
|
'data' => [],
|
|
];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 查询余额
|
|
*/
|
|
public function getBalance(): array
|
|
{
|
|
$url = 'getbalance';
|
|
$body = [
|
|
'version' => '3.4',
|
|
'account' => $this->config['account'],
|
|
'password' => $this->config['password'],
|
|
];
|
|
|
|
return $this->getJson($url, $body);
|
|
}
|
|
|
|
/**
|
|
* 查询短信状态(单条)
|
|
*/
|
|
public function getStatus(string $msgid): array
|
|
{
|
|
$url = 'getstatus';
|
|
$body = [
|
|
'account' => $this->config['account'],
|
|
'password' => $this->config['password'],
|
|
'msgid' => $msgid,
|
|
];
|
|
|
|
return $this->getJson($url, $body);
|
|
}
|
|
|
|
/**
|
|
* 获取接收短信
|
|
*/
|
|
public function getInbox(): array
|
|
{
|
|
$url = 'getinbox';
|
|
$body = [
|
|
'account' => $this->config['account'],
|
|
'password' => $this->config['password'],
|
|
];
|
|
|
|
return $this->getJson($url, $body);
|
|
}
|
|
|
|
/**
|
|
* 通用 POST 请求
|
|
*/
|
|
protected function postJson(string $url, array $body): array
|
|
{
|
|
try {
|
|
$response = $this->client->post($url, [
|
|
'headers' => [
|
|
'Content-Type' => 'application/json;charset=utf-8',
|
|
],
|
|
'json' => $body,
|
|
]);
|
|
|
|
$result = json_decode($response->getBody()->getContents(), true);
|
|
|
|
return [
|
|
'success' => $result['status'] === 0,
|
|
'msg' => $result['status'] === 0 ? '操作成功' : ($result['message'] ?? '失败'),
|
|
'data' => $result,
|
|
];
|
|
} catch (\Throwable $e) {
|
|
return [
|
|
'success' => false,
|
|
'msg' => '请求异常: ' . $e->getMessage(),
|
|
'data' => [],
|
|
];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 通用 GET 请求
|
|
*/
|
|
protected function getJson(string $url, array $query = []): array
|
|
{
|
|
try {
|
|
$response = $this->client->get($url, [
|
|
'headers' => [
|
|
'Accept' => 'application/json',
|
|
],
|
|
'query' => $query,
|
|
]);
|
|
|
|
$result = json_decode($response->getBody()->getContents(), true);
|
|
|
|
return [
|
|
'success' => $result['status'] === 0,
|
|
'msg' => $result['status'] === 0 ? '操作成功' : ($result['message'] ?? '失败'),
|
|
'data' => $result,
|
|
];
|
|
} catch (\Throwable $e) {
|
|
return [
|
|
'success' => false,
|
|
'msg' => '请求异常: ' . $e->getMessage(),
|
|
'data' => [],
|
|
];
|
|
}
|
|
}
|
|
}
|
|
|