wifi连接上不能上网-网线接头顺序

微信第三方
2023年4月5日发(作者:360定时关机)

第三⽅App接⼊微信登录解读

准备⼯作

微信登录接⼊

微信登录遵循协议Aouth2.0中的授权码模式

我们来看⼀下Aouth2.0中的授权码模式是怎么定义的:

授权码模式(authorizationcode)是功能最完整、流程最严密的授权模式。它的特点就是通过客户端的后台服务器,与”服务提供商”的认证

服务器进⾏互动。

它的步骤如下:

(A)⽤户访问客户端,后者将前者导向认证服务器。

(B)⽤户选择是否给予客户端授权。

(C)假设⽤户给予授权,认证服务器将⽤户导向客户端事先指定的”重定向URI”(redirectionURI),同时附上⼀个授权码。

(D)客户端收到授权码,附上早先的”重定向URI”,向认证服务器申请令牌。这⼀步是在客户端的后台的服务器上完成的,对⽤户不可见。

(E)认证服务器核对了授权码和重定向URI,确认⽆误后,向客户端发送访问令牌(accesstoken)和更新令牌(refreshtoken)

微信登录的官⽅⽂档将微信登录分为3个步骤:

第⼀步.请求code

{

//sendoauthrequest

=();

="snsapi_userinfo";

="wechat_sdk_demo_test";

q(req);

}

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

录),如下图:

1.如果微信授权页不显⽰,请检查你的APP签名是否和你在腾讯开放平台的APP签名⼀致,不⼀致可修改腾讯开放平台中的APP签名,修改

后重装微信或清除微信数据后重试。

2.在你的包名相应⽬录下新建⼀个wxapi⽬录,并在该wxapi⽬录下新增⼀个WXEntryActivity类,该类继承⾃Activity(例如应⽤程序的包名

为forge,则新的包名为:),此处应注意包名不要弄错,新增类的名字必须为WXEntryActivity。

返回说明

⽤户点击授权后,微信客户端会被拉起,跳转⾄授权界⾯,⽤户在该界⾯点击允许或取消,SDK通过SendAuth的Resp返回数据给调⽤⽅。

回调WXEntryActivity中的onResp(BaseRespresp)⽅法,如下:

@Override

publicvoidonResp(BaseRespresp){

interrorCode=e;

switch(errorCode){

_OK:

//⽤户同意

Stringcode=(()resp).code;

break;

_AUTH_DENIED:

//⽤户拒绝

break;

_USER_CANCEL:

//⽤户取消

break;

default:

break;

}

ssageLong(this,);

}

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

服务端收到登录请求,向微信开放平台请求获取access_token,微信开放平台返回Json字符串:

第⼆步:通过code获取access_token(在⾃⼰服务器端做)

获取第⼀步的code后,请求以下链接获取access_token:

privateStringgetAccessToken(Stringcode){

Stringurl="/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";

URIuri=(url);

HttpClientclient=newDefaultHttpClient();

HttpGetget=newHttpGet(uri);

HttpResponseresponse;

try{

response=e(get);

if(tusLine().getStatusCode()==200){

HttpEntityentity=ity();

BufferedReaderreader=newBufferedReader(newInputStreamReader(tent(),"UTF-8"));

StringBuildersb=newStringBuilder();

for(Stringtemp=ne();temp!=null;temp=ne()){

(temp);

}

JSONObjectobject=newJSONObject(ng().trim());

accessToken=ing("access_token");

openID=ing("openid");

refreshToken=ing("refresh_token");

expires_in=g("expires_in");

returnaccessToken;

}

}catch(ClientProtocolExceptione){

//TODOAuto-generatedcatchblock

tackTrace();

}catch(IOExceptione){

//TODOAuto-generatedcatchblock

tackTrace();

}catch(IllegalStateExceptione){

//TODOAuto-generatedcatchblock

tackTrace();

}catch(JSONExceptione){

//TODOAuto-generatedcatchblock

tackTrace();

}

returnnull;

}

参数说明

参数是否必须说明

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_inaccess_token接⼝调⽤凭证超时时间,单位(秒)

refresh_token⽤户刷新access_token

openid授权⽤户唯⼀标识

scope⽤户授权的作⽤域,使⽤逗号(,)分隔

unionid 只有在⽤户将公众号绑定到微信开放平台帐号后,才会出现该字段。

错误返回样例:

{"errcode":40029,"errmsg":"invalidcode"}

服务端收到返回的access_token,将access_token,expires_in,access_token是否有效等数据返回给客户端,客户端成功登录

客户端可利⽤已有的access_token获取微信⽤户信息

第三步:通过access_token调⽤接⼝

获取access_token后,进⾏接⼝调⽤,有以下前提:

_token有效且未超时;

2.微信⽤户已授权给第三⽅应⽤帐号相应接⼝作⽤域(scope)。

对于接⼝作⽤域(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,从⽽导致⽆法获取到需要⽤户授权才允许获得的数据和基础功能。

以获取⽤户信息为例:

privatevoidgetUserInfo(){

if(isAccessTokenIsInvalid()&&tTimeMillis()

Stringuri="/sns/userinfo?access_token="+accessToken+"&openid="+openID;

HttpClientclient=newDefaultHttpClient();

HttpGetget=newHttpGet((uri));

try{

HttpResponseresponse=e(get);

if(tusLine().getStatusCode()==200){

BufferedReaderreader=newBufferedReader(newInputStreamReader(ity().getContent(),"UTF-8"));

StringBuilderbuilder=newStringBuilder();

for(Stringtemp=ne();temp!=null;temp=ne()){

(temp);

}

JSONObjectobject=newJSONObject(ng().trim());

StringnikeName=ing("nickname");

}

}catch(ClientProtocolExceptione){

//TODOAuto-generatedcatchblock

tackTrace();

}catch(IOExceptione){

//TODOAuto-generatedcatchblock

tackTrace();

}catch(JSONExceptione){

//TODOAuto-generatedcatchblock

tackTrace();

}

}

}

微信重复登录

假设⽤户已经获得授权,则下次登录时只需要验证access_token是否有效,⽆效则重新获取授权,有效则⽆需重新获得授权。

1.⽤户向⾃⼰的服务器请求登录,登录⽅式为微信登录,附带上次登录返回的的access_token

2.服务器收到⽤户的登录请求,向微信开放平台发送access_token是否有效的验证请求如下:

privatebooleanisAccessTokenIsInvalid(){

Stringurl="/sns/auth?access_token="+accessToken+"&openid="+openID;

URIuri=(url);

HttpClientclient=newDefaultHttpClient();

HttpGetget=newHttpGet(uri);

HttpResponseresponse;

try{

response=e(get);

if(tusLine().getStatusCode()==200){

HttpEntityentity=ity();

BufferedReaderreader=newBufferedReader(newInputStreamReader(tent(),"UTF-8"));

StringBuildersb=newStringBuilder();

for(Stringtemp=ne();temp!=null;temp=ne()){

(temp);

}

JSONObjectobject=newJSONObject(ng().trim());

interrorCode=("errcode");

if(errorCode==0){

returntrue;

}

}

}catch(ClientProtocolExceptione){

//TODOAuto-generatedcatchblock

tackTrace();

}catch(IOExceptione){

//TODOAuto-generatedcatchblock

tackTrace();

}catch(JSONExceptione){

//TODOAuto-generatedcatchblock

tackTrace();

}

returnfalse;

}

返回说明

正确的Json返回结果:

{

"errcode":0,"errmsg":"ok"

}

错误的Json返回⽰例:

{

"errcode":40003,"errmsg":"invalidopenid"

}

如果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。

refresh_token拥有较长的有效期(30天),当refresh_token失效的后,需要⽤户重新授权。

privatevoidrefreshAccessToken(){

Stringuri="/sns/oauth2/refresh_token?appid="+APP_ID+"&grant_type=refresh_token&refresh_token="+refreshToken;

HttpClientclient=newDefaultHttpClient();

HttpGetget=newHttpGet((uri));

try{

HttpResponseresponse=e(get);

if(tusLine().getStatusCode()==200){

BufferedReaderreader=newBufferedReader(newInputStreamReader(ity().getContent(),"UTF-8"));

StringBuilderbuilder=newStringBuilder();

for(Stringtemp=ne();temp!=null;temp=ne()){

(temp);

}

JSONObjectobject=newJSONObject(ng().trim());

accessToken=ing("access_token");

refreshToken=ing("refresh_token");

openID=ing("openid");

expires_in=g("expires_in");

}

}catch(ClientProtocolExceptione){

//TODOAuto-generatedcatchblock

tackTrace();

}catch(IOExceptione){

//TODOAuto-generatedcatchblock

tackTrace();

}catch(JSONExceptione){

//TODOAuto-generatedcatchblock

tackTrace();

}

}

返回说明

正确的返回:

{

"access_token":"ACCESS_TOKEN",

"expires_in":7200,

"refresh_token":"REFRESH_TOKEN",

"openid":"OPENID",

"scope":"SCOPE"

}

参数说明

access_token接⼝调⽤凭证

expires_inaccess_token接⼝调⽤凭证超时时间,单位(秒)

refresh_token⽤户刷新access_token

openid授权⽤户唯⼀标识

scope⽤户授权的作⽤域,使⽤逗号(,)分隔

错误返回样例:

{

"errcode":40030,"errmsg":"invalidrefresh_token"

}

3.服务端获取到新的access_token等信息,并返回给客户端,客户端成功登录或者重新获取授权。

更多推荐

微信第三方