feat(sms): align provider and verification flow
This commit is contained in:
@@ -10,45 +10,43 @@ defined('ABSPATH') || exit;
|
||||
class SMSProviderAliyun implements ProviderInterface {
|
||||
|
||||
public function get_key(): string {
|
||||
return 'aliyun';
|
||||
}
|
||||
|
||||
public function get_label(): string {
|
||||
return __('阿里云短信', 'aksrt');
|
||||
return 'ali';
|
||||
}
|
||||
|
||||
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';
|
||||
if (empty($config['sms_ali_keyid'])) $missing[] = 'sms_ali_keyid';
|
||||
if (empty($config['sms_ali_keysecret'])) $missing[] = 'sms_ali_keysecret';
|
||||
if (empty($config['sms_ali_sign_name'])) $missing[] = 'sms_ali_sign_name';
|
||||
if (($config['sms_ali_api_type'] ?? 'sms') !== 'verify' && empty($config['sms_ali_template_code'])) {
|
||||
$missing[] = 'sms_ali_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'] ?? '');
|
||||
$access_key = (string) ($config['sms_ali_keyid'] ?? '');
|
||||
$access_secret = (string) ($config['sms_ali_keysecret'] ?? '');
|
||||
$sign_name = (string) ($config['sms_ali_sign_name'] ?? '');
|
||||
$region_id = (string) ($config['sms_region_id'] ?? 'cn-hangzhou');
|
||||
$verify_api = ($config['sms_ali_api_type'] ?? 'sms') === 'verify';
|
||||
$action = $verify_api ? 'SendSmsVerifyCode' : 'SendSms';
|
||||
$params = [
|
||||
($verify_api ? 'PhoneNumber' : 'PhoneNumbers') => $phone,
|
||||
'SignName' => $sign_name,
|
||||
'TemplateCode' => $verify_api ? '100001' : (string) ($config['sms_ali_template_code'] ?? ''),
|
||||
'TemplateParam' => wp_json_encode($verify_api ? ['code' => $code, 'min' => '30'] : ['code' => $code]),
|
||||
];
|
||||
$domain = $verify_api ? 'dypnsapi.aliyuncs.com' : 'dysmsapi.aliyuncs.com';
|
||||
|
||||
$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);
|
||||
$result = $this->request($access_key, $access_secret, $region_id, $domain, $action, $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')) {
|
||||
if (($verify_api && ($result['Code'] ?? '') === 'OK') || (!$verify_api && (!empty($result['BizId']) || ($result['Code'] ?? '') === 'OK'))) {
|
||||
$this->log('sent', $phone, 'OK');
|
||||
return ['success' => true, 'message' => __('验证码已发送', 'aksrt'), 'transport' => 'signed_post'];
|
||||
}
|
||||
@@ -64,8 +62,8 @@ class SMSProviderAliyun implements ProviderInterface {
|
||||
return [
|
||||
'provider' => $this->get_key(),
|
||||
'configured' => empty($missing),
|
||||
'available' => !empty($config['sms_enabled']) && empty($missing),
|
||||
'verified' => !empty($config['sms_aliyun_verified']),
|
||||
'available' => ($config['sms_sdk'] ?? 'null') === $this->get_key() && empty($missing),
|
||||
'verified' => false,
|
||||
'transport' => 'signed_post',
|
||||
'missing_fields' => $missing,
|
||||
];
|
||||
@@ -81,7 +79,7 @@ class SMSProviderAliyun implements ProviderInterface {
|
||||
*
|
||||
* @return array|\WP_Error
|
||||
*/
|
||||
private function request(string $access_key, string $access_secret, string $region_id, array $biz_params) {
|
||||
private function request(string $access_key, string $access_secret, string $region_id, string $domain, string $action, array $biz_params) {
|
||||
if (!class_exists('AKSRT\\Sms\\SMSSignatureHelper')) {
|
||||
return new \WP_Error('sms_helper_missing', '签名助手类未加载');
|
||||
}
|
||||
@@ -91,10 +89,10 @@ class SMSProviderAliyun implements ProviderInterface {
|
||||
return $helper->request(
|
||||
$access_key,
|
||||
$access_secret,
|
||||
'dysmsapi.aliyuncs.com',
|
||||
$domain,
|
||||
array_merge($biz_params, [
|
||||
'RegionId' => $region_id,
|
||||
'Action' => 'SendSms',
|
||||
'Action' => $action,
|
||||
'Version' => '2017-05-25',
|
||||
]),
|
||||
true // HTTPS
|
||||
|
||||
Reference in New Issue
Block a user