接入微信登录:

1、准备工作
1.在微信开放平台https://open.weixin.qq.com/注册成为开发者。
2.在“管理中心”中创建一个移动应用,需“应用名称、简介、及28*28和108*108的PNG图片各一张,且大小不超过300k”,点击下一步,需“应用官网地址,应用签名及包名”等信息,然后即可提交审核。
说明:
应用签名:可在微信开发平台的资源中心》》资源下载》》中下载“签名生成工具”,用户获取已经安装到手机的第三方应用的签名。输入应用包名,即可获得该应用的签名值。
3.提交审核后,在7个工作日内腾讯将给出审核结果。(通常较快,几个小时就可反馈结果)
2、微信登录接入
微信登录遵循协议Aouth2.0中的授权码模式,先介绍一下Aouth2.0的流程:
3、微信登录的官方文档将微信登录分为3个步骤:
第一步.请求code:
{
// send oauth request
Final SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "wechat_sdk_demo_test";
api.sendReq(req);
}
用这段代码向微信开放平台请求授权码code,可拉起微信并打开授权登录页(前提是你安装了微信应用并已登录,未登录的会引导你先登录)下图:
需要注意的情况:
1.如果微信授权页不显示,请检查你的APP签名是否和你在腾讯开放平台的APP签名一致,不一致可修改腾讯开放平台中的APP签名,修改后重装微信或清除微信数据后重试。
2.在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activity(例如应用程序的包名为net.sourceforge,则新的包名为:net.sourceforge.wxapi),此处应注意包名不要弄错,新增类的名字必须为WXEntryActivity。
返回说明
用户点击授权后,微信客户端会被拉起,跳转至授权界面,用户在该界面点击允许或取消,SDK通过SendAuth的Resp返回数据给调用方。回调WXEntryActivity中的onResp(BaseResp resp)方法,如下:
@Override
public void onResp(BaseResp resp) {
int errorCode = resp.errCode;
switch (errorCode) {
case BaseResp.ErrCode.ERR_OK:
//用户同意
String code = ((SendAuth.Resp) resp).code;
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
//用户拒绝
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
//用户取消
break;
default:
break;
}
ToastUtil.showMessageLong(this, resp.errStr);
}
客户端收到授权码后,向自己的服务器发起登录请求,并附带收到的授权码。
服务端收到登录请求,向微信开放平台请求获取access_token,微信开放平台返回Json字符串:
第二步:通过code获取access_token:
获取第一步的code后,请求以下链接获取access_token:
private String getAccessToken(String code) {
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
URI uri = URI.create(url);
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(uri);
HttpResponse response;
try {
response = client.execute(get);
if (response.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = response.getEntity();
BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));
StringBuilder sb = new StringBuilder();
for (String temp = reader.readLine(); temp != null; temp = reader.readLine()) {
sb.append(temp);
}
JSONObject object = new JSONObject(sb.toString().trim());
accessToken = object.getString("access_token");
openID = object.getString("openid");
refreshToken = object.getString("refresh_token");
expires_in = object.getLong("expires_in");
return accessToken;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
参数说明
参数 是否必须 说明
appid 是 应用唯一标识,在微信开放平台提交应用审核通过后获得
secret 是 应用密钥AppSecret,在微信开放平台提交应用审核通过后获得
code 是 填写第一步获取的code参数
grant_type 是 填authorization_code回说明**
正确的返回:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE",
"unionid":"o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
参数 说明
access_token 接口调用凭证
expires_in access_token 接口调用凭证超时时间,单位(秒)
refresh_token 用户刷新access_token
openid 授权用户唯一标识
scope 用户授权的作用域,使用逗号(,)分隔
unionid 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。
错误返回样例:
{"errcode":40029,"errmsg":"invalid code"}
第三步:通过access_token调用接口
获取access_token后,进行接口调用,有以下前提:
对于接口作用域(scope),能调用的接口有以下:
授权作用域(scope) 接口 接口说明
snsapi_base /sns/oauth2/access_token 通过code换取 access_token、refresh_token和已授权scope
/sns/oauth2/refresh_token 刷新或续期access_token使用
/sns/auth 检查access_token有效性
snsapi_userinfo /sns/userinfo 获取用户个人信息
其中snsapi_base属于基础接口,若应用已拥有其它scope权限,则默认拥有snsapi_base的权限。使用snsapi_base可以让移动端网页授权绕过跳转授权登录页请求用户授权的动作,直接跳转第三方网页带上授权临时票据(code),但会使得用户已授权作用域(scope)仅为snsapi_base,从而导致无法获取到需要用户授权才允许获得的数据和基础功能。
以获取用户信息为例:
private void getUserInfo() {
if (isAccessTokenIsInvalid() && System.currentTimeMillis() < expires_in) {
String uri = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openID;
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(URI.create(uri));
try {
HttpResponse response = client.execute(get);
if (response.getStatusLine().getStatusCode() == 200) {
BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
StringBuilder builder = new StringBuilder();
for (String temp = reader.readLine(); temp != null; temp = reader.readLine()) {
builder.append(temp);
}
JSONObject object = new JSONObject(builder.toString().trim());
String nikeName = object.getString("nickname");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
微信重复登录
假设用户已经获得授权,则下次登录时只需要验证access_token是否有效,无效则重新获取授权,有效则无需重新获得授权。
1.用户向自己的服务器请求登录,登录方式为微信登录,附带上次登录返回的的access_token
2.服务器收到用户的登录请求,向微信开放平台发送access_token是否有效的验证请求如下:
private boolean isAccessTokenIsInvalid() {
String url = "https://api.weixin.qq.com/sns/auth?access_token=" + accessToken + "&openid=" + openID;
URI uri = URI.create(url);
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(uri);
HttpResponse response;
try {
response = client.execute(get);
if (response.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = response.getEntity();
BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));
StringBuilder sb = new StringBuilder();
for (String temp = reader.readLine(); temp != null; temp = reader.readLine()) {
sb.append(temp);
}
JSONObject object = new JSONObject(sb.toString().trim());
int errorCode = object.getInt("errcode");
if (errorCode == 0) {
return true;
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
返回说明
正确的Json返回结果:
{
"errcode":0,"errmsg":"ok"
}
错误的Json返回示例:
{
"errcode":40003,"errmsg":"invalid openid"
}
如果access_token有效,服务端将信息返回给客户端,客户端成功登录。
如果access_token无效,服务端向微信开放平台发送刷新access_token的请求如下:
access_token是调用授权关系接口的调用凭证,由于access_token有效期(目前为2个小时)较短,当access_token超时后,可以使用refresh_token进行刷新,access_token刷新结果有两种:
1.若access_token已超时,那么进行refresh_token会获取一个新的access_token,新的超时时间;
2.若access_token未超时,那么进行refresh_token不会改变access_token,但超时时间会刷新,相当于续期access_token。
刷新token
private void refreshAccessToken() {
String uri = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" + ShareUtil.APP_ID + "&grant_type=refresh_token&refresh_token="
+ refreshToken;
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(URI.create(uri));
try {
HttpResponse response = client.execute(get);
if (response.getStatusLine().getStatusCode() == 200) {
BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
StringBuilder builder = new StringBuilder();
for (String temp = reader.readLine(); temp != null; temp = reader.readLine()) {
builder.append(temp);
}
JSONObject object = new JSONObject(builder.toString().trim());
accessToken = object.getString("access_token");
refreshToken = object.getString("refresh_token");
openID = object.getString("openid");
expires_in = object.getLong("expires_in");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
正确的返回:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
参数 说明
access_token 接口调用凭证
expires_in access_token接口调用凭证超时时间,单位(秒)
refresh_token 用户刷新access_token
openid 授权用户唯一标识
scope 用户授权的作用域,使用逗号(,)分隔
错误返回样例:
{
"errcode":40030,"errmsg":"invalid refresh_token"
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# 微信第三方登录接入
# 接入第三方登录
# app微信第三方登录
# Android微信第三方登录(个人笔记)
# iOS实现第三方微信登录方式实例解析(最新最全)
# iOS微信第三方登录实例
# Android实现使用微信登录第三方APP的方法
# 微信第三方登录Android实现代码
# PHP版微信第三方实现一键登录及获取用户信息的方法
# 友盟 微信第三方登录示例
# 微信网页 第三方登录原理详解
# iOS微信第三方登录实现
# 腾讯
# 自己的
# 客户端
# 跳转
# 第三方
# 服务端
# 帐号
# 拉起
# 样例
# 目录下
# 你在
# 并在
# 这段
# 可在
# 仅为
# 就可
# 不超过
# 只需要
# 可以使用
# 为例
相关文章:
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
大连网站制作公司哪家好一点,大连买房网站哪个好?
如何使用Golang安装API文档生成工具_快速生成接口文档
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
建站之星×万网:智能建站系统+自助建站平台一键生成
整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?
建站之星如何快速解决建站难题?
建站之星如何助力网站排名飙升?揭秘高效技巧
建站之星如何实现PC+手机+微信网站五合一建站?
如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法
建站之星在线客服如何快速接入解答?
如何用已有域名快速搭建网站?
定制建站流程解析:需求评估与SEO优化功能开发指南
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
建站上市公司网站建设方案与SEO优化服务定制指南
如何在阿里云ECS服务器部署织梦CMS网站?
如何确保西部建站助手FTP传输的安全性?
如何选择高效可靠的多用户建站源码资源?
建站之星微信建站一键生成小程序+多端营销系统
定制建站平台哪家好?企业官网搭建与快速建站方案推荐
临沂网站制作公司有哪些,临沂第四中学官网?
建站OpenVZ教程与优化策略:配置指南与性能提升
如何在建站之星绑定自定义域名?
如何快速查询域名建站关键信息?
历史网站制作软件,华为如何找回被删除的网站?
定制建站方案优化指南:企业官网开发与建站费用解析
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
北京建设网站制作公司,北京古代建筑博物馆预约官网?
C#如何序列化对象为XML XmlSerializer用法
如何规划企业建站流程的关键步骤?
建站之星与建站宝盒如何选择最佳方案?
宝塔建站无法访问?如何排查配置与端口问题?
网站制作免费,什么网站能看正片电影?
建站VPS配置与SEO优化指南:关键词排名提升策略
潮流网站制作头像软件下载,适合母子的网名有哪些?
5种Android数据存储方式汇总
如何快速搭建高效WAP手机网站吸引移动用户?
制作网站的公司有哪些,做一个公司网站要多少钱?
青岛网站建设如何选择本地服务器?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
高端企业智能建站程序:SEO优化与响应式模板定制开发
Python文件管理规范_工程实践说明【指导】
网站网页制作专业公司,怎样制作自己的网页?
css网站制作参考文献有哪些,易聊怎么注册?
西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?
阿里云网站制作公司,阿里云快速搭建网站好用吗?
建站主机选择指南:服务器配置与SEO优化实战技巧
*请认真填写需求信息,我们会在24小时内与您取得联系。