- assets/vendor 全量迁移: fontawesome5→assets/fontawesome5, css→assets/css, js→assets/js/runtime(避开 14 个同名自有文件), img 合并去重→assets/img, fonts→assets/fonts; 删除 assets/vendor - libs 五个与 widgets/third-party 字节相同的库不重复入库, loader paths 改指向 - 运行时切换: _win.uri=assets 根, loader baseUrl=/js/runtime, enlighter 注入 路径同步; PHP 7 个引用文件切换并改名 $zibll_*→$runtime_* - 去品牌: Qinver 头注释/品牌 console.log/演示链接清除, 默认文案中性化 - 功能标识符改名: zib__→aksrt__, zib_ajax→aksrt_ajax, window.zib→ window.aksrtLegacy, zibllblock/*→aksrtblock/*, .zib-widget→.aksrt-panel, .zib-slider→.aksrt-slider, zib_menu_options meta 键等 - 自有 CSS 改名: legacy-utilities/compat-vars/footer shell - admin SPA 重建; 契约测试同步(路径/断言/文件更名) - 例外保留: tests/visual 对照环境与 fixtures 前缀(外部 Zibll 产品引用) 验证: php -l 133 个改动文件通过; runtime 86 个 JS node --check 通过; 契约测试 68/70(2 个失败经 stash 对照确认为存量问题)
110 lines
4.1 KiB
PHP
110 lines
4.1 KiB
PHP
<?php
|
|
/**
|
|
* @package AKSRT
|
|
*/
|
|
|
|
namespace AKSRT\Sms;
|
|
|
|
defined('ABSPATH') || exit;
|
|
|
|
class SMSProviderAliyun implements ProviderInterface {
|
|
|
|
public function get_key(): string {
|
|
return 'aliyun';
|
|
}
|
|
|
|
public function get_label(): string {
|
|
return __('阿里云短信', 'aksrt');
|
|
}
|
|
|
|
public function validate_config(array $config): array {
|
|
$missing = [];
|
|
if (empty($config['sms_access_key'])) $missing[] = 'sms_access_key';
|
|
if (empty($config['sms_access_secret'])) $missing[] = 'sms_access_secret';
|
|
if (empty($config['sms_sign_name'])) $missing[] = 'sms_sign_name';
|
|
if (empty($config['sms_template_code'])) $missing[] = 'sms_template_code';
|
|
return $missing;
|
|
}
|
|
|
|
public function send_code(string $phone, string $code, array $config): array {
|
|
$access_key = (string) ($config['sms_access_key'] ?? '');
|
|
$access_secret = (string) ($config['sms_access_secret'] ?? '');
|
|
$sign_name = (string) ($config['sms_sign_name'] ?? '');
|
|
$template_code = (string) ($config['sms_template_code'] ?? '');
|
|
$region_id = (string) ($config['sms_region_id'] ?? 'cn-hangzhou');
|
|
|
|
$params = [
|
|
'PhoneNumbers' => $phone,
|
|
'SignName' => $sign_name,
|
|
'TemplateCode' => $template_code,
|
|
'TemplateParam' => wp_json_encode(['code' => $code]),
|
|
];
|
|
|
|
$result = $this->request($access_key, $access_secret, $region_id, $params);
|
|
|
|
if (is_wp_error($result)) {
|
|
$this->log('error', $phone, $result->get_error_message());
|
|
return ['success' => false, 'message' => $result->get_error_message(), 'transport' => 'signed_post'];
|
|
}
|
|
|
|
// 对齐 legacy 成功判断:检查 BizId 或 Code === 'OK'
|
|
if (!empty($result['BizId']) || (isset($result['Code']) && $result['Code'] === 'OK')) {
|
|
$this->log('sent', $phone, 'OK');
|
|
return ['success' => true, 'message' => __('验证码已发送', 'aksrt'), 'transport' => 'signed_post'];
|
|
}
|
|
|
|
$err_code = $result['Code'] ?? 'Unknown';
|
|
$err_msg = $result['Message'] ?? __('未知错误', 'aksrt');
|
|
$this->log('error', $phone, "{$err_code}: {$err_msg}");
|
|
return ['success' => false, 'message' => sprintf('阿里云: %s (%s)', $err_msg, $err_code), 'transport' => 'signed_post'];
|
|
}
|
|
|
|
public function get_status(array $config): array {
|
|
$missing = $this->validate_config($config);
|
|
return [
|
|
'provider' => $this->get_key(),
|
|
'configured' => empty($missing),
|
|
'available' => !empty($config['sms_enabled']) && empty($missing),
|
|
'verified' => !empty($config['sms_aliyun_verified']),
|
|
'transport' => 'signed_post',
|
|
'missing_fields' => $missing,
|
|
];
|
|
}
|
|
|
|
/**
|
|
* 发送阿里云短信 API 请求(POST 方式)
|
|
*
|
|
* 对齐 legacy 的 SignatureHelper 实现:
|
|
* - POST 到 https://dysmsapi.aliyuncs.com/
|
|
* - body 为 Signature=xxx&Key=Value&... 格式
|
|
* - 使用 x-sdk-client header
|
|
*
|
|
* @return array|\WP_Error
|
|
*/
|
|
private function request(string $access_key, string $access_secret, string $region_id, array $biz_params) {
|
|
if (!class_exists('AKSRT\\Sms\\SMSSignatureHelper')) {
|
|
return new \WP_Error('sms_helper_missing', '签名助手类未加载');
|
|
}
|
|
|
|
$helper = new SMSSignatureHelper();
|
|
|
|
return $helper->request(
|
|
$access_key,
|
|
$access_secret,
|
|
'dysmsapi.aliyuncs.com',
|
|
array_merge($biz_params, [
|
|
'RegionId' => $region_id,
|
|
'Action' => 'SendSms',
|
|
'Version' => '2017-05-25',
|
|
]),
|
|
true // HTTPS
|
|
);
|
|
}
|
|
|
|
private function log(string $level, string $phone, string $message): void {
|
|
if (!defined('WP_DEBUG') || !WP_DEBUG) return;
|
|
$masked = substr($phone, 0, 3) . '****' . substr($phone, -4);
|
|
error_log(sprintf('[AKSRT SMS] [aliyun] [%s] Phone: %s — %s', $level, $masked, $message));
|
|
}
|
|
}
|