WeChat Login SDK
1.申请AppID
在微信开放平台创建应用
7个工作日内审核通过,第一次申请比较久,之后1~2天能申请好
填写项目信息时有一项需注意 应用签名, 此签名需下载微信的签名工具 签名工具
注:不同于微信的分享到朋友、分享到朋友圈,登录和支付功能需要申请开发者资质且需缴纳费用,目前是300元/年审核认证费。
2.SDK 接入(AS)
- module下的build.gradle中添加:
dependencies {
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:1.0.2'
}
或
dependencies {
compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:1.0.2'
}
(其中,前者包含统计功能)
- AndroidManifest.xml中添加如下权限
<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"/>
-
包名目录下建包wxapi,并在该包下新增WXEntryActivity类继承Actvity,并实现 接口用以接收分享回调信息。
-
Android.xml中添加
<activity
android:name=".wxapi.WXEntryActivity"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
- 代码实现
类WXEntryActivity.java
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
public static final String APP_ID = "待应用审核通过填入生成的APP_ID";
private IWXAPI iwxapi;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wxentry);
iwxapi = WXAPIFactory.createWXAPI(this, APP_ID, true);
iwxapi.handleIntent(getIntent(), this);
}
@Override
public void onReq(BaseReq baseReq) {
Log.e("yc", "onReq:"+baseReq.toString());
}
@Override
public void onResp(BaseResp baseResp) {
Log.e("yc", "onResp:errCode:"+baseResp.errCode+" type:"+baseResp.getType()+" errStr:"+baseResp.errStr);
Bundle bundle = new Bundle();
switch (baseResp.errCode){
case BaseResp.ErrCode.ERR_OK:
if(baseResp.getType() == 1) {
//登录授权成功
Message msg = Message.obtain();
msg.obj = (SendAuth.Resp)baseResp; //包含access_token、openid等信息
WeChatLoginBiz.handler.sendMessage(msg);
}else if(baseResp.getType() == 2) {
//分享成功
Toast.makeText(App.getContext(), "分享成功", Toast.LENGTH_SHORT).show();
}
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
if(baseResp.getType() == 1){
//登录用户未授权
}else if(baseResp.getType() == 2) {
//分享取消
Toast.makeText(App.getContext(), "取消了分享", Toast.LENGTH_SHORT).show();
}
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
//拒绝
break;
}
finish();
}
}
业务处理类WeChatShareBiz.java
public class WeChatLoginBiz {
private IWXAPI iwxapi;
private static WeChatLoginListener listener;
public static Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
SendAuth.Resp resp = (SendAuth.Resp) msg.obj;
String code = resp.code;
getWeChatToken(code);
}
};
public WeChatLoginBiz(Activity context){
iwxapi = WXAPIFactory.createWXAPI(context, WXEntryActivity.APP_ID);
iwxapi.registerApp(WXEntryActivity.APP_ID);
}
public void login(){
requestForCode();
}
//1.用于弹出授权登录页并获取返回码
protected void requestForCode(){
SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo"; //作用域:获取用户信息
req.state = "xxx"; //授权后原样返回自己应用,用于安全考虑
iwxapi.sendReq(req);
}
/** 2.获取token
* url https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code
* @param code 弹出授权登录页返回码
*/
private static void getWeChatToken(String code) {
WebApis.getWCToken(code, new WebApis.BeanCallBack<WeChatToken>() {
@Override
public void onSucess(WeChatToken weChatToken) {
String token = weChatToken.getAccess_token();
String openId = weChatToken.getOpenid();
getUserInfo(token, openId);
}
@Override
public void onFail(int status, String message) {
}
});
}
/**3.获取用户信息
* url: https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s
* @param token 2中获取到的access_token
* @param openid 授权用户唯一标识
*/
private static void getUserInfo(String token, String openId){
WebApis.getWCProfile(token, openId, new WebApis.BeanCallBack<WeChatProfile>() {
@Override
public void onSucess(WeChatProfile weChatProfile) {
//未找到微信退出登录方法,自己标记微信登录成功
SPUtil.put(App.getContext(), Constant.SP_WECHAT_LOGIN_FLAG, true);
listener.weChatPLoginSuccess(weChatProfile);
}
@Override
public void onFail(int status, String message) {
}
});
}
public void destory(){
handler = null;
}
public void setLoginListener(WeChatLoginListener listener){
this.listener = listener;
}
public interface WeChatLoginListener{
void weChatPLoginSuccess(WeChatProfile profile);
}
}
注:刷新或续期access_token使用、检验授权凭证(access_token)是否 这两种感觉对于登录功能用不到,猜测和登录后续的相关操作有关,如支付。
3.混淆
-keep class com.tencent.mm.opensdk.** {
*;
}
-keep class com.tencent.wxop.** {
*;
}
-keep class com.tencent.mm.sdk.** {
*;
}