python微信公众号微信用户绑定第三方网站

场景

例如,某用户在第三方购物平台的账号(user_id/手机号码等)需要跟该用户的微信账号进行绑定, 实现在该购物平台的微信公众号中查询个人信息, 消费记录, 充值记录等操作.总的来说便是,将微信用户的open_id跟第三方网址user_id/手机号码等进行一对一关联

实现方案

微信用户关注公众号后,通过让微信用户请求授权链接的方式来获取用户信息,获取的信息里面就包含用户在该微信公众号的唯一标识open_id,我们进而将微信用户open_id跟第三方网站账号user_id/手机号码等进行绑定

流程

  1. 让用户请求微信授权链接, 用户同意授权
  2. 获取code, 通过获取到的code, 换取进行网页授权的access_token
  3. 刷新access_token (非必要, 如果有需要可以参照微信公众号平台)
  4. 请求链接获取用户基本信息,得到用户open_id等基本信息

第一步
请求方式 : GET
请求参数 :

参数				 是否必须				说明
appid				是				你的公众号app_id
redirect_uri		是				用户同意授权之后回调地址
response_type		是				返回类型,直接写 code
scope				是				应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 )
state				否				重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
#wechat_redirect	是				无论直接打开还是做页面302重定向时候,必须带此参数

如果scope的值为snsapi_userinfo,则会弹出以下页面,否则不会
在这里插入图片描述

后台代码-拼接授权链接并转换为短链接返回前端

"""
流程
1: 根据微信服务器要求拼接好授权链接
2: 将授权链接转换为短链接,生成二维码(链接过长无法直接生成二维码, 所以需要转换为短链接)
3: 将生成的短链接返回前端, 使用jquery库生成二维码

参数备注
BINDING_REDIRECT_URL 回调地址
BINDING_REDIRECT_URL = 你的回调地址

AUTHORIZATION_URL 授权链接
AUTHORIZATION_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s#wechat_redirect"

WECHAT_APPID = 你的公众号app_id
"""

BINDING_REDIRECT_URL = 你的回调地址
AUTHORIZATION_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s#wechat_redirect"
WECHAT_APPID = 你的公众号app_id

def get_authorization_short_url(self, user_code):
	"""
		获取微信用户授权链接
	"""
    # 对回调地址进行转义,避免冲突, 因为回调地址也包含 http:// 所以需要进行转义
    redirect_url = urllib.quote(BINDING_REDIRECT_URL)
    # 用户编号进行编码, base64安全性不高,可以采用rsa等非对称加密算法进行加密
    # 将用户编号作为state参数一起传递过去,后面微信服务器会将state再回传到回调地址
    user_encode = base64.b64encode(user_code)
    authorization_url = AUTHORIZATION_URL % (WECHAT_APPID, redirect_url, "snsapi_userinfo", user_encode)
    # authorization_url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=你的公众号app_id&redirect_uri=你的回调地址&response_type=code&scope=snsapi_userinfo&state=user_encode#wechat_redirect"
    # 长链接无法生成二维码,请求微信接口转换为短链接
    conversion_short_url = self.long_url_conversion_short_url(authorization_url)
    if conversion_short_url and conversion_short_url.startswith("http"):
    	# 成功将长链接转换为短链接, 输出到前端进行生成二维码
        return self.write({"code": "0", "msg": u"操作成功!", "data": conversion_short_url})
    else:
        # 转换失败
        return self.write({"code": "-1", "msg": u"操作失败!"})

def long_url_conversion_short_url(long_url):
	"""
		将长链接抓换为短链接返回, 以便生成二维码
		具体请参考 https://blog.csdn.net/MAO_TOU/article/details/97921013
	"""

html网页代码-获取授权短链接并且生成二维码
bootstrap模态框, 用于显示生成的二维码图片

<div class="modal fade" id="qrcode_modal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
                <h4 class="modal-title" id="myModalLabel">请打开微信扫一扫</h4>
            </div>
            <div class="modal-body" style="text-align: center;">
                <div id="authorization_code">
                </div>
            </div>
        </div>
    </div>
</div>

JS代码

点击下载QRCode跟JQuery

function create_qrcode_to_authorization() {
    // 后台请求绑定微信二维码
    $.ajax({
        url:'获取授权链接地址',
        async: false,
        type:"POST",
        data:{
            推荐传递用户id等信息到后台,作为授权链接的state参数传入,后续微信服务器会将state回传到回调地址
        },
        dataType:"json",
        success: function(data){
            if(data['code'] == '0') {
            	// 获取授权锻链接成功
                authorization_url = data['data'];
                // 直接使用qrcode生成二维码
                var qrcode = new QRCode(document.getElementById("authorization_code"), {
                    text: authorization_url,
                    width: 228,
                    height: 228,
                    colorDark : "#000000",
                    colorLight : "#ffffff",
                    correctLevel : QRCode.CorrectLevel.H
                });
                // 唤醒模态框
                $('#qrcode_modal').modal();
            }else {
                alert(data['msg']);
            }
        },
        error: function(){
            alert("操作失败,请稍后再试!");
            return ;
        },
    });
}

后面需要用户打开微信进行扫码,当用户扫码并且同意授权之后,微信服务器就会以 GET 方式请求我们刚才设置的回调地址, 携带state参数跟code参数,其中,state参数是我们刚才设置在授权链接里面的state,原封不动,code参数是用于 第二步 中用于 换取进行网页授权的access_token时 需要使用的参数.

第二步
后台代码-编写回调函数, 获取state跟code参数

"""
流程
1: 获取微信回传的state参数跟code参数
2: 使用code参数请求获取access_token跟open_id, access_token跟open_id可用于下一步获取用户个人信息
3: 使用access_token跟open_id请求获取微信用户信息

参数备注
RETURN_TOKEN_OPEN_ID_2_USER_INFO_URL 获取access_token跟open_id的请求地址
RETURN_TOKEN_OPEN_ID_2_USER_INFO_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code"

WECHAT_APPID = 你的公众号app_id
WECHAT_APPSECRET = 你的公众号秘钥
"""

RETURN_TOKEN_OPEN_ID_2_USER_INFO_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code"
WECHAT_APPID = 你的公众号app_id
WECHAT_APPSECRET = 你的公众号秘钥

def redirect_function(self):
	"""
		回调函数, 微信服务器会根据授权链接的回调地址(redirect_uri)找到并且执行该函数
	"""
    code = self.get_argument("code", "")
    state = self.get_argument("state", "")
    # 获取信息错误, 绑定失败
    if state == "":
        return self.render("wechat/wechat_error.html", errcode="500", errmsg="绑定失败")
    if code == "":
        return self.render("wechat/wechat_error.html", errcode="500", errmsg="绑定失败")
        
    user_code = base64.b64decode(state)
    # 请求获取访问用户信息的access_token跟open_id
    access_token_request_url = RETURN_TOKEN_OPEN_ID_2_USER_INFO_URL % (WECHAT_APPID, WECHAT_APPSECRET, code)
    wechat_access_token_response = urllib2.urlopen(access_token_request_url)
    # 获取wechat返回数据(json格式)
    access_token_response_json = wechat_access_token_response.read()
    access_token_response_dict = json.loads(access_token_response_json)
   
    if "errcode" in access_token_response_dict.keys():
     	# 返回错误信息
        return self.render("wechat/wechat_error.html", errcode="500", errmsg="绑定失败")
        
    # 获取open_id跟access_token, 后续根据open_id跟access_token获取用户基本信息
    user_open_id = access_token_response_dict["openid"]
    access_token = access_token_response_dict["access_token"]
    
    # 到这一步已经可以进行绑定了,当前用户的user_code跟open_id都有,
    # 只要在数据库进行存储即可,如果还需要获取用户在微信的基本信息,则需要再次
    # 发送请求进行获取
    userinfo_response_dict = get_wechat_user_info(user_open_id, access_token)
    
    # 返回的用户信息可以参考 微信公众平台 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140839
    if userinfo_response_dict:
    	print userinfo_response_dict
    else:
    	print "获取用户信息失败" 
   
   

第四步
后台代码-根据access_token跟open_id获取微信用户信息

def get_wechat_user_info(self, user_open_id, access_token):
    # 发送请求获取用户信息(只获取基本信息)
    userinfo_request_url = "https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN" %(access_token, user_open_id)
    userinfo_response = urllib2.urlopen(userinfo_request_url)
    # 提取用户信息(json格式)
    userinfo_response_json = userinfo_response.read()
    userinfo_response_dict = json.loads(userinfo_response_json)
    if "errcode" in userinfo_response_dict.keys():
    	# 返回错误信息
        return False
    else:
    	# 请求链接返回的用户信息
        return userinfo_response_dict
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值