转载自 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' compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+' testCompile 'junit:junit:4.12' }
2.添加权限(在AndroidManifest中)
< 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" />
3.创建全局变量存储app_id
public class Constants { public static final String APP_ID = "wx_*******" ; public static IWXAPI wx_api; }
4.创建微信api并注册到微信,在发送登录请求,一般在onCreate()方法中调用
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: 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; 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; 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
< activity android:exported = "true" android:name = ".wxapi.WXEntryActivity" android:launchMode = "singleTop" android:theme = "@android:style/Theme.NoDisplay" />
布局
获取微信用户信息,简称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;
}