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

news/2024/5/18 21:08:47/文章来源:https://blog.csdn.net/MAO_TOU/article/details/97930658

场景

例如,某用户在第三方购物平台的账号(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_iddef 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_idaccess_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=mp1421140839if userinfo_response_dict:print userinfo_response_dictelse: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 Falseelse:# 请求链接返回的用户信息return userinfo_response_dict

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_845433.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

转 -- HTTP Caching 优化网站

原文出处&#xff1a;http://blog.chenlb.com/2009/07/http-caching-optimize-your-site.html HTTP Caching 用好了&#xff0c;可以极大的减小服务器负载和减少网络带宽。十分有必要深入了解下 http 的 caching 协议。 先来看下请求/响应过程&#xff1a; http 请求/响应 1、用…

WordPress快速增加百度收录,加快网站内容抓取

本文已同步到专业技术网站 www.sufaith.com, 该网站专注于前后端开发技术与经验分享, 包含Web开发、Nodejs、Python、Linux、IT资讯等板块. 利用百度站长平台提供的链接自动提交代码, 快速增加百度收录, 加快网站内容抓取。 1.创建名为 “baidu_js_push.php”的文件, 内容如下…

转 火山喷发的负载 机场网站的缓存

原址如下&#xff1a; http://developer.51cto.com/art/201209/357025.htm 火山喷发的负载 机场网站的缓存 【51CTO精选译文】与其他许多人一样&#xff0c;我眼下也滞留在欧洲&#xff0c;等待飞回美国的航班。近期的火山喷发不仅影响了欧洲大陆的航班&#xff0c;还影响了全…

跨境电商自建站后台系统原型rp_跨境电商仓储物流选择哪家好?

跨境电商仓储物流选择哪家好?跨境电商仓储物流&#xff0c;是针对跨境电商企业量身定制的仓储物流派送一体化业务&#xff0c;在电商旺季能防止因货物过度导致的处理效率低、出错率高、无法准时发货的问题。在电商淡季&#xff0c;能有效避免仓库租赁费、人工费、水电费、设备…

利用其他网站的搜索结果_什么使您的网站在搜索结果中排名很高?

什么使您的网站在搜索结果中排名很高&#xff1f;自搜索引擎开始流行并成为主流以来&#xff0c;这个问题已经引起了网站所有者和企业所有者的关注。特别是&#xff0c;使网站在搜索引擎上排名较高的原因是&#xff0c;大多数人都使用搜索引擎来找到答案并找到他们想要的东西。…

php计划任务导出数据,如何建立备份数据和网站文件的计划任务

下面由宝塔面板使用教程栏目给大家介绍如何建立备份数据和网站文件的计划任务&#xff0c;希望对需要的朋友有所帮助&#xff01;建立备份数据和网站文件的计划任务登录宝塔 Web 面板 >> 点击左侧菜单栏“计划任务”>> 添加计划任务中&#xff0c;任务类型选择“备…

如何快速搭建一个个人网站

相必很多人都有建站的想法&#xff0c;但是感觉要学的东西太多。这里给大家教一个很快捷的方法。但是前提是要掌握一部分linux基本的命令。 下面开始个人网站搭建的教程&#xff1a; 第一步&#xff1a;首先我们需要一个服务器&#xff0c;这里推介腾讯云15天免费使用的腾讯cvm…

有哪些你一打开,就令你惊讶的网站?

作者&#xff1a;李大颖链接&#xff1a;https://www.zhihu.com/question/393259130/answer/1235087230来源&#xff1a;知乎----------------不仅仅让你惊讶&#xff0c;这10个在线生成器&#xff0c;更让你沉迷&#xff01;适用人群&#xff1a;单身狗、宅男、猛女、祖安社会…

有哪些你一打开,就令你惊讶的网站?第二趴

原文链接&#xff1a;https://www.zhihu.com/question/393259130/answer/1558178696----上一篇文章推荐了几个惊奇的网站&#xff08;有哪些你一打开&#xff0c;就令你惊讶的网站&#xff1f;&#xff09;&#xff0c;这一篇更加炫酷。----我来推荐6个小众神奇网站&#xff0c…

解读大型网站系统架构的演化

2014-09-26 09:53 李平 LEE的博客 字号&#xff1a;T | T大型网站的架构是根据业务需求不断完善的&#xff0c;根据不同的业务特征会做特定的设计和考虑&#xff0c;本文只是讲述一个常规大型网站会涉及的一些技术和手段。 AD&#xff1a;干货来了,不要等&#xff01;WOT2015 北…

黑客规避搜索引擎 劫持网站流量

最令站长头疼的事莫过于自己的网站被黑。如果没有合适的安全措施&#xff0c;即便站长再怎么用心&#xff0c;也会失去网站的控制权。黑客入侵网站之后&#xff0c;可以在上面搭载钓鱼页面&#xff0c;传播恶意软件&#xff0c;盗取敏感信息等。在这篇文章中&#xff0c;我们将…

DataForSeo serp api 使用

serp 使用搜索引擎结果页 由于谷歌搜索引擎反爬太厉害。 我给大家推荐一个好用的平台&#xff1a; DataForSeo serp api serp 提供前100 的搜索引擎结果指定关键字&#xff0c;搜索引擎和搜索位置的实时数据。 所有的post 数据均以json 格式发送 平台地址&#xff1a; https://…

Nginx网站使用CDN之后禁止用户真实IP访问的方法

原文地址&#xff1a; https://zhangge.net/5096.html做过面向公网 WEB 运维的苦逼们肯定见识过各种恶意扫描、拉取、注入等图谋不轨行为吧&#xff1f;对于直接对外的 WEB 服务器&#xff0c;我们可以直接通过 iptables 、 Nginx 的 deny 指令或者是程序来 ban 掉这些恶意请求…

魔百和服务器网站,魔百盒网关服务器下发超时

魔百盒网关服务器下发超时 内容精选换一换物联网平台提供海量设备的接入和管理能力&#xff0c;配合华为云其他产品同时使用&#xff0c;帮助快速构筑物联网应用&#xff0c;简化海量设备管理复杂性&#xff0c;节省人工操作&#xff0c;提升管理效率。使用设备接入控制台&…

el表达式 range_「el」JSTL标签库和EL表达式总结 - seo实验室

elJSTL标签库与EL表达式JSTL 是JSP的标准标签库&#xff0c;是一个JSP的标签集合 &#xff0c;按照类别包括核心标签&#xff0c;格式化标签&#xff0c;JSTL函数&#xff0c;sql标签和XML标签 &#xff0c;其中前三个用的概率较高。要想使用JSTL标签库我们首先要做的就是引入对…

power linux磁盘修复,虚拟存储 - Linux on POWER:开发概览_Linux教程_Linux公社-Linux系统门户网站...

虚拟存储对于存储和 I/O 来说&#xff0c;Linux 可以利用很多真实的设备和虚拟设备。这种灵活性可以非常经济地设置 Linux 分区。就磁盘来说&#xff0c;Linux 逻辑分区可以支持 3 个不同的存储选项&#xff1a;" 内部存储&#xff0c;使用 SCSI 适配器和专门用于这个分区…

超强网站,可以代替你电脑中所有的工具软件

「云」的确是个好东西&#xff0c;信息储存在云端后&#xff0c;我们想用就随时拿来用&#xff0c;不想用存在云里也不占空间。那么&#xff0c;平时用的工具软件&#xff0c;能不能也具备「用完即走」的属性呢&#xff1f; nicetool nicetool 之所以强大&#xff0c;在于集合…

大型网站架构演化历程

大型网站系统的特点 高并发&#xff0c;大流量 需要面对高并发用户&#xff0c;大流量访问。Google 日均 PV 35 亿&#xff0c;日 IP 访问数 3 亿&#xff1b;腾讯 QQ 的最大在线用户数 1.4 亿&#xff08;2011年数据&#xff09;。 高可用 系统 7 x 24 小时不间断服务。 海量数…

HTML5移动端手机网站开发流程

最近一直在研究移动手机网站的开发&#xff0c;发现做手机网站没有想象中的那么难。为什么会这么说呢&#xff1f;我们试想下:我们连传统的PC网站都会做&#xff0c;难道连一个小小的手机网站难道都搞不定吗&#xff1f;其实手机网站就是一个微缩版的PC网站罢了&#xff01;至于…

nodeJs express mongodb 建站(linux 版)

一、环境安装 1、安装node wget http://nodejs.org/dist/v0.12.2/node-v0.12.2-linux-x64.tar.gz //下载tar xvf node-v0.12.2-linux-x64.tar.gz //解压cd node-v0.12.2-linux-x64 //到解压目录下cd bin //到bin目录下./node -v //设置全局 ,注意 前面的是你当前存放…