微信运营越来越多了,这种带参数二维码的使用场景还挺多的,但是网上的实现大都是PHP啥的,还不想写PHP的我只好用Python实现一下了。
关于带参二维码的介绍,记得先看官网:生成带参数的二维码。
先大体看看介绍
目前有2种类型的二维码:1、临时二维码,是有过期时间的,最长可以设置为在二维码生成后的30天(即2592000秒)后过期,但能够生成较多数量。临时二维码主要用于帐号绑定等不要求二维码永久保存的业务场景
2、永久二维码,是无过期时间的,但数量较少(目前为最多10万个)。永久二维码主要用于适用于帐号绑定、用户来源统计等场景。
用户扫描带场景值二维码时,可能推送以下两种事件:1、如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。
2、如果用户已经关注公众号,在用户扫描后会自动进入会话,微信也会将带场景值扫描事件推送给开发者。
总结一句,就是生成的二维码本身有一个独特的scene_id,扫描这个码,后台可以获得先关的标签对,也就是后台会获得以下数据:带参二维码返回的数据
好啦,我们先来看如何生成带scene_id的二维码,而后台的处理事件,我们之后再来看,因为我刚刚才为此买了一个域名,结果实名+备案要好几天,暴风哭泣。
先来说一下基本流程:从服务号的管理处获得AppID和AppSecret,具体可以看获取AccessToken。
根据AppID和AppSecret来构造Post请求,获得Access Token
根据Access Token构造Post请求,获得Ticket
用Ticket获得需要的二维码
获得AccessToken
我们直接来看代码,没怎么做封装:
import urllib
import urllib.request
import json
from urllib import parse, request
记得要有appid 和 appsecret
appid = '这里放你的appid'
secret = '这里放你的appsecret'
def token_url(appid, secret):
return "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s"%(appid, secret)
获得accessToken函数
def get_access_token(appid, secret):
access_token_url = token_url(appid, secret)
f = urllib.request(access_token_url)
json_string = f.read()
return json.loads(json_string)['access_token']
现在是开始获取
access_token_url = token_url(appid, secret)
f = urllib.request.urlopen(access_token_url)
json_string = f.read()
access_token = json.loads(json_string)['access_token']
好啦,现在有accessToken了
现在来获取Ticket
传入accessToken来构造Ticket_url
def get_ticket_url(access_token):
url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=%s" %(access_token)
return url
ticket_url = get_ticket_url(access_token)
构造Post请求的参数,这个官网的介绍很清楚,其中scene_id是自己随意设置的数字,这个数据是在用户扫描二维码之后,告诉你被扫描的二维码是哪个
body = {"expire_seconds":604800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}
记得要对post数据进行encode,不然会报错
json_data = json.dumps(body).encode(encoding='utf-8')
已经构造好啦,现在来获取所ticket和二维码啦
req = request.Request(url=ticket_url, data=json_data)
res = request.urlopen(req).read()
ticket_string = json.loads(res)['ticket']
def exchange_by_ticket(ticket_string):
ticket = ticket_string
exchange_by_ticker_url = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=%s" % (ticket)
return exchange_by_ticker_url
exchange_by_ticker_url = exchange_by_ticket(ticket_string)
就能够收到所需要的二维码啦,✿✿ヽ(°▽°)ノ✿,之后的话,就要写服务器来如何响应用户的扫描啦。
原理是这样的:当用户扫描了带参数的二维码之后,会返回一个参数列表给微信
这个参数列表就包含scene_id,这样你就知道他扫描的是哪个二维码
微信将那个参数列表发送到你提前设置好的url服务器
你写的程序对这个参数列表进行相应,并将相应的反应信息发送给微信
微信再将数据发送给用户
之后我会继续实现的。