微信公众号对接中的坑之 sha1算法结果不同

本文分享了在使用Python3对接微信公众号时遇到的问题及解决方法。重点对比了Python2.x与3.x在处理SHA1签名验证上的差异,强调了在Python3中正确实现的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在微信公众号帮助文档中 实例代码为

class Handle(object):
    def GET(self):
        try:
            data = web.input()
            if len(data) == 0:
                return "hello, this is handle view"
            signature = data.signature
            timestamp = data.timestamp
            nonce = data.nonce
            echostr = data.echostr
            token = "xxxx" #请按照公众平台官网\基本配置中信息填写

            list = [token, timestamp, nonce]
            list.sort()
            sha1 = hashlib.sha1()
            map(sha1.update, list)
            hashcode = sha1.hexdigest()
            print "handle/GET func: hashcode, signature: ", hashcode, signature
            if hashcode == signature:
                return echostr
            else:
                return ""
        except Exception, Argument:
            return Argument

然后我对接的时候是用python3写的 弄了半天发现结果不对   原来是 python2x和3x的写法不同

#2x写法
map(sha1.update, list)
#3x写法
sha1.update("".join(list).encode('utf-8'))

#以上唯一区别 

 

### 微信公众号扫码登录功能对接 #### 获取 Access Token 为了实现微信公众号的扫码登录,首先需要获取 `access_token`。这可以通过调用微信开放平台提供的API来完成。具体来说,通过发送HTTP GET请求到指定URL并传递必要的参数(如AppID和AppSecret),可以得到包含`access_token`在内的JSON响应[^1]。 ```python import requests def get_access_token(appid, appsecret): url = f"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={appid}&secret={appsecret}" response = requests.get(url).json() return response['access_token'] ``` #### 创建带参二维码 创建带有特定场景值或票据(`ticket`)的二维码对于引导用户扫描至关重要。虽然两种方式均可作为唯一凭证用于后续验证,但使用`ticket`更为便捷。开发者可以根据实际需求调整这部分逻辑,并移除不必要的调试语句[^2]。 ```python from urllib.parse import quote_plus def create_qrcode(access_token, scene_id): data = { "expire_seconds": 60, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": scene_id}} } url = f'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={access_token}' resp = requests.post(url, json=data).json() ticket = resp["ticket"] qrcode_url = f'https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket={quote_plus(ticket)}' return qrcode_url ``` #### 验证消息真实性 当用户的操作触发了相应的事件时,微信公众平台将会向预先设定好的服务器地址发起POST请求。此时,服务端需对接收到的数据包进行解析处理前先确认其来源合法性。为此,应按照官方说明中的算法对传入的时间戳(timestamp)、随机数(nonce),连同自定义的安全令牌(token)一起按ASCII码顺序排列后计算SHA1摘要并与签名(signature)对比匹配情况[^3]。 ```python import hashlib import xml.etree.ElementTree as ET class WeChatSignature: token = 'your_own_security_token' @staticmethod def check_signature(params_dict): sorted_items = sorted(params_dict.items()) string_to_hash = ''.join([str(item[1]) for item in sorted_items]) sha1 = hashlib.sha1(string_to_hash.encode()).hexdigest() return params_dict['signature'] == sha1 @staticmethod def parse_xml(post_data): root = ET.fromstring(post_data) msg_type = root.find('MsgType').text if msg_type == 'event': event_key = root.find('EventKey').text # Further processing based on Event Key... return {'msg_type': msg_type} ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值