1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > python 网站实现扫描二维码关注微信公众号 实现自动登陆

python 网站实现扫描二维码关注微信公众号 实现自动登陆

时间:2020-10-07 23:00:27

相关推荐

python 网站实现扫描二维码关注微信公众号 实现自动登陆

微信公众平台接口测试帐号:https://mp./debug/cgi-bin/sandbox?t=sandbox/login

1,微信提供生成带参数的二维码的接口,参数就是唯一值(场景值,我用的时间戳)

参考 微信文档 生成带参数的二维码

import requestsclass MyWeChatOAuth(object):def get_token(self):"""获取授权跳转地址:return: URL 地址"""url = "https://api./cgi-bin/token?grant_type=client_credential&appid={}&secret={}".format(self.app_id, self.secret)ret = requests.get(url=url)content = (ret.content).decode("utf-8")js = json.loads(content)print(js)return js.get("access_token")def get_ticket(self):url = "https://api./cgi-bin/qrcode/create?access_token={}".format(self.get_token())scene_id = int(time.time()*100000)data = {"expire_seconds": 36000,"action_name": "QR_SCENE","action_info": {"scene": {"scene_id": scene_id}}}rep = requests.post(url, json=data)content = (rep.content).decode("utf-8")js = json.loads(content)ticket = js.get("ticket")ret_url = "https://mp./cgi-bin/showqrcode?ticket={}".format(ticket)print(ret_url)return ret_url

将场景值 scene_id 保存到 redis

2,网站调用微信系统,获取生成的二维码图片

获取到 ret_url 返回给前端 直接显示 二维码图片

用 scene_id 创建一个websocket 连接

3 、微信公众号配置

设置好微信 回调的地址 httl.../wx/ 用户扫码后会请求此地址

注意 配置url时 确保服务器可以访问到 以验证token

def weixin(request):# 自己写的授权print(request.method)body = request.bodyif request.method == "POST":return HttpResponse(body.decode('utf-8'))data = request.GETprint(data)signature = data.get("signature")if not signature:return HttpResponse("dasdfafd")print("sign", signature)timestamp = data.get("timestamp")nonce = data.get("nonce")echostr = data.get("echostr")# token 为用户在微信公众平台自定义tokentoken = "fjklsdjfksdjkflsd"# 将token、timestamp、nonce三个参数进行字典序排序list = [token, timestamp, nonce]list.sort()# 将三个参数字符串拼接成一个字符串进行sha1加密info = "".join(list)sha1 = hashlib.sha1()sha1.update(info.encode())hashcode = sha1.hexdigest()# 比对相同就返回 echostrif hashcode == signature:return HttpResponse(echostr)else:return ""

4、处理推送事件 httl.../wx/

扫描带参数二维码事件

参考文档:https://mp./wiki?t=resource/res_main&id=mp1421140454

代码: 我这里使用到了werobot

from werobot import WeRoBotmyrobot = WeRoBot()# todo http://mp./debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index# todo 账号来自测试账号myrobot.config["APP_ID"] = "wx8fe512646732596d"myrobot.config["APP_SECRET"] = "8725fc1e12b9750e3c90a38d3201dec2"myrobot.token = "fjklsdjfksdjkflsd"client = myrobot.client# 用户未关注时,进行关注后的事件推@myrobot.subscribedef mysubscribe(message):EventKey = message.EventKey# EventKey 无值扫码关注if not EventKey:# .....return ""# EventKey 有值扫码登录FromUserName = message.FromUserName# todo 通过 FromUserName(openid) 查询用户 如果确定用户使用的unionid 要再通过openid获取到 unionidinfo = client.get_user_info(FromUserName) # jsonusers = Users.objects.filter(openid=FromUserName)if users.exists():user = users[0]# 用户存在直接返回用户登录信息# send_channel_msg(EventKey, {"user": userinfo,"type":"login"})else:# todo 用户不存在 可以把openid 推送到前端转到注册或绑定页面# send_channel_msg(EventKey, {"openid": FromUserName,"type":"register"})passreturn "text"# 用户已关注时的事件推送@myrobot.scandef myscan(message):EventKey = message.EventKeyFromUserName = message.FromUserName# todo 通过 FromUserName(openid) 查询用户 如果确定用户使用的unionid 要再通过openid获取到 unionidinfo = client.get_user_info(FromUserName) # jsonusers = Users.objects.filter(openid=FromUserName)if users.exists():user = users[0]# 用户存在直接返回用户登录信息# send_channel_msg(EventKey, {"user": userinfo,"type":"login"})else:# todo 用户不存在 可以把openid 推送到前端转到注册或绑定页面# send_channel_msg(EventKey, {"openid": FromUserName,"type":"register"})passreturn ""

EventKey 场景值 就是上面生成的 scene_id = int(time.time()*100000)找到 scene_id = EventKey 的websocket连接 把用户的登录信息等发送到前端 实现登录注: 我使用的是websocket 也可以前端长轮询

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。