初始化项目:添加后端代码、ThinkPHP框架、前端资源

This commit is contained in:
amb
2026-09-03 12:42:39 +08:00
commit 482bece22e
3726 changed files with 416708 additions and 0 deletions
+181
View File
@@ -0,0 +1,181 @@
<?php
namespace addons\hwsms\library;
use fast\Http;
/**
* 华为云短信类
*/
class Hwsms
{
private $_params = [];
public $error = '';
protected $config = [];
protected static $instance;
public function __construct($options = [])
{
if ($config = \app\common\model\config\System::getConfig('hwsms')) {
$this->config = array_merge($this->config, $config);
}
$this->config = array_merge($this->config, is_array($options) ? $options : []);
}
/**
* 单例
* @param array $options 参数
* @return Hwsms
*/
public static function instance($options = [])
{
if (is_null(self::$instance)) {
self::$instance = new static($options);
}
return self::$instance;
}
/**
* 设置签名
* @param string $sign
* @return Hwsms
*/
public function sign($sign = '')
{
$this->_params['signature'] = $sign;
return $this;
}
/**
* 设置参数
* @param array $param
* @return Hwsms
*/
public function param(array $param = [])
{
foreach ($param as $k => &$v) {
$v = (string)$v;
}
unset($v);
if ($param) {
$this->_params['templateParas'] = json_encode(array_values($param));
}
return $this;
}
/**
* 设置模板
* @param string $code 短信模板
* @return Hwsms
*/
public function template($code = '')
{
$this->_params['templateId'] = $code;
return $this;
}
/**
* 接收手机
* @param string $mobile 手机号码
* @return Hwsms
*/
public function mobile($mobile = '')
{
$this->_params['to'] = $mobile;
return $this;
}
/**
* 发送方
* @param string $code 国内短信填写为短信平台为短信签名分配的通道号码
* @return Hwsms
*/
public function from($code = '')
{
$this->_params['from'] = $code;
return $this;
}
/**
* 立即发送
* @return boolean
*/
public function send()
{
$this->error = '';
$params = $this->_params();
$headers = [
'Content-Type: application/x-www-form-urlencoded',
'Authorization: WSSE realm="SDP",profile="UsernameToken",type="Appkey"',
'X-WSSE: ' . $this->buildWsseHeader()
];
$data = http_build_query($params);
$context_options = [
'http' => ['method' => 'POST', 'header'=> $headers, 'content' => $data, 'ignore_errors' => true],
'ssl' => ['verify_peer' => false, 'verify_peer_name' => false] //为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题
];
$response = file_get_contents($this->config['app_url'].'/sms/batchSendSms/v1', false, stream_context_create($context_options));
$ret = json_decode($response);
if ($ret->result) {
if (isset($ret->code) && $ret->code == '000000') {
return true;
}
$this->error = isset($res->code) ? $res->code : 'Invalid result';
} else {
$this->error = 'Network error';
}
if (config('app_debug')) {
\think\Log::record('hwsms:' . $this->error);
}
return false;
}
/**
* 获取错误信息
* @return string
*/
public function getError()
{
return $this->error;
}
/**
* 获取发送的参数信息
* @return array
*/
private function _params()
{
$params = array_merge([
'signature' => isset($this->config['sign']) ? $this->config['sign'] : '',
'from' => isset($this->config['sender']) ? $this->config['sender'] : '',
], $this->_params);
if (isset($params['to']) && $params['to']) {
$toArr = explode(',', $params['to']);
foreach ($toArr as $index => &$item) {
if (substr($item, 0, 1) !== '+') {
$item = '+86' . $item;
}
}
$params['to'] = implode(',', $toArr);
}
return $params;
}
/**
* 构造X-WSSE参数值
* @return string
*/
function buildWsseHeader()
{
$now = date('Y-m-d\TH:i:s\Z'); //Created
$nonce = uniqid(); //Nonce
$base64 = base64_encode(hash('sha256', ($nonce . $now . $this->config['secret'])));
return sprintf("UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s\"", $this->config['key'], $base64, $nonce, $now);
}
}