WordPress插件调用VK API发布社区墙帖时遇Error 15与100:图片上传失败问题求助
兄弟我之前踩过VK API的不少坑,尤其是群组token和参数格式这块,看了你的问题描述和日志,发现几个关键的问题点,给你梳理下解决方案:
1. 先解决Group ID格式错误(这是Error15的核心原因!)
看你的日志里有这么一行:CPA VK Construct: group_id #0000000,这说明你在插件设置里填写的群组ID带了#前缀(比如从VK社区URL复制了#123456),但代码里用intval($this->group_id)转换时,带#的字符串会被转成0——你想想,用无效的群组ID=0去调用VK API,肯定会触发Error15(权限不足),因为根本不存在这个群组!
解决办法:
- 要么在插件设置里直接填纯数字的群组ID(比如从社区URL的
club123456里提取123456); - 要么在代码里自动去掉#前缀,修改
__construct里的group_id赋值:
$this->group_id = ltrim($options['vk_group_id'] ?? '', '#'); // 先去掉# $this->group_id = intval($this->group_id); // 再转成整数
2. 验证群组Token的实际有效性
虽然你说生成token时勾选了photos和wall权限,但VK有时候会出现权限延迟、或者token与群组绑定错误的情况,建议你直接用VK官方的API调试器(在VK开发者后台里找)做个测试:
- 用你的
group_token调用photos.getWallUploadServer接口,参数只传group_id(纯数字,比如123456); - 如果调试器返回正常的
upload_url,说明token本身没问题;如果还是报错Error15,那你需要重新生成群组token:- 进入VK社区后台的「设置 -> API使用」;
- 确认绑定的应用是你开发用的那个;
- 重新勾选
photos和wall权限,生成新的token后替换到插件设置里。
3. 修正附件参数格式(解决Error100)
你的代码里,当图片上传失败时,直接把文章链接赋值给attachments参数:
$params['attachments'] = get_permalink($post);
这完全不符合VK API的要求!VK的attachments参数如果要传链接,格式必须是link=你的文章链接,直接传URL会被识别为无效附件,触发Error100(参数无效),也就是日志里的Violated: link_photo_sizing_rule. No photo given。
解决办法:
修改这段代码,改成正确的链接附件格式:
if (!empty($attachments)) { $params['attachments'] = implode(',', $attachments); } else { // 正确的链接附件格式:前缀link= + 编码后的URL $params['attachments'] = 'link=' . urlencode(get_permalink($post)); // 或者,如果你不需要传链接附件,干脆注释掉这行,只传message即可,避免触发错误 // unset($params['attachments']); }
4. 关于用户Token的必要性
根据VK官方文档,公开/封闭群组用群组Token完全可以完成图片上传到墙的操作,不需要用户Token——只要群组Token有photos和wall权限、group_id正确就行。只有当你的群组是私密类型时,才需要用拥有群组编辑权限的用户Token来上传图片。所以你现在的问题根本不需要切换到用户Token,先把前面的问题解决再说。
5. 其他细节检查
- 确认
download_image方法能正确下载文章的特色图,临时文件没有损坏、且PHP有读取权限; - 检查
upload_file_to_vk方法返回的photo、server、hash三个参数是否完整,这三个是调用photos.saveWallPhoto必须的,少一个都会导致上传失败; - 调用
wall.post时,owner_id必须是-群组ID(负号+纯数字),你的代码里-intval($this->group_id)是对的,这个没问题。
建议你先按顺序解决前3个问题,尤其是Group ID的格式错误,这是最核心的。解决后再测试插件,应该能解决Error15和Error100的问题。要是还有问题,把VK API调试器的测试结果或者更详细的日志贴出来,再进一步排查!




