事倍功半是蠢蛋 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编码
这样修改后,你的微信推送消息应该就不会出现乱码了!

posted @ 2025-07-10 16:00  空心橙子  阅读(14)  评论(0)    收藏  举报