用QQ登录的除了钱站 安智市场场和4399游戏盒,还有什么应用是用QQ登录的?

CP不得不知道的事情:渠道对接那点事儿_产业服务-新闻_新浪游戏_新浪网
CP不得不知道的事情:渠道对接那点事儿
14:48:57& &来源:
  安智市场
  一、游戏联运服务概述
  安智游戏联运服务为开发者提供安全、透明、公平的一站式变现解决方案。在游戏开发时集成安智SDK ,即可使用安智的账号系统或支付功能,不必考虑用户登录、支付等额外的开发工作,也不必顾虑账号、支付等相关的安全问题,专注于开发优质的游戏,提高效益。
  安智账号系统,拥有强大的用户资源,对游戏投放、推广具有强大的优势。可使用安智账号、腾讯QQ、新浪微博一账号登录多游戏客户端,免除用户注册的麻烦。同时通过安智账号服务体系,同时提供个人中心、礼包、论坛、消息、客服中心等游戏必备功能。
  安智支付SDK,是安智为开发者提供的游戏变现服务之一,现已集成国内多家主流支付公司的服务,开发者只需在游戏内嵌入支付SDK,即可享受多样化的支付方式、查看清晰的交易报表、自助结算等多种温馨服务,从而大大节省开发者的支付维护成本。
  二、服务优势
海量用户:整合安智数千万的活跃用户,开放给所有的合作资源方,借助安智平台的优势资源,为您带来丰厚收益。o&定期结算:将您的收入按时结算,保证您的资金迅速回流。结算数据清晰准确,方便您了解资源销售情况。o&开发支持:专业的开发技术支持,专业的QA测试,帮助开发者降低开发及运营成本,加快游戏上线的步伐。&三、资源下载&
SDK和接入文档
1、增加我的礼券功能;
2、消费增加礼券与叠加支付功能;
3、增加账号安全引导功能;
4、增加充值返利活动提醒功能;
5、增加悬浮窗自动隐藏功能;
6、增加文字链展示功能;
7、优化消息详情页面;
8、优化个人中心UI设计;
  四、SDK功能说明
  安智提供网络游戏、单机、棋牌三种类型的游戏联运服务
可接入的服务
&&1、账号系统:安智账号、腾讯QQ、新浪微博。
& 2、支付功能:安智币、支付宝、财付通、银联、充值卡、礼券
& 运营商短代计费:移动MM/移动基地、联通沃商店、电信爱游戏(三个运营商需全 & & 部接入)。
&&支付功能(安智单机支付SDK):必选(安智短代)、可选(支付宝、财付通、 & & & & 银联、充值卡)。
&&1、账号系统:安智账号、腾讯QQ、新浪微博。
& 2、支付功能:安智币、支付宝、财付通、银联、充值卡、安智短代。
  安智账号SDK包含安智账号、腾讯QQ、新浪微博登录,同时提供个人中心、礼包、论坛、攻略、消息、客服中心等游戏必备功能。
  登录:用户在游戏中使用“安智账号”登录时, 可以使用邮箱、用户名、手机三种登录方式,采用增强的密码登录验证机制。注册:用户可使用手机号一键注册功能快速注册,也可通过用户名、邮箱进行注册。
  登录后用户可使用个人中心、礼包、论坛、攻略、消息等功能。
  个人中心:为用户提供个人资料管理、VIP专区、安智币充值、礼券、礼包、消息、消费记录查看、账号密码管理等功能。
  礼包、论坛:接入SDK后您可在此平台我的软件列表中找到该游戏选择[发布礼包],详情参见发布礼包帮助页面,还可在安智论坛中给您提供相应的游戏版块,供用户交流互动。
  客服中心、消息:用户可发送反馈给您,可在用户数据-用户反馈中查看用户提交的反馈,并回复,与用户直接沟通。用户可接收系统发送的消息,发送消息功能暂未对开发者开放。
  我的礼券:用户通过充值返利活动获得,礼券可用于游戏内支付。
  VIP专区、攻略:VIP是指用户满足一定条件后安智为其提供的特权服务;攻略为玩家提供一些游戏经验与心得,引导玩家熟悉并能尽快的对相关游戏规则进行了解。
  2。 支付功能
  用户使用游戏客户端过程中,购买游戏产品可以直接调用SDK客户端控件进行支付操作,充值成功后,SDK服务端会异步通知游戏服务端。
  安智币:安智提供的手机用户用于购买各种付费业务的一种虚拟货币,目前主要用于支付安智运营的游戏、软件、手机小说等SDK端应用业务。 只要有安智账号,就可以对安智币账户进行充值和使用安智币进行消费。安智币账户充值的方式目前有:支付宝、移动/联通/电信充值卡、网银等, 可以在 SDK客户端或安智Web版用户中心(user.anzhi.com)操作充值。
  安智币支付及充值图示:
  游戏内支付图示:
  五、注意事项
  图片资源:请见接入文档资料包“LOGO及使用说明”—“游戏启动页”。
  横屏 & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &竖屏
  图片资源:请见接入文档资料包“LOGO及使用说明”—“游戏图标角标”。
  说明:
  1)角标不可遮挡icon的主体元素,可根据实际情况布局到icon的4个边角。
  2)角标必须严格遵守《LOGO使用说明》。
  3)角标必须严格按照所提供的icon与角标的尺寸对应关系进行使用。
  4)游戏启动页必须使用安智提供的启动页。
  5)以上条件不符合时,游戏不予与接入。
新浪声明:新浪网登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
今年4月,位于马陆的某互联网企业来到嘉定公安报警,称网上有人售卖一款游戏外挂,能使参与者展现全景地图,影响游戏公平性,造成...
来自:大陆网游新闻
近几年,游戏创业经历了爆发式发展,造就了很多一夜暴富的神话,很多创业者义无反顾地投入到游戏的创业的热潮中去,老牌的游戏公...
来自:产业服务-新闻
  日,51.com十周年庆典在上海意索娜意大利餐厅举行,在十周年庆典上,51.com创始人庞升东对过去经历的十年风雨做出...
来自:产业服务-新闻
中国网络游戏排行榜(China Game Weight Rank)是由新浪游戏推出的目前国内最全面、最专业、最公正的最新网络游戏评测排行榜,涵盖2010至今内所有新游戏,力图为中国游戏玩家打造最值得信赖的新网游推荐平台。
新浪中国网络游戏排行榜是以由新浪游戏专业评测员组成的评测团队为核心,以游戏的画质、类型、风格、题材等游戏特性为依据,对中国(大陆港澳台)、欧美、日韩等地区正在进行测试或正式运营的新网游产品进行评测并打分后产生的权威游戏排行榜。新浪中国网络游戏排行榜将网络游戏从六大项、二十八个小分项与同类游戏进行横向比较,再将该游戏与自身的不同版本进行纵向对比后,由评测中心根据加权平均数得出最后的游戏分数,并以游戏测试及上线时间点为分组,根据每款游戏的CGWS分数在每个季度发布排行榜榜单,实现了排行榜的透明化和实时化,帮助玩家准确、迅速地找到心目中的理想游戏。
评天下游戏、测产品深浅—新浪中国网络游戏排行榜CGWR! 
本周进行测试的游戏共有9款,其中大型机甲国战网游《魔甲时代》周四国服首测,MOBA新游《魔幻英雄》开启技术内测。
游戏圈女神多娇又爱玩 来看一周游戏美女汇总!
更多资讯、攻略、视频,尽在新浪游戏《合金装备V:幻痛》游戏专区。
小编辛辣点评本周荐满分好评作合金装备5,吐槽新流星搜剑录。
《新流星搜剑录》由腾讯代理的3D武侠电竞网络游戏。
国产ACT单机作《御天降魔传》正式版独家试玩解说,各模式揭秘。
《诛仙世界》8月18日开测,海量内容独家爆料。
用微信扫描二维码
分享至微信朋友圈安卓市场_安卓游戏破解版下载_单机破解版游戏大全_手机网游下载
3733手游盒子包含了市面上最新、最...
  《独孤天下》是一款以玄幻仙侠为题...
  《上古异兽录》是一款玄幻武侠题材...
精品应用推荐
最新评测资讯魅族PRO 6(全网通)安智市场简介
安智市场:安全下载,放心使用。安卓手机必备的软件游戏下载和管理利器!安智市场作为国内最大的第三方安卓应用商店所有应用软件,均经过系统加人工双重审核,带给用户安全、绿色的应用下载体验,在彰显责任感的同时做到永久免费。 更新最快,首发优势。安智市场第一时间为您呈现各类应用软件,每日更新热门应用,充分满足您的尝鲜欲望;与国内外众多优秀开发者保持密切合作关系,拥有独家首发优势。 尽快下载来体验一场震撼的软件游戏下载之旅吧!上安智,淘游戏,下软件! 安智市场v_5.4.1新版说明:「一键注册」手机号极速注册「登录」新增QQ、微博便捷登录「礼包」交互优化,使用更简便「相同作者」同作者软件,更直观「安装包管理」全盘扫描,更卓越安智市场5.2.1更新说明1.新增「零流量更新」升级不耗流量 2.游戏频道新增「礼包」「新服」3.软件「icon」变大,视觉体验更好4.「通知栏」可以看到下载进度啦5.优化「安装包管理」扫描更快6.优化「搜索」体验7.部分手机支持「应用安装到SD卡」安智市场4.4.1更新说明1.电子书排行榜增加免费榜单2.提升应用图标清晰度3.提升客户端性能4.优化了部分功能逻辑安智市场4.3.1更新内容如下: 1、优化手势操作,轻松玩转安智市场2、调整专题、排行位置,找应用更容易3、优化管理页面布局,界面更清爽4、完善管理页面弹出菜单,使用更便捷5、改进版本号显示机制,更贴心6、美化列表显示效果,字体更精美安智市场4.2更新内容如下: 1. 新增省流量更新,大幅节省下载时耗费的流量;2. 调整首页显示机制,频道一目了然;3. 已ROOT手机可以自动安装;4. 优化下载机制,提升稳定性;5. 优化下载任务的进度展示;6. 完善主题细节,界面更显协调。安智市场4.1更新:1.根据安卓4.0系统设计的全新界面; 2.优化专题页面,内容更加完整; 3.优化分类页面,寻找软件更加容易;4.新增搜索热词榜和语音搜索功能; 5.新增"移动到SD卡"功能; 6.新增手势操作功能; 7.优化管理界面,管理软件更省心。
魅族PRO 6(全网通)安智市场截图
看了魅族PRO 6(全网通)安智市场的用户还看了
发表点评:
个用户点评,综合评分
个用户点评,综合评分
APK安装包本地下载地址:
扫描二维码可下载应用到手机
没有二维码识别应用
|||京公网安备:
北京海淀区知春路113号银网中心A座9F|服务热线:010-|传真:010-|我的网站搭建(第23天) 第三方登录:QQ&-&杨仕航的博客
6月底的时候,我就想加上用QQ登录的功能。跑去查看官方文档(一下被文档淹没了),注册了QQ互联、查了其他人写的代码、填了不少坑,终于写出来了。(工作也比较忙,实际开发差不多几天时间)。坑填好了,写出来,让更少人掉到坑里面。一开始设想是用QQ登录之后,获取QQ邮箱。用这个QQ邮箱作为账号名登录或者注册。在开发的过程中,发现获取不到QQ号,只能获取一个OpenID的东西。最后采取存储这个OpenID并绑定对应账号的方式。所以需要创建对应的模型,即创建一个应用管理第三方登录。QQ登录功能开发流程如下图(结合你的网站设计可能不太一样):第1步、QQ互联注册网站应用打开,进入管理中心。注册一下应用开发者,并添加网站应用。这里比较简单,需要注意的地方是网站信息。网站地址需要验证一下,按照提示处理即可。对于刚接触这个第三方登录的新手,最难理解的就是回调地址。回调地址不要填网站域名。理解回调地址需要了解一下OAuth协议。在你的网站页面里面,打开授权页面(这个授权页面不是回调地址)。在授权页面里面,登录QQ并确认授权。授权之后,会得到一个授权码。回调地址就是用于接收这个授权码。授权码以GET的方式返回,例如&http://yshblog.com/oauth/qq_check?code=xxxxxxxxxxxxx通过这种方式,可以获取授权码,所以需要提供一个地址。这个地址先写一个暂时没有的地址,后面开发的时候,再给这个地址写对应的响应方法。第2步、放置QQ按钮这个QQ按钮是提供QQ登录的入口。从腾讯提供的下载放到你的登录页面即可。不用看帮助文档里面的什么前端代码。这些用不上,只需要加一个固定的访问链接,再重定向即可。我前端页面此处的代码如下:&div&
&&&&&span&其它账号登录:&/span&
&&&&&a&href=&{%&url&'qq_login'&%}&&title=&QQ登录&&
&&&&&&&&&img&src=&/static/img/connect/logo_qq.png&&alt=&QQ登录&&
&/div&qq_login链接在下面第3步创建oauth应用里面设置。第3步、创建oauth应用怎么创建应用就不细说了,这是基本功。我创建的应用名为oauth,打算后面把微博登录、Github登录什么都放到这里。创建完成之后,打开models.py文件,编写模型:#coding:utf-8
from&django.db&import&models
from&django.contrib.auth.models&import&User
class&OAuth_ex(models.Model):
&&&&&&&User&models&ex&&&
&&&&user&=&models.ForeignKey(User)&&&#和User关联的外键
&&&&qq_openid&=&models.CharField(max_length&=&64)&#QQ的关联OpenID
&&&&def&__unicode__(self):
&&&&&&&&return&u'&%s&'&%&(self.user)该模型用于存储QQ登录返回的OpenID值。这个OpenID值是用QQ号一一对应。腾讯不给得到真实QQ号可能是出于保护隐私的考虑。再打开urls.py文件,先写一下需要哪些链接地址:from&django.conf.urls&import&include,&url
#http://localhost:8000/oauth/
#start&with&'oauth/'
urlpatterns&=&[
&&&&url(r'qq_login',&'oauth.views.qq_login',&name='qq_login'),
&&&&url(r'qq_check',&'oauth.views.qq_check',&name='qq_check'),
&&&&url(r'bind_email',&'oauth.views.bind_email',&name='bind_email'),
]qq_login和qq_check前面有说到,分别是打开授权页面和回调地址。bind_email是绑定邮箱的页面。大致思路是授权之后,得到OpenID。判断这个OpenID是否存在数据库中。若存在,则直接登录对应的用户即可;若不存在,则打开这个绑定邮箱页面,绑定对应的用户。同时,在总的urls路由中,加入这个应用路由。(总路由在和工程名一样的文件夹中的urls.py文件。我比较喜欢这种方式,对urls管理比较清晰)urlpatterns&=&[
&&&&url(r'^oauth/',include('oauth.urls')),
]这个路由控制,大家根据自己的工程自己写即可。第4步、开发OAuth登录功能该部分写的代码有点多,纠结怎么写博文才能比较好的表达式思路。先采取拆散代码讲解,最后再给出完整代码。为了管理好OAuth,在oauth应用的文件夹下创建oauth_client.py文件。把相关的OAuth操作方法集成在一起。编辑oauth_client.py文件:#coding:utf-8
import&json
import&urllib,&urllib2,&urlparse
class&OAuth_QQ():
&&&&def&__init__(self,&client_id,&client_key,&redirect_uri):
&&&&&&&&self.client_id&=&client_id
&&&&&&&&self.client_key&=&client_key
&&&&&&&&self.redirect_uri&=&redirect_uri
&&&&def&get_auth_url(self):
&&&&&&&&&&&获取授权页面的网址&&&
&&&&&&&&params&=&{'client_id':&self.client_id,
&&&&&&&&&&&&&&&&&&'response_type':&'code',
&&&&&&&&&&&&&&&&&&'redirect_uri':&self.redirect_uri,
&&&&&&&&&&&&&&&&&&'scope':&'get_user_info',
&&&&&&&&&&&&&&&&&&'state':&1}
&&&&&&&&url&=&'https://graph.qq.com/oauth2.0/authorize?%s'&%&urllib.urlencode(params)
&&&&&&&&return&url创建一个类,需要申请QQ登录的APP_ID、APP_KEY和回调地址。这些都是固定的,我把这几个常量放入到settings.py中。settings.py添加如下常量,具体的值请在你的申请页面查找:#OAuth设置
QQ_APP_ID&=&'xxxxx'
QQ_KEY&=&'xxxxxxxxxxxxxxxxxx'
QQ_RECALL_URL&=&'http://yshblog.com/oauth/qq_check'回到OAuth_QQ类,现里面有个get_auth_url方法。该方法是获取打开授权页面的链接地址。(可参考,写得不够清晰)接着,在编辑oauth应用的views.py文件,加入qq_login对应的响应方法:#coding:utf-8
from&django.http&import&HttpResponseRedirect
from&django.conf&import&settings
from&oauth_client&import&OAuth_QQ
#http://yshblog.com/oauth/qq_login
def&qq_login(request):
&&&&oauth_qq&=&OAuth_QQ(settings.QQ_APP_ID,&settings.QQ_KEY,&settings.QQ_RECALL_URL)
&&&&#获取&得到Authorization&Code的地址
&&&&url&=&oauth_qq.get_auth_url()
&&&&#重定向到授权页面
&&&&return&HttpResponseRedirect(url)到这里为止,就完成了点击QQ登录按钮,跳转到授权页面。登录授权之后,授权页面会自动跳转到我们设置的回调地址。例如 http://yshblog.com/oauth/qq_check?code=xxxxxxxxxxxxx我们可以获取这个地址上面的GET参数。先假设我们可以顺利获取到,继续完善OAuth_QQ类。拿到这个授权码之后,需要用该码获取腾讯的access_token通行令牌。(认证步骤有点多,好麻烦)打开oauth_client.py文件,在OAuth_QQ类添加如下方法:def&get_access_token(self,&code):
&&&&&&&根据code获取access_token&&&
&&&&params&=&{'grant_type':&'authorization_code',
&&&&&&&&&&&&&&'client_id':&self.client_id,
&&&&&&&&&&&&&&'client_secret':&self.client_key,
&&&&&&&&&&&&&&'code':&code,
&&&&&&&&&&&&&&'redirect_uri':&self.redirect_uri}
&&&&url&=&'https://graph.qq.com/oauth2.0/token?%s'&%&urllib.urlencode(params)
&&&&#访问该网址,获取access_token
&&&&response&=&urllib2.urlopen(url).read()
&&&&result&=&urlparse.parse_qs(response,&True)
&&&&access_token&=&str(result['access_token'][0])
&&&&self.access_token&=&access_token
&&&&return&access_token该方法使用了urllib2,在服务器后台访问对应的链接,获取access_token,并返回该值。因为我后续不需要用access_token做其他动作,直接一次性获取QQ昵称和OpenID。所以不用记录这个通行令牌的有效期。得到这个access_token之后,就可以做其他事了。首先需要获取授权用户的OpenID,本来这里我想获取QQ号的,而腾讯不允许。只好退而求次,获取并保存OpenID。可参考。继续给这个OAuth_QQ添加获取OpenID的方法和使用OpenID获取QQ基本信息的方法:def&get_open_id(self):
&&&&&&&获取QQ的OpenID&&&
&&&&params&=&{'access_token':&self.access_token}
&&&&url&=&'https://graph.qq.com/oauth2.0/me?%s'&%&urllib.urlencode(params)
&&&&response&=&urllib2.urlopen(url).read()
&&&&v_str&=&str(response)[9:-3]&#去掉callback的字符
&&&&v_json&=&json.loads(v_str)
&&&&openid&=&v_json['openid']
&&&&self.openid&=&openid
&&&&return&openid
def&get_qq_info(self):
&&&&&&&获取QQ用户的资料信息&&&
&&&&params&=&{'access_token':&self.access_token,
&&&&&&&&&&&&&&'oauth_consumer_key':&self.client_id,
&&&&&&&&&&&&&&'openid':&self.openid}
&&&&url&=&'https://graph.qq.com/user/get_user_info?%s'&%&urllib.urlencode(params)
&&&&response&=&urllib2.urlopen(url).read()
&&&&return&json.loads(response)这里有一个坑,腾讯返回OpenID和QQ基本信息的内容格式都不一样。再回头编辑views.py,添加回调地址的处理方法:#coding:utf-8
from&django.http&import&HttpResponseRedirect
from&django.core.urlresolvers&import&reverse&#url逆向解析
from&django.contrib.auth.models&import&User
from&django.contrib.auth&import&logout,authenticate,login
from&django.conf&import&settings
from&oauth_client&import&OAuth_QQ
from&oauth.models&import&OAuth_ex
from&oauth.forms&import&BindEmail
import&time
def&qq_check(request):
&&&&&&&登录之后,会跳转到这里。需要判断code和state&&&
&&&&request_code&=&request.GET.get('code')
&&&&oauth_qq&=&OAuth_QQ(settings.QQ_APP_ID,&settings.QQ_KEY,&settings.QQ_RECALL_URL)
&&&&#获取access_token
&&&&access_token&=&oauth_qq.get_access_token(request_code)
&&&&time.sleep(0.05) #稍微休息一下,避免发送urlopen的10060错误
&&&&open_id&=&oauth_qq.get_open_id()&&&&
&&&&#检查open_id是否存在
&&&&qqs&=&OAuth_ex.objects.filter(qq_openid&=&open_id)
&&&&if&qqs:
&&&&&&&&#存在则获取对应的用户,并登录
&&&&&&&&user&=&qqs[0].user
&&&&&&&&#设置backend,绕开authenticate验证
&&&&&&&&setattr(user,&'backend',&'django.contrib.auth.backends.ModelBackend')
&&&&&&&&login(request,&user)
&&&&&&&&return&HttpResponseRedirect('/')
&&&&&&&&#不存在,则跳转到绑定邮箱页面
&&&&&&&&infos&=&oauth_qq.get_qq_info()&&&&#获取用户信息
&&&&&&&&url&=&'%s?open_id=%s&nickname=%s'&%&(reverse('bind_email'),&open_id,&infos['nickname'])
&&&&&&&&return&HttpResponseRedirect(url)这里有两个坑在等着大家。按照思路,授权之后,调整到处理授权结果的页面。获取授权码之后,用get_access_token方法得到access_token。再用access_token获取OpenID。第一个坑出现了,若不加time.sleep(0.05)休息一下的话,会得到urlopen 10060错误。获取到open_id之后,再判断一下数据库中是否存在。若存在,则已经关联对应的用户了,直接登录该用户。第二个坑跳出来了,login方法登录需要先进行authenticate方法验证。authenticate方法验证需要知道用户名和密码,而此处的密码是无法获取到明文密码。找了很多资料,发现authenticate方法得到的user对象和普通的user对象多了一个backend参数。手动设置一下这个参数,则可以顺利使用login方法登录该用户。若open_id不存在,则跳转到绑定邮箱的页面。该页面需要知道open_id和QQ昵称(为什么需要QQ昵称,下一步会提到)。通过GET方式,把这两个参数写在链接上即可传递过去。这里还需要提一下,本地调试的方法。因为授权之后是调整到部署之后的网站上,而部署的网站还没开发响应的代码,无法响应对应的地址。查到可以修改host方法进行本地调试,不过有点麻烦。可以这样:先本地打开授权页面授权,得到一个回调地址。回调地址上有授权码,如下图:然后,复制授权码,手动写上对应的本地回调地址,替换其中的code参数值。如下图:即可实现本地调试。第5步、绑定用户上面提到若open_id在数据库中不存在,则打开绑定用户页面。该页面我设计成form表单,在oauth应用下新建forms.py文件。如下代码:#coding:utf-8
from&django&import&forms
from&django.core.exceptions&import&ValidationError
from&django.contrib.auth.models&import&User
from&django.contrib.auth&import&authenticate
from&oauth.models&import&OAuth_ex
class&BindEmail(forms.Form):
&&&&&&&bind&the&openid&to&email&&&
&&&&qq_openid&=&forms.CharField(widget=forms.HiddenInput(attrs={'id':'qq_openid'}))
&&&&qq_nickname&=&forms.CharField(widget=forms.HiddenInput(attrs={'id':'qq_nickname'}))
&&&&email&=&forms.EmailField(label=u'注册邮箱',&
&&&&&&&&widget=forms.EmailInput(attrs={'class':'form-control',&'id':'email','placeholder':u'请输入您注册用的邮箱'}))
&&&&pwd&=&forms.CharField(label=u'用户密码',&max_length=36,
&&&&&&&&widget=forms.PasswordInput(attrs={'class':'form-control',&'id':'pwd','placeholder':u'若尚未注册过,该密码则作为用户密码'}))
&&&&#验证邮箱
&&&&def&clean_email(self):
&&&&&&&&qq_openid&=&self.cleaned_data.get('qq_openid')
&&&&&&&&email&=&self.cleaned_data.get('email')
&&&&&&&&users&=&User.objects.filter(email&=&email)
&&&&&&&&if&users:
&&&&&&&&&&&&#判断是否被绑定了
&&&&&&&&&&&&if&OAuth_ex.objects.filter(user&=&users[0]):
&&&&&&&&&&&&&&&&raise&ValidationError(u'该邮箱已经被绑定了')
&&&&&&&&return&email
&&&&#验证密码
&&&&def&clean_pwd(self):
&&&&&&&&email&=&self.cleaned_data.get('email')
&&&&&&&&pwd&=&self.cleaned_data.get('pwd')
&&&&&&&&users&=&User.objects.filter(email&=&email)
&&&&&&&&if&users:
&&&&&&&&&&&&#若用户存在,判断密码是否正确
&&&&&&&&&&&&user&=&authenticate(username=email,&password=pwd)
&&&&&&&&&&&&if&user&is&not&None:
&&&&&&&&&&&&&&&&return&pwd
&&&&&&&&&&&&else:
&&&&&&&&&&&&&&&&return&ValidationError(u'密码不正确,不能绑定')该表单有4个字段。open_id和QQ昵称用hidden字段隐藏。另外邮箱和密码是验证对应用户的。接着,在views.py继续编辑,添加表单处理的对应方法:#coding:utf-8
from&django.http&import&HttpResponse,HttpResponseRedirect
from&django.shortcuts&import&render_to_response,&render
from&django.core.urlresolvers&import&reverse&#url逆向解析
from&django.contrib.auth.models&import&User
from&django.contrib.auth&import&logout,authenticate,login
from&django.conf&import&settings
from&oauth_client&import&OAuth_QQ
from&oauth.models&import&OAuth_ex
from&oauth.forms&import&BindEmail
from&user_ex.views&import&get_active_code,&send_active_email
import&time
def&bind_email(request):
&&&&open_id&=&request.GET.get('open_id')
&&&&nickname&=&request.GET.get('nickname')
&&&&data&=&{}
&&&&data['form_title']&=&u'绑定用户'
&&&&data['submit_name']&=&u' 确定 '
&&&&data['form_tip']&=&u'Hi,&&span&class=&label&label-info&&&img&src=&/static/img/connect/logo_qq.png&&%s&/span&!您已登录。请绑定用户,完成QQ登录'&%&nickname
&&&&if&request.method&==&'POST':
&&&&&&&&#表单提交
&&&&&&&&form&=&BindEmail(request.POST)
&&&&&&&&#验证是否合法
&&&&&&&&if&form.is_valid():
&&&&&&&&&&&&#判断邮箱是否注册了
&&&&&&&&&&&&qq_openid&=&form.cleaned_data['qq_openid']
&&&&&&&&&&&&qq_nickname&=&form.cleaned_data['qq_nickname']
&&&&&&&&&&&&email&=&form.cleaned_data['email']
&&&&&&&&&&&&pwd&=&form.cleaned_data['pwd']
&&&&&&&&&&&&users&=&User.objects.filter(email&=&email)
&&&&&&&&&&&&if&users:
&&&&&&&&&&&&&&&&#用户存在,则直接绑定
&&&&&&&&&&&&&&&&user&=&users[0]
&&&&&&&&&&&&&&&&if&not&user.first_name:
&&&&&&&&&&&&&&&&&&&&user.first_name&=&qq_nickname&&&&#更新昵称
&&&&&&&&&&&&&&&&&&&&user.save()
&&&&&&&&&&&&&&&&data['message']&=&u'绑定账号成功,绑定到%s”'&%&email
&&&&&&&&&&&&else:
&&&&&&&&&&&&&&&&#用户不存在,则注册,并发送激活邮件
&&&&&&&&&&&&&&&&user=User(username=email,&email=email)
&&&&&&&&&&&&&&&&user.first_name&=&qq_nickname&#使用QQ昵称作为昵称
&&&&&&&&&&&&&&&&user.set_password(pwd)
&&&&&&&&&&&&&&&&user.is_active=False
&&&&&&&&&&&&&&&&user.save()
&&&&&&&&&&&&&&&&#发送激活邮件
&&&&&&&&&&&&&&&&try:
&&&&&&&&&&&&&&&&&&&&active_code=get_active_code(email)
&&&&&&&&&&&&&&&&&&&&send_active_email(email,active_code)
&&&&&&&&&&&&&&&&except:
&&&&&&&&&&&&&&&&&&&&pass
&&&&&&&&&&&&&&&&data['message']&=&u'绑定账号成功,绑定到%s。&br&并发送激活邮件到该邮箱”'&%&email
&&&&&&&&&&&&#绑定用户并
&&&&&&&&&&&&oauth_ex&=&OAuth_ex(user&=&user,&qq_openid&=&qq_openid)
&&&&&&&&&&&&oauth_ex.save()
&&&&&&&&&&&&
&&&&&&&&&&&&#登录用户
&&&&&&&&&&&&user&=&authenticate(username=email,&password=pwd)
&&&&&&&&&&&&if&user&is&not&None:
&&&&&&&&&&&&&&&&login(request,&user)
&&&&&&&&&&&&#页面提示
&&&&&&&&&&&&data['goto_url']&=&'/'
&&&&&&&&&&&&data['goto_time']&=&3000
&&&&&&&&&&&&data['goto_page']&=&True
&&&&&&&&&&&&
&&&&&&&&&&&&return&render_to_response('message.html',data)
&&&&&&&&#正常加载
&&&&&&&&form&=&BindEmail(initial={
&&&&&&&&&&&&'qq_openid':&open_id,
&&&&&&&&&&&&'qq_nickname':&nickname,
&&&&&&&&&&&&})
&&&&data['form']&=&form
&&&&return&render(request,&'form.html',&data)此处的处理逻辑是判断邮箱是否注册了,若注册了就判断密码是否正确,正确就绑定;不正确就提示。若没有注册,则直接使用邮箱和密码注册用户,发送激活码。(发送激活邮件可参考《》)注册的时候,我是采用邮箱作为账号。昵称可以直接使用QQ昵称。当然这里还需要把QQ昵称显示出来,要不然申请QQ登录审核通不过。这里使用到两个模版form.html和message.html。form.html是通用的表单模版:{%&extends&&base.html&&%}
{%&block&title&%}杨仕航的博客{%&endblock&%}
{%&block&content&%}
&&&&{#通用表单页面#}
&&&&&div&class=&row&&
&&&&&&&&&div&class=&col-md-6&col-md-offset-3&&&
&&&&&&&&&&&&&div&id=&panel_form&&class=&panel&panel-default&&
&&&&&&&&&&&&&div&class=&panel-body&&
&&&&&&&&&&&&&h3&class=&form_title&&{{form_title}}&/h3&
&&&&&&&&&&&&&p&{{form_tip|safe}}&/p&
&&&&&&&&&&&&&form&class=&main_form&&method='post'&
&&&&&&&&&&&&&&&&{%csrf_token%}
&&&&&&&&&&&&&&&&{%&for&field&in&form&%}
&&&&&&&&&&&&&&&&&&&&{#&区分是否是hidden字段&#}
&&&&&&&&&&&&&&&&&&&&{%&if&field.is_hidden&%}
&&&&&&&&&&&&&&&&&&&&&&&&{{&field&}}
&&&&&&&&&&&&&&&&&&&&{%&else&%}
&&&&&&&&&&&&&&&&&&&&&&&&&div&class=&input-group&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&label&class=&input-group-addon&&for=&{{&field.id_for_label&}}&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{{&field.label&}}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/label&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&{{&field&}}
&&&&&&&&&&&&&&&&&&&&&&&&&/div&
&&&&&&&&&&&&&&&&&&&&&&&&{#&错误提示信息&#}
&&&&&&&&&&&&&&&&&&&&&&&&&p&class=&text-danger&text-right&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&{{&field.errors.as_text&}}
&&&&&&&&&&&&&&&&&&&&&&&&&/p&
&&&&&&&&&&&&&&&&&&&&{%endif%}
&&&&&&&&&&&&&&&&{%endfor%}
&&&&&&&&&&&&&&&&&div&class=&text-right&&
&&&&&&&&&&&&&&&&&&&&&input&class=&btn&btn-primary&&id=&btn_submit&&type=&submit&&value=&{{submit_name}}&/&
&&&&&&&&&&&&&&&&&/div&
&&&&&&&&&&&&&/form&
&&&&&&&&&&&&&/div&
&&&&&&&&&&&&&/div&
&&&&&&&&&/div&
&&&&&/div&
{%&endblock&%}
{%&block&extra_footer&%}
&&&&&style&type=&text/css&&
&&&&&&&&.form_title{
&&&&&&&&&&&&margin-bottom:&1
&&&&&&&&&&&&padding-bottom:&0.5
&&&&&&&&&&&&border-bottom:&1px&#ccc&
&&&&&&&&.main_form&div{
&&&&&&&&&&&&margin-top:1
&&&&&&&&#btn_submit{
&&&&&&&&&&&&margin-top:&1
&&&&&&&&#panel_form{
&&&&&&&&&&&&margin-top:&2
&&&&&&&&&&&&margin-bottom:&3
&&&&&/style&
{%&endblock&%}message.html是显示消息用的模版:{%&extends&&base.html&&%}
{%&block&title&%}杨仕航的博客{%&endblock&%}
{%&block&content&%}
&&&&{#显示消息的页面#}
&&&&&div&class=&row&&
&&&&&&&&&center&&h4&style=&line-height:300%;&&{{message|safe}}&/h4&&/center&
&&&&&/div&
{%&endblock&%}
{%&block&extra_footer&%}
&&&&&script&type=&text/javascript&&
&&&&&&&&{#页面调整控制#}
&&&&&&&&{%&if&goto_page&%}
&&&&&&&&&&&&$(function(){
&&&&&&&&&&&&&&&&window.setTimeout(function(){&
&&&&&&&&&&&&&&&&&&&&window.location&=&'{{goto_url}}';
&&&&&&&&&&&&&&&&},{{goto_time}});
&&&&&&&&&&&&});
&&&&&&&&{%&endif&%}
&&&&&/script&
{%&endblock&%}绑定用户的界面如下:写完代码之后,本地测试可以通过。最后再部署到服务器并在QQ互联提交审核。一般审核要1~2天左右。若审核不通过,又不明白审核说明,就直接找客服问问。-----&我是分割线,下面是view.py和oauth_client.py完整的代码&-----views.py:#coding:utf-8
from&django.http&import&HttpResponse,HttpResponseRedirect
from&django.shortcuts&import&render_to_response,&render
from&django.core.urlresolvers&import&reverse&#url逆向解析
from&django.contrib.auth.models&import&User
from&django.contrib.auth&import&logout,authenticate,login
from&django.conf&import&settings
from&oauth_client&import&OAuth_QQ
from&oauth.models&import&OAuth_ex
from&oauth.forms&import&BindEmail
from&user_ex.views&import&get_active_code,&send_active_email
import&time
#http://yshblog.com/oauth/qq_login
def&qq_login(request):
&&&&oauth_qq&=&OAuth_QQ(settings.QQ_APP_ID,&settings.QQ_KEY,&settings.QQ_RECALL_URL)
&&&&#获取&得到Authorization&Code的地址
&&&&url&=&oauth_qq.get_auth_url()
&&&&#重定向到授权页面
&&&&return&HttpResponseRedirect(url)
def&qq_check(request):
&&&&&&&登录之后,会跳转到这里。需要判断code和state&&&
&&&&request_code&=&request.GET.get('code')
&&&&oauth_qq&=&OAuth_QQ(settings.QQ_APP_ID,&settings.QQ_KEY,&settings.QQ_RECALL_URL)
&&&&#获取access_token
&&&&access_token&=&oauth_qq.get_access_token(request_code)
&&&&time.sleep(0.05) #稍微休息一下,避免发送urlopen的10060错误
&&&&open_id&=&oauth_qq.get_open_id()&&&&
&&&&#检查open_id是否存在
&&&&qqs&=&OAuth_ex.objects.filter(qq_openid&=&open_id)
&&&&if&qqs:
&&&&&&&&#存在则获取对应的用户,并登录
&&&&&&&&user&=&qqs[0].user
&&&&&&&&#设置backend,绕开authenticate验证
&&&&&&&&setattr(user,&'backend',&'django.contrib.auth.backends.ModelBackend')
&&&&&&&&login(request,&user)
&&&&&&&&return&HttpResponseRedirect('/')
&&&&&&&&#不存在,则跳转到绑定邮箱页面
&&&&&&&&infos&=&oauth_qq.get_qq_info()&&&&#获取用户信息
&&&&&&&&url&=&'%s?open_id=%s&nickname=%s'&%&(reverse('bind_email'),&open_id,&infos['nickname'])
&&&&&&&&return&HttpResponseRedirect(url)
def&bind_email(request):
&&&&open_id&=&request.GET.get('open_id')
&&&&nickname&=&request.GET.get('nickname')
&&&&data&=&{}
&&&&data['form_title']&=&u'绑定用户'
&&&&data['submit_name']&=&u' 确定 '
&&&&data['form_tip']&=&u'Hi,&&span&class=&label&label-info&&&img&src=&/static/img/connect/logo_qq.png&&%s&/span&!您已登录。请绑定用户,完成QQ登录'&%&nickname
&&&&if&request.method&==&'POST':
&&&&&&&&#表单提交
&&&&&&&&form&=&BindEmail(request.POST)
&&&&&&&&#验证是否合法
&&&&&&&&if&form.is_valid():
&&&&&&&&&&&&#判断邮箱是否注册了
&&&&&&&&&&&&qq_openid&=&form.cleaned_data['qq_openid']
&&&&&&&&&&&&qq_nickname&=&form.cleaned_data['qq_nickname']
&&&&&&&&&&&&email&=&form.cleaned_data['email']
&&&&&&&&&&&&pwd&=&form.cleaned_data['pwd']
&&&&&&&&&&&&users&=&User.objects.filter(email&=&email)
&&&&&&&&&&&&if&users:
&&&&&&&&&&&&&&&&#用户存在,则直接绑定
&&&&&&&&&&&&&&&&user&=&users[0]
&&&&&&&&&&&&&&&&if&not&user.first_name:
&&&&&&&&&&&&&&&&&&&&user.first_name&=&qq_nickname&&&&#更新昵称
&&&&&&&&&&&&&&&&&&&&user.save()
&&&&&&&&&&&&&&&&data['message']&=&u'绑定账号成功,绑定到%s”'&%&email
&&&&&&&&&&&&else:
&&&&&&&&&&&&&&&&#用户不存在,则注册,并发送激活邮件
&&&&&&&&&&&&&&&&user=User(username=email,&email=email)
&&&&&&&&&&&&&&&&user.first_name&=&qq_nickname&#使用QQ昵称作为昵称
&&&&&&&&&&&&&&&&user.set_password(pwd)
&&&&&&&&&&&&&&&&user.is_active=False
&&&&&&&&&&&&&&&&user.save()
&&&&&&&&&&&&&&&&#发送激活邮件
&&&&&&&&&&&&&&&&try:
&&&&&&&&&&&&&&&&&&&&active_code=get_active_code(email)
&&&&&&&&&&&&&&&&&&&&send_active_email(email,active_code)
&&&&&&&&&&&&&&&&except:
&&&&&&&&&&&&&&&&&&&&pass
&&&&&&&&&&&&&&&&data['message']&=&u'绑定账号成功,绑定到%s。&br&并发送激活邮件到该邮箱”'&%&email
&&&&&&&&&&&&#绑定用户并
&&&&&&&&&&&&oauth_ex&=&OAuth_ex(user&=&user,&qq_openid&=&qq_openid)
&&&&&&&&&&&&oauth_ex.save()
&&&&&&&&&&&&
&&&&&&&&&&&&#登录用户
&&&&&&&&&&&&user&=&authenticate(username=email,&password=pwd)
&&&&&&&&&&&&if&user&is&not&None:
&&&&&&&&&&&&&&&&login(request,&user)
&&&&&&&&&&&&#页面提示
&&&&&&&&&&&&data['goto_url']&=&'/'
&&&&&&&&&&&&data['goto_time']&=&3000
&&&&&&&&&&&&data['goto_page']&=&True
&&&&&&&&&&&&
&&&&&&&&&&&&return&render_to_response('message.html',data)
&&&&&&&&#正常加载
&&&&&&&&form&=&BindEmail(initial={
&&&&&&&&&&&&'qq_openid':&open_id,
&&&&&&&&&&&&'qq_nickname':&nickname,
&&&&&&&&&&&&})
&&&&data['form']&=&form
&&&&return&render(request,&'form.html',&data)oauth_client.py:#coding:utf-8
import&json
import&urllib,&urllib2,&urlparse
class&OAuth_QQ():
&&&&def&__init__(self,&client_id,&client_key,&redirect_uri):
&&&&&&&&self.client_id&=&client_id
&&&&&&&&self.client_key&=&client_key
&&&&&&&&self.redirect_uri&=&redirect_uri
&&&&def&get_auth_url(self):
&&&&&&&&&&&获取授权页面的网址&&&
&&&&&&&&params&=&{'client_id':&self.client_id,
&&&&&&&&&&&&&&&&&&'response_type':&'code',
&&&&&&&&&&&&&&&&&&'redirect_uri':&self.redirect_uri,
&&&&&&&&&&&&&&&&&&'scope':&'get_user_info',
&&&&&&&&&&&&&&&&&&'state':&1}
&&&&&&&&url&=&'https://graph.qq.com/oauth2.0/authorize?%s'&%&urllib.urlencode(params)
&&&&&&&&return&url
&&&&def&get_access_token(self,&code):
&&&&&&&&&&&根据code获取access_token&&&
&&&&&&&&params&=&{'grant_type':&'authorization_code',
&&&&&&&&&&&&&&&&&&'client_id':&self.client_id,
&&&&&&&&&&&&&&&&&&'client_secret':&self.client_key,
&&&&&&&&&&&&&&&&&&'code':&code,
&&&&&&&&&&&&&&&&&&'redirect_uri':&self.redirect_uri}
&&&&&&&&url&=&'https://graph.qq.com/oauth2.0/token?%s'&%&urllib.urlencode(params)
&&&&&&&&#访问该网址,获取access_token
&&&&&&&&response&=&urllib2.urlopen(url).read()
&&&&&&&&result&=&urlparse.parse_qs(response,&True)
&&&&&&&&access_token&=&str(result['access_token'][0])
&&&&&&&&self.access_token&=&access_token
&&&&&&&&return&access_token
&&&&def&get_open_id(self):
&&&&&&&&&&&获取QQ的OpenID&&&
&&&&&&&&params&=&{'access_token':&self.access_token}
&&&&&&&&url&=&'https://graph.qq.com/oauth2.0/me?%s'&%&urllib.urlencode(params)
&&&&&&&&response&=&urllib2.urlopen(url).read()
&&&&&&&&v_str&=&str(response)[9:-3]&#去掉callback的字符
&&&&&&&&v_json&=&json.loads(v_str)
&&&&&&&&openid&=&v_json['openid']
&&&&&&&&self.openid&=&openid
&&&&&&&&return&openid
&&&&def&get_qq_info(self):
&&&&&&&&&&&获取QQ用户的资料信息&&&
&&&&&&&&params&=&{'access_token':&self.access_token,
&&&&&&&&&&&&&&&&&&'oauth_consumer_key':&self.client_id,
&&&&&&&&&&&&&&&&&&'openid':&self.openid}
&&&&&&&&url&=&'https://graph.qq.com/user/get_user_info?%s'&%&urllib.urlencode(params)
&&&&&&&&response&=&urllib2.urlopen(url).read()
&&&&&&&&return&json.loads(response)
(原创博文,转载请注明来自 !本文链接:)
若对你有帮助,不妨扫一扫右侧的打赏支持我 ^_^
1、可在相应的博文底下评论
2、发邮件到

我要回帖

更多关于 安智应用市场 的文章

 

随机推荐