$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'; $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']; } 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']; } $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' => ($config['sms_sdk'] ?? 'null') === $this->get_key() && empty($missing), 'verified' => false, '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, string $domain, string $action, 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, $domain, array_merge($biz_params, [ 'RegionId' => $region_id, 'Action' => $action, '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)); } }