安卓 集成微信(一)实现微信登录详解

 
 

集成微信(一)实现微信登录详解

1.原理:

第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;

通过code参数加上AppID和AppSecret等,通过API换取access_token;

通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

2.登录微信开放平台,注册app,申请微信登录并通过审核。获取APPID和appsecret

https://open.weixin.qq.com/cgi-bin/index?t=home/index&lang=zh_CN

3.在资源中心下载sdk,并将jar包放入项目的libs文件夹下,并导入到项目,成功之后可以在项目build.grade文件中看到引用

4.在项目下,新建文件夹和activity,文件名和activity名不可改变,activity布局文件不用编写

5.在配置文件中配置注意AppId换成自己申请的APPID,

 
 
<!--添加权限-->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 微信登录 -->
<activity
android:name=".wxapi.WXEntryActivity"
android:exported="true"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.VIEW" />

<category android:name="android.intent.category.DEFAULT" />

<data android:scheme="wx93f1eefd0bfa2c33" />
</intent-filter>
</activity>

在监听方法中拉起微信登录界面。

 
 
//拉起微信登录界面
/**
* 微信登录方法
*/
private IWXAPI api; // IWXAPI 是第三方app和微信通信的openapi接口
public static final String APP_ID = "wx93f10000000 换成自己的appid";
private void weixinlogin() {

// 通过WXAPIFactory工厂,获取IWXAPI的实例
api = WXAPIFactory.createWXAPI(this, APP_ID, true);
api.registerApp(APP_ID);

SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";//获取个人用户信息的权限
req.state = "wechat_sdk_demo_test";//防止攻击
api.sendReq(req);//向微信发送请求
}

编写WXAEntryActivity类,并将获取到的用户信息上传到自己的服务器。

 
 
/**
* Created by dell on 2017/5/22.
* 集成微信sdk的接口
*/
public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {

public static final String APP_ID = " wx93f10000000 换成自己的appid";// 申请的appid
private IWXAPI api; // IWXAPI 是第三方app和微信通信的openapi接口

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wxentry);

//注册api
api = WXAPIFactory.createWXAPI(this, APP_ID);
api.handleIntent(getIntent(), this);
}

@Override
public void onReq(BaseReq baseReq) {
}

/**
* 发送微信授权请求的响应结果
* @param baseResp
*/
@Override
public void onResp(BaseResp baseResp) {

switch (baseResp.errCode) {
//如果errcode为零,表示用户同意授权
case BaseResp.ErrCode.ERR_OK:
// 得到所需的code
//此处报错检查下载的sdk是否正确
String code = ((SendAuth.Resp) baseResp).code;

Log.i("wxentry","code = "+code);
// 获取code之后携带参数获取用户信息
getToken(code);
break;

default:
break;
}
}

/**
* 携带参数获取用户信息
* @param code
*/
private void getToken(String code) {

//调用官方给的接口获取openid
RequestParams params = new RequestParams(Httpurl.OAUTH);
params.addQueryStringParameter("appid", APP_ID);
//审核通过后生成appsecret码
params.addQueryStringParameter("secret", "981cdce51a3e1d8411111111111 换成你自己申请的appsecret");
params.addQueryStringParameter("code", code);
params.addQueryStringParameter("grant_type", "authorization_code");//固定写法
x.http().get(params, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {

String access_token = "";//接口调用凭证。
String expires_in = "";//接口调用凭证超时时间,单位(秒)。
String refresh_token = "";//用户刷新access_token。
String openid = "";//授权用户唯一标识。
String scope = "";//用户授权的作用域,使用逗号(,)分隔
String unionid = "";//当且仅当该网站应用已获得该用户的userinfo授权时,才会出现该字段。

// 解析数据,获取用户信息
try {
JSONObject job = new JSONObject(result);
access_token = job.getString("access_token");
expires_in = job.getString("expires_in");
refresh_token = job.getString("refresh_token");
openid = job.getString("openid");
scope = job.getString("scope");
unionid = job.getString("unionid");
} catch (JSONException e) {
e.printStackTrace();
}

// 判断openid是否为空
if (!openid.equals("")) {
Log.i("wxentry", access_token + "---" + openid + "---" + expires_in + "---" + refresh_token + "---" + scope + "---" + unionid);

//这个位置调用后台给的登录接口,别忘了登录成功之后finish()当前activity,不然会停留在空白页
//传参给后台,获取返回的token,UID并保存
setLogin(access_token, openid);
} else {
Log.i("wxentry","检查appsecret码是否重置");
//销毁界面
finish();
}
}

@Override
public void onError(Throwable ex, boolean isOnCallback) {
}

@Override
public void onCancelled(CancelledException cex) {
}

@Override
public void onFinished() {
}
});
}

/**
* 授权成功,获取用户信息
* @param access_token
* @param openid
*/
private void setLogin(String access_token, String openid) {

//调用官方给的接口获取用户信息
RequestParams params = new RequestParams(Httpurl.USERINFO);
params.addBodyParameter("access_token",access_token);
params.addBodyParameter("openid",openid);
x.http().get(params, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {

String openid = "";
String nickname = "";//昵称
String headimgurl = "";//头像路径

try {
JSONObject object = new JSONObject(result);
openid = object.getString("openid");
nickname = object.getString("nickname");
headimgurl = object.getString("headimgurl");

} catch (JSONException e) {
e.printStackTrace();
}
// 执行联网方法,将数据传给服务器
skip(openid,nickname,headimgurl);
}

@Override
public void onError(Throwable ex, boolean isOnCallback) {

}

@Override
public void onCancelled(CancelledException cex) {

}

@Override
public void onFinished() {

}
});

}


/**
* 联网上传用户信息
*/
private void skip(String openid, String nickname, String headimgurl) {

//调用后台给的三方登陆的接口,上传用户信息,并获取token保存,销毁界面
RequestParams params = new RequestParams(Httpurl.THIRDLOGIN);
params.addBodyParameter("openid",openid);
params.addBodyParameter("nickname",nickname);
params.addBodyParameter("head_pic",headimgurl);
params.addBodyParameter("oauth","wx");

Log.i("wxtntry","openid:"+openid+" nickname:"+nickname+" headimgurl:"+headimgurl);
x.http().post(params, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
try {
Log.i("wxentry","result"+result);
JSONObject object = new JSONObject(result);

// 如果获取成功
if (object.getInt("status") == 1){
JSONObject data = object.getJSONObject("result");

String token = data.getString("token");

//偏好设置保存user_id
SharedPreferences.Editor editor =
getSharedPreferences("user",MODE_PRIVATE).edit();//文件名为user
editor.putString("token",token);
editor.apply();//提交

// 第一次登录需要给Application赋值
MyApplication.token = token;

Toast.makeText(WXEntryActivity.this,object.getString("msg"),Toast.LENGTH_SHORT).show();
//跳转界面
startActivity(new Intent(WXEntryActivity.this,MainActivity.class));

//销毁当前Activity
finish();
}else {
Toast.makeText(WXEntryActivity.this,"请检查您的网络",Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
e.printStackTrace();
}

}

@Override
public void onError(Throwable ex, boolean isOnCallback) {

}

@Override
public void onCancelled(CancelledException cex) {

}

@Override
public void onFinished() {

}
});

}

}

在app项目中常量类中初始化微信接口,以便代码中调用

 
 
//微信平台给出的接口

//微信登录
//获取微信token及openid
public static final String OAUTH = "https://api.weixin.qq.com/sns/oauth2/access_token";
//获取用户信息的接口
public static final String USERINFO = "https://api.weixin.qq.com/sns/userinfo";


至此微信登录就可以实现啦,如果你关于微信登录还有什么不明白的地方,欢迎留言。

文章不足之处还望指教,共同进步。谢谢!










猜你喜欢

转载自blog.csdn.net/m0_37919094/article/details/72956215