电商版微信小程序_谈谈第三方App接入微信登录

摘要: 谈一谈第三方App连接手机微信登陆 讲解 1、提前准备工作中1.在手机微信对外开放服务平台申请注册变成开发设计者。2.在“管理方法管理中心”中建立一个移动智能终端,需“运...

谈谈第三方App接入微信登录 解读       本篇文章主要介绍了谈谈第三方App接入微信登录 解读 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧。

1、准备工作

1.在微信开放平台注册成为开发者。

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 = "";
 req.state = "wechat_sdk_demo_test";
 api.sendReq(req);
}

用这段代码向微信开放平台请求授权码code,可拉起微信并打开授权登录页(前提是你安装了微信应用并已登录,未登录的会引导你先登录)下图:

需要注意的情况:

1.如果微信授权页不显示,请检查你的APP签名是否和你在腾讯开放平台的APP签名一致,不一致可修改腾讯开放平台中的APP签名,修改后重装微信或清除微信数据后重试。

2.在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,..e.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);

客户端收到授权码后,向自己的服务器发起登录请求,并附带收到的授权码。

ess_token,微信开放平台返回Json字符串:

ess_token:

ess_token:

private essToken(String code) {
 String url = "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  ess_token
openid  授权用户唯一标识
scope  用户授权的作用域,使用逗号(,)分隔
unionid  只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。

错误返回样例:

{"errcode":40029,"errmsg":"invalid code"}

ess_token调用接口

access_token有效且未超时; 微信用户已授权给第三方应用帐号相应接口作用域(scope)。

对于接口作用域(scope),能调用的接口有以下:

授权作用域(scope)  接口  接口说明
snsapi_base  /sns/oauth2/access_token  通过code换取  access_token、refresh_token和已授权scope
    /sns/oauth2/refresh_token  ess_token使用
    /sns/auth  检查access_token有效性
    /  获取用户个人信息

其中snsapi_base属于基础接口,若应用已拥有其它scope权限,则默认拥有snsapi_base的权限。使用snsapi_base可以让移动端网页授权绕过跳转授权登录页请求用户授权的动作,直接跳转第三方网页带上授权临时票据(code),但会使得用户已授权作用域(scope)仅为snsapi_base,从而导致无法获取到需要用户授权才允许获得的数据和基础功能。

以获取用户信息为例:

private void getUserInfo() {
 if (isAccessTokenIsInvalid() System.currentTimeMillis() expires_in) {
 String uri = " 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();
 }

微信重复登录

ess_token是否有效,无效则重新获取授权,有效则无需重新获得授权。

1.用户向自己的服务器请求登录,ess_token

2.ess_token是否有效的验证请求如下:

private essTokenIsInvalid() {
 String url = "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"

ess_token有效期(目前为2个小时)ess_token超时后,可以使用refresh_token进行刷新,access_token刷新结果有两种:

ess_token,新的超时时间;

ess_token,ess_token。
刷新token

private essToken() {
 String uri = "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  ess_token
openid  授权用户唯一标识
scope  用户授权的作用域,使用逗号(,)分隔

错误返回样例:

"errcode":40030,"errmsg":"invalid refresh_token"
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持凡科。




联系我们

全国服务热线:4000-399-000 公司邮箱:343111187@qq.com

  工作日 9:00-18:00

关注我们

官网公众号

官网公众号

Copyright?2020 广州凡科互联网科技股份有限公司 版权所有 粤ICP备10235580号 客服热线 18720358503

技术支持:自助建站