fix(user-center): embed official certification panel

This commit is contained in:
2026-07-28 15:22:09 +08:00
parent d3bf75fbea
commit 0a04c3e4cc
22 changed files with 415 additions and 461 deletions
+41 -30
View File
@@ -56,6 +56,12 @@ class AuthApply {
}
$types[] = ['slug' => $slug, 'label' => (string) $label];
}
if ($types === []) {
$types = [
['slug' => 'real_name', 'label' => __('实名认证', 'aksrt')],
['slug' => 'organization', 'label' => __('企业认证', 'aksrt')],
];
}
return [
'enabled' => $enabled,
'allow_apply' => !isset($all['user_verify_allow_apply']) || !empty($all['user_verify_allow_apply']),
@@ -95,6 +101,13 @@ class AuthApply {
return is_array($apply) ? $apply : [];
}
public static function evidence_src(string $value): string {
if (preg_match('#^data:image/(?:jpeg|png|gif|webp);base64,[A-Za-z0-9+/=]+$#', $value)) {
return $value;
}
return esc_url_raw($value);
}
public function ajax_apply(): void {
if (!is_user_logged_in()) {
wp_send_json(['error' => 1, 'msg' => __('请先登录', 'aksrt')]);
@@ -133,8 +146,9 @@ class AuthApply {
$msg = isset($_POST['msg']) ? sanitize_textarea_field(wp_unslash((string) $_POST['msg'])) : '';
$type = isset($_POST['type']) ? sanitize_key((string) wp_unslash($_POST['type'])) : '';
$allowed_types = array_column((array) $s['types'], 'slug');
if ($name === '') {
wp_send_json(['error' => 1, 'msg' => __('请填写认证身份名称', 'aksrt')]);
$name_length = function_exists('mb_strlen') ? mb_strlen($name) : strlen($name);
if ($name_length < 4 || $name_length > 16) {
wp_send_json(['error' => 1, 'msg' => __('认证身份长度需在 4-16 个字符之间', 'aksrt')]);
}
if ($type === '' || !in_array($type, $allowed_types, true)) {
wp_send_json(['error' => 1, 'msg' => __('请选择有效的认证类型', 'aksrt')]);
@@ -142,46 +156,43 @@ class AuthApply {
$images = [];
if (!empty($_FILES['image']['name'])) {
require_once ABSPATH . 'wp-admin/includes/file.php';
require_once ABSPATH . 'wp-admin/includes/media.php';
require_once ABSPATH . 'wp-admin/includes/image.php';
$files = $_FILES['image'];
// Normalize multi-file upload.
$names = $files['name'];
if (!is_array($names)) {
$names = [$names];
$tmp = [
$names = is_array($files['name']) ? $files['name'] : [$files['name']];
if (!is_array($files['name'])) {
$files = [
'name' => $names,
'type' => [$files['type']],
'tmp_name' => [$files['tmp_name']],
'error' => [$files['error']],
'size' => [$files['size']],
];
$files = $tmp;
}
$count = min(3, count($files['name']));
for ($i = 0; $i < $count; $i++) {
if (empty($files['name'][$i]) || (int) $files['error'][$i] !== UPLOAD_ERR_OK) {
if (count($files['name']) > 3) {
wp_send_json(['error' => 1, 'msg' => __('证明材料最多上传 3 张', 'aksrt')]);
}
foreach ($files['name'] as $index => $filename) {
if ($filename === '') {
continue;
}
$file = [
'name' => $files['name'][$i],
'type' => $files['type'][$i],
'tmp_name' => $files['tmp_name'][$i],
'error' => $files['error'][$i],
'size' => $files['size'][$i],
];
$_FILES['aksrt_auth_img'] = $file;
$aid = media_handle_upload('aksrt_auth_img', 0);
if (!is_wp_error($aid)) {
$url = wp_get_attachment_url((int) $aid);
if ($url) {
$images[] = $url;
}
if ((int) ($files['error'][$index] ?? UPLOAD_ERR_NO_FILE) !== UPLOAD_ERR_OK) {
wp_send_json(['error' => 1, 'msg' => __('证明材料上传失败,请重新选择', 'aksrt')]);
}
$size = (int) ($files['size'][$index] ?? 0);
$tmp_name = (string) ($files['tmp_name'][$index] ?? '');
if ($size <= 0 || $size > 2 * MB_IN_BYTES || !is_uploaded_file($tmp_name)) {
wp_send_json(['error' => 1, 'msg' => __('单张证明图片不能超过 2MB', 'aksrt')]);
}
$file_check = wp_check_filetype_and_ext($tmp_name, (string) $filename);
$mime = (string) ($file_check['type'] ?? '');
if (!in_array($mime, ['image/jpeg', 'image/png', 'image/gif', 'image/webp'], true)) {
wp_send_json(['error' => 1, 'msg' => __('证明材料仅支持 JPG、PNG、GIF 或 WebP 图片', 'aksrt')]);
}
$bytes = file_get_contents($tmp_name);
if (!is_string($bytes) || $bytes === '') {
wp_send_json(['error' => 1, 'msg' => __('证明材料读取失败', 'aksrt')]);
}
$images[] = 'data:' . $mime . ';base64,' . base64_encode($bytes);
}
unset($_FILES['aksrt_auth_img']);
}
$payload = [