p2 project
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

<?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' => [],
];
}
}
}