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等信息,并返回给客户端,客户端成功登录或者重新获取授权。
更多推荐
微信第三方
发布评论