如何使用ThinkPHP实现微信红包封面定制,素材上传及审核状态查询教程?
- 内容介绍
- 文章标签
- 相关推荐
本文共计880个文字,预计阅读时间需要4分钟。
ThinkPHP 无法直接调用,请确保正确配置或使用方法。
为什么 thinkphp 自带的 wechat 扩展完全不适用
微信红包封面开放平台(cover.weixin.qq.com)的接口和公众号/支付/小程序 API 是隔离的:
- 认证主体必须是已通过微信认证的企业主体(个体户、未认证企业均不可用)
- 所有请求必须使用
POST+application/json,且Authorization头为HMAC-SHA256签名,非简单 access_token - 接口域名是
https://api.cover.weixin.qq.com,不是api.weixin.qq.com - ThinkPHP 的
think-wechat或easywechat均未接入该平台,强行复用会导致401 Unauthorized或404 Not Found
如何在 ThinkPHP 项目中安全调用封面平台接口
你需要自己实现签名逻辑,并用 curl 或 GuzzleHttp\Client 发起请求。关键点:
- 从微信红包封面后台「开发配置」页获取
app_id、secret_key(注意:不是公众号 appid,是封面平台分配的独立密钥) - 签名参数必须包含:
app_id、timestamp(秒级)、nonce_str(随机字符串)、http_method、canonical_uri(如/v1/asset/upload)、canonical_query_string(空字符串)、canonical_headers(content-type:application/json换行拼接)、payload_hash(请求体 SHA256) - 最终签名值 =
HMAC-SHA256( secret_key, signing_string ),再 Base64 编码 - 推荐用
GuzzleHttp\Client,避免手动处理 header 和 body 编码问题;不要用file_get_contents或curl_setopt_array硬写
示例片段(上传封面图):
立即学习“PHP免费学习笔记(深入)”;
$client = new \GuzzleHttp\Client(); $uri = 'https://api.cover.weixin.qq.com/v1/asset/upload'; $boundary = uniqid('----'); $body = "--{$boundary}\r\nContent-Disposition: form-data; name=\"file\"; filename=\"cover.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n" . file_get_contents($localPath) . "\r\n--{$boundary}--\r\n"; $signature = $this->buildCoverSignature('POST', '/v1/asset/upload', '', $body); $response = $client->request('POST', $uri, [ 'headers' => [ 'Authorization' => "HMAC-SHA256 {$signature}", 'X-WX-APPID' => config('cover.app_id'), 'Content-Type' => "multipart/form-data; boundary={$boundary}", ], 'body' => $body, ]);
审核状态查询容易返回 400 Bad Request 的三个原因
调用 /v1/audit/status 查审核结果时,失败往往不是网络或 token 问题,而是:
-
asset_id必须是上传成功后响应里的data.asset_id,不是文件名、本地路径或自增 ID - 请求体必须为空 JSON
{},不能传asset_id在 body 里(它走 query 参数),否则报invalid parameter - 微信审核有延迟,刚上传完立刻查会返回
"status": 0(待审核),但若 30 分钟后仍是 0,大概率是上传时file字段没按 multipart 正确构造,导致后台根本没存 asset
真正卡住的地方从来不是 ThinkPHP 框架本身,而是签名串生成时大小写、换行符、空格、header 排序顺序稍有偏差,就会被平台静默拒绝——建议把签名生成逻辑单独抽成单元测试,用平台提供的「签名调试工具」比对输出。
本文共计880个文字,预计阅读时间需要4分钟。
ThinkPHP 无法直接调用,请确保正确配置或使用方法。
为什么 thinkphp 自带的 wechat 扩展完全不适用
微信红包封面开放平台(cover.weixin.qq.com)的接口和公众号/支付/小程序 API 是隔离的:
- 认证主体必须是已通过微信认证的企业主体(个体户、未认证企业均不可用)
- 所有请求必须使用
POST+application/json,且Authorization头为HMAC-SHA256签名,非简单 access_token - 接口域名是
https://api.cover.weixin.qq.com,不是api.weixin.qq.com - ThinkPHP 的
think-wechat或easywechat均未接入该平台,强行复用会导致401 Unauthorized或404 Not Found
如何在 ThinkPHP 项目中安全调用封面平台接口
你需要自己实现签名逻辑,并用 curl 或 GuzzleHttp\Client 发起请求。关键点:
- 从微信红包封面后台「开发配置」页获取
app_id、secret_key(注意:不是公众号 appid,是封面平台分配的独立密钥) - 签名参数必须包含:
app_id、timestamp(秒级)、nonce_str(随机字符串)、http_method、canonical_uri(如/v1/asset/upload)、canonical_query_string(空字符串)、canonical_headers(content-type:application/json换行拼接)、payload_hash(请求体 SHA256) - 最终签名值 =
HMAC-SHA256( secret_key, signing_string ),再 Base64 编码 - 推荐用
GuzzleHttp\Client,避免手动处理 header 和 body 编码问题;不要用file_get_contents或curl_setopt_array硬写
示例片段(上传封面图):
立即学习“PHP免费学习笔记(深入)”;
$client = new \GuzzleHttp\Client(); $uri = 'https://api.cover.weixin.qq.com/v1/asset/upload'; $boundary = uniqid('----'); $body = "--{$boundary}\r\nContent-Disposition: form-data; name=\"file\"; filename=\"cover.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n" . file_get_contents($localPath) . "\r\n--{$boundary}--\r\n"; $signature = $this->buildCoverSignature('POST', '/v1/asset/upload', '', $body); $response = $client->request('POST', $uri, [ 'headers' => [ 'Authorization' => "HMAC-SHA256 {$signature}", 'X-WX-APPID' => config('cover.app_id'), 'Content-Type' => "multipart/form-data; boundary={$boundary}", ], 'body' => $body, ]);
审核状态查询容易返回 400 Bad Request 的三个原因
调用 /v1/audit/status 查审核结果时,失败往往不是网络或 token 问题,而是:
-
asset_id必须是上传成功后响应里的data.asset_id,不是文件名、本地路径或自增 ID - 请求体必须为空 JSON
{},不能传asset_id在 body 里(它走 query 参数),否则报invalid parameter - 微信审核有延迟,刚上传完立刻查会返回
"status": 0(待审核),但若 30 分钟后仍是 0,大概率是上传时file字段没按 multipart 正确构造,导致后台根本没存 asset
真正卡住的地方从来不是 ThinkPHP 框架本身,而是签名串生成时大小写、换行符、空格、header 排序顺序稍有偏差,就会被平台静默拒绝——建议把签名生成逻辑单独抽成单元测试,用平台提供的「签名调试工具」比对输出。

