转载自Android接入微信SDK之一:发起微信授权登录
注意:
包名、应用签名、app id 三者都必须和在腾讯上申请的一致!!!否则将不能成功。
包名:就是在腾讯上申请的包名
应用签名:使用微信官网提供的《签名生成工具》(这个工具是一个apk安装包)安装到手机上获取包的签名(先将你的程序安装到手机上,再安装签名生成工具,在工具上输入你程序包名就可以获得)
app id:微信申请后可获得
1.添加sdk:在build.gradle(app)文件中,添加如下依赖即可
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
/*1.微信登录 sdk添加*/
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
testCompile 'junit:junit:4.12'
}
2.添加权限(在AndroidManifest中)
3.创建全局变量存储app_id
/**
* 全局变量
* Created by Administrator on 2017/10/18.
*/
public class Constants {
/**
* 3.创建全局的appId
*/
public static final String APP_ID = "wx_*******"; //替换为申请到的app id
public static IWXAPI wx_api; //全局的微信api对象
}
4.创建微信api并注册到微信,在发送登录请求,一般在onCreate()方法中调用
/**
* 4. 创建微信api并注册到微信
*/
Constants.wx_api = WXAPIFactory.createWXAPI(mContext, Constants.APP_ID, true);
Constants.wx_api.registerApp(Constants.APP_ID);
5.发送登录请求(点击按钮通过微信登录)
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_weixin:
/**
* 5.发送登录请求(在登录前先判断手机是否安装了微信)
*/
if(!ConstantUtils.wx_api.isWXAppInstalled()){
MyToast.makeText(mContext,"未安装微信客户端",Toast.LENGTH_SHORT).show();
return;
}
final SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "wechat_sdk_demo_test";
Constants.wx_api.sendReq(req);
break;
}
}
5.获取微信登录的返回结果
1.在包名下新增wxapi文件夹(这个文件夹名字是微信官方规定的,必须一致)
2.在wxapi文件夹下新增继承于Activity并实现IWXAPIEventHandler接口的WXEntryActivity类(这个类名是微信官方规定的,必须一致)
全部代码
package com.shop.hsz88.wxapi;
import android.app.Activity;
import android.os.Bundle;
import com.shop.hsz88.Constants;
import com.tencent.mm.opensdk.modelbase.BaseReq;
import com.tencent.mm.opensdk.modelbase.BaseResp;
import com.tencent.mm.opensdk.modelmsg.SendAuth;
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.opensdk.utils.Log;
/**
* 6.创建微信返回结果类,并在清单文件中配置
* Created by Administrator on 2017/10/18.
*/
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Constants.wx_api.handleIntent(getIntent(), this);
}
//微信请求相应
@Override
public void onReq(BaseReq baseReq) {
}
//发送到微信请求的响应结果
@Override
public void onResp(BaseResp resp) {
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
Log.i("WXTest","onResp OK");
if(resp instanceof SendAuth.Resp){
SendAuth.Resp newResp = (SendAuth.Resp) resp;
//获取微信传回的code
String code = newResp.code;
Log.i("WXTest","onResp code = "+code);
}
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
Log.i("WXTest","onResp ERR_USER_CANCEL ");
//发送取消
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
Log.i("WXTest","onResp ERR_AUTH_DENIED");
//发送被拒绝
break;
default:
Log.i("WXTest","onResp default errCode " + resp.errCode);
//发送返回
break;
}
finish();
}
}
配置Activity
布局
获取微信用户信息,简称3步曲
* 1.sendReq(req). 用户授权可以拿到 code * * 2.用code.调用Wx接口拿到 openid & accessToken * * 3.通过openid & accessToken 俩参数可以拿到最终用户信息
url里各个参数的说明
参数 | 是否必须 | 说明 |
---|---|---|
appid | 是 | 应用唯一标识,在微信开放平台提交应用审核通过后获得 |
secret | 是 | 应用密钥AppSecret,在微信开放平台提交应用审核通过后获得 |
code | 是 | 填写第一步获取的code参数 |
grant_type | 是 | 填authorization_code |
/** * 2.获取openid 和 ccessToken值用于后期操作
* * @param code 请求码 */ private void getAccess_token(final String code) { new Thread(new Runnable() { @Override public void run() { String path = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + APP_ID + "&secret=" + APP_SECRET + "&code=" + code + "&grant_type=authorization_code"; try { JSONObject jsonObject = JsonUtils.initSSLWithHttpClinet(path);// 请求https连接并得到json结果 if (null != jsonObject) { String openid = jsonObject.getString("openid").toString().trim(); String access_token = jsonObject.getString("access_token").toString().trim(); getUserMesg(access_token, openid); } } catch (Exception e) { e.printStackTrace(); } } }).start(); }
/** * 获取微信的个人信息 * * @param access_token * @param openid */ private void getUserMesg(final String access_token, final String openid) { String path = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access_token + "&openid=" + openid; try { JSONObject jsonObject = JsonUtils.initSSLWithHttpClinet(path);// 请求https连接并得到json结果 if (null != jsonObject) { String nickname = jsonObject.getString("nickname"); int sex = Integer.parseInt(jsonObject.get("sex").toString()); String headimgurl = jsonObject.getString("headimgurl"); Log.e(TAG, "getUserMesg 拿到了用户Wx基本信息.. nickname:" + nickname); } } catch (Exception e) { e.printStackTrace(); } return; }