事倍功半是蠢蛋 33 微信服务号推送消息demo
1.权限要交300块钱认证才能有客服推送权限 正常是xml发送回复 主动推要花钱解锁 在开发者工具那看
2.注意编码乱码问题 见demo
3.45017错误 推送消息不能过多 除非用户自己交互
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信推送消息Demo - 手动JSON序列化方法
demo用cursor写的但是经过手动认证确认有效
"""
import requests
import json
import time
class WechatPushDemo:
"""微信推送消息测试类"""
# !!!!!! !!!!! !!!!!!!!! change here
APP_ID = ""
# 手动添加appid
APP_SECRET = ""
def __init__(self):
self.access_token = None
self.token_expires_at = 0
def get_access_token(self):
"""获取access_token"""
try:
if self.access_token and time.time() < self.token_expires_at:
return self.access_token
url = "https://api.weixin.qq.com/cgi-bin/token"
params = {
"grant_type": "client_credential",
"appid": self.APP_ID,
"secret": self.APP_SECRET
}
print(f"正在获取access_token...")
response = requests.get(url, params=params, timeout=10)
result = response.json()
if "access_token" in result:
self.access_token = result["access_token"]
self.token_expires_at = time.time() + 7200 - 300
print(f"获取access_token成功: {self.access_token[:20]}...")
return self.access_token
else:
print(f"获取access_token失败: {result}")
return None
except Exception as e:
print(f"获取access_token异常: {str(e)}")
return None
def push_message(self, open_id: str, content: str):
"""推送消息 - 使用手动JSON序列化"""
try:
access_token = self.get_access_token()
if not access_token:
print("无法获取access_token")
return False
url = f"https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={access_token}"
message = {
"touser": open_id,
"msgtype": "text",
"text": {
"content": content
}
}
print("=" * 50)
print("发送的消息内容:")
print(f"URL: {url}")
print(f"Message: {json.dumps(message, ensure_ascii=False, indent=2)}")
print("=" * 50)
# 手动序列化JSON
json_data = json.dumps(message, ensure_ascii=False, separators=(',', ':'))
headers = {'Content-Type': 'application/json; charset=utf-8'}
print("正在发送请求...")
response = requests.post(url, data=json_data.encode('utf-8'), headers=headers, timeout=10)
print(f"响应状态码: {response.status_code}")
print(f"响应内容: {response.text}")
result = response.json()
if result.get("errcode") == 0:
print("✅ 消息推送成功!")
return True
else:
print(f"❌ 消息推送失败: {result.get('errmsg')} (错误码: {result.get('errcode')})")
return False
except Exception as e:
print(f"❌ 推送消息异常: {str(e)}")
return False
def main():
"""主函数"""
demo = WechatPushDemo()
# 测试用的openid 你自己的微信openid
test_openid = "123456"
# 测试消息
test_message = "这是一条测试消息7546444845132384981525644174321213648"
print(f"测试消息: {test_message}")
success = demo.push_message(test_openid, test_message)
if success:
print("✅ 测试成功")
else:
print("❌ 测试失败")
if __name__ == "__main__":
main()
为什么这样修改有效?
手动JSON序列化:json.dumps(message, ensure_ascii=False) 确保中文字符不被转义
使用data参数:data=json_data.encode('utf-8') 明确指定UTF-8编码
设置Content-Type:charset=utf-8 明确告诉服务器使用UTF-8编码
这样修改后,你的微信推送消息应该就不会出现乱码了!

浙公网安备 33010602011771号