痛点分析
大文件网络传输慢:直传大文件导致HTTP连接长期挂起,耗尽服务器线程。
格式兼容问题:微信对特定格式(如未压缩的视频)无法直接识别。
重复上传带宽浪费:同一份产品手册发给100个客户,重复上传100次。
解决方案:URL模式 + 异步队列
底层API通常提供两种文件发送方式:二进制Base64编码上传和网络URL传参。强烈建议采用网络URL模式。您只需将文件托管在对象存储(OSS/COS)上,将URL传递给管理通道,由底层集群负责下载并推送至微信服务器。
架构设计与代码实现
Step 1: 业务层提交发送任务
业务系统产生发送需求(例如:用户索取电子书),仅向本地Redis队列推入一条元数据。
{ "task_id": "task_20260720_001", "robot_wxid": "wxid_robot_01", "to_wxid": "wxid_customer_88", "file_url": "https://cdn.mysite.com/books/manual.pdf", "file_name": "2026私域增长手册.pdf" }Step 2: 消费端异步调用发送API
import time import json import requests def send_file_worker(body): task = json.loads(body) api_url = "https://api.yourdomain.com/v2/message/send_file" payload = { "robot_wxid": task["robot_wxid"], "to_wxid": task["to_wxid"], "file_url": task["file_url"], "file_name": task["file_name"] # 必须带后缀,微信客户端展示用 } response = requests.post(api_url, json=payload, headers=headers) res_data = response.json() if res_data.get("code") == 200: print(f"任务 {task['task_id']} 发送成功") else: print(f"发送失败: {res_data.get('msg')}")生产环境踩坑经验
CDN域名防刷:传给接口的
file_url必须是公网可访问的。如果是私有云,可以生成一个带过期时间的签名URL。视频编码:发送视频时,必须确保为 H.264 编码的 MP4 格式,否则部分移动客户端会提示“无法播放”。
文件大小限制:严格遵循微信官方限制(通常视频在25MB以内最佳,文件在100MB以内),超大文件建议引导至网盘。