1.跟老大拿到审核通过的AppID和Appkey.
2.Manifest.xml中加入权限(这里有多余的权限,如果你是负责整个app的开发,放心,多出的权限的后面你也是会用到的):
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> <!-- 第三方登录的权限 --> <uses-permission-sdk-23 android:name="android.permission.aad" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_APN_SETTINGS" tools:ignore="ProtectedPermissions" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
3.在Manifast.xml下的application下加入(.wxapi.WXEntryActivity前面多一个字母都不行,照搬过去就行,一定要听踩过坑的人):
<activity android:name=".wxapi.WXEntryActivity" android:exported="true" android:label="@string/app_name" android:theme="@style/AppTheme" />
4.在工程中单独创建一个名字为wxapi的包,然后建立一个名字叫WXEntryActivity的Activity:然后检查WXEntryActivity的包名,一定是在工程包名的后面!!!比如我工程的包名是(AndroidManifest.xml的左上角):
package="com.example.administrator.yezi">
那我的新建的WXEntryActivity的包名就一定是:
package com.example.administrator.yezi.wxapi; public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {}
5.这里分为两种登录,A:直接微信登录 B:获取用户信息登录
A1:
package com.example.administrator.yezi.wxapi; public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler { private Retrofit retrofit; public static IWXAPI mWxApi; private static final String APP_ID = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";//自己的appid private String WX_APP_SECRET = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";//自己的appKey private String Authorization_Code = "authorization_code"; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); retrofit = RetrofitManager.getInstance().getRetrofit(); mWxApi = WXAPIFactory.createWXAPI(this, APP_ID, true);//通过WXAPIFactory工厂获取IWXApI的示例 mWxApi.registerApp(APP_ID);//将应用的appid注册到微信 try { boolean result = mWxApi.handleIntent(getIntent(), this); if (!result) { Toast.makeText(WXEntryActivity.this, "参数不合法", Toast.LENGTH_SHORT).show(); finish(); } } catch (Exception e) { e.printStackTrace(); } // 动态权限 if (Build.VERSION.SDK_INT >= 23) { String[] permissions = { Manifest.permission.INTERNET, Manifest.permission.ACCESS_NETWORK_STATE, Manifest.permission.ACCESS_WIFI_STATE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE }; if (checkSelfPermission(permissions[0]) != PackageManager.PERMISSION_GRANTED) { requestPermissions(permissions, 0); } } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); mWxApi.handleIntent(data, this); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); mWxApi.handleIntent(intent, this); finish(); } @Override public void onReq(BaseReq baseReq) { Log.e("-------", "------req-----"); } @Override public void onResp(BaseResp baseResp) { switch (baseResp.errCode) { case BaseResp.ErrCode.ERR_OK: // 登陆获取的code String code = ((SendAuth.Resp) baseResp).code; //发送成功 getByOkhttp(code); finish(); break; case BaseResp.ErrCode.ERR_USER_CANCEL: //发送取消 finish(); break; case BaseResp.ErrCode.ERR_AUTH_DENIED: //发送被拒绝 finish(); break; default: //发送返回/ finish(); break; } } }
A2:
public class LoginActivity extends AppCompatActivity { @BindView(R.id.ic_qq) ImageView icQq; @BindView(R.id.ic_wechat) ImageView icWechat; @BindView(R.id.ic_sina) ImageView icSina; public static IWXAPI mWxApi; private static final String APP_ID = "XXXXXXXXXXXXXXXXXXXXXXXXXXX";//自己的appid @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 启动activity时不自动弹出软键盘 setContentView(R.layout.activity_login); ButterKnife.bind(this); //通过WXAPIFactory工厂获取IWXApI的示例 mWxApi = WXAPIFactory.createWXAPI(this, APP_ID, true); //将应用的appid注册到微信 mWxApi.registerApp(APP_ID); // 动态权限 if (Build.VERSION.SDK_INT >= 23) { String[] permissions = { Manifest.permission.INTERNET, Manifest.permission.ACCESS_NETWORK_STATE, Manifest.permission.ACCESS_WIFI_STATE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE }; if (checkSelfPermission(permissions[0]) != PackageManager.PERMISSION_GRANTED) { requestPermissions(permissions, 0); } } } @OnClick({R.id.ic_qq, R.id.ic_wechat, R.id.ic_sina}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.ic_qq: //QQ登录 QQLogin(); break; case R.id.ic_wechat: wxLogin();//微信登录 break; case R.id.ic_sina: break; } } public void wxLogin() { //调用微信登录界面 if (!mWxApi.isWXAppInstalled()) { //您还未安装微信客户端 return; } SendAuth.Req req = new SendAuth.Req(); req.scope = "snsapi_userinfo"; req.state = "wechat_sdk_demo"; mWxApi.sendReq(req); } }
B1:
package com.example.administrator.yezi.wxapi; public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler { private Retrofit retrofit; public static IWXAPI mWxApi; private static final String APP_ID = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";//老大给的的appid private String WX_APP_SECRET = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";//老大给的Appkey private String Authorization_Code = "authorization_code"; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); retrofit = RetrofitManager.getInstance().getRetrofit(); mWxApi = WXAPIFactory.createWXAPI(this, APP_ID, true);//通过WXAPIFactory工厂获取IWXApI的示例 mWxApi.registerApp(APP_ID);//将应用的appid注册到微信 try { boolean result = mWxApi.handleIntent(getIntent(), this); if (!result) { Log.e("-----------", "-----参数不合法------"); finish(); } } catch (Exception e) { e.printStackTrace(); } // 动态权限 if (Build.VERSION.SDK_INT >= 23) { String[] permissions = { Manifest.permission.INTERNET, Manifest.permission.ACCESS_NETWORK_STATE, Manifest.permission.ACCESS_WIFI_STATE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE }; if (checkSelfPermission(permissions[0]) != PackageManager.PERMISSION_GRANTED) { requestPermissions(permissions, 0); } } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); mWxApi.handleIntent(data, this); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); mWxApi.handleIntent(intent, this); finish(); } @Override public void onReq(BaseReq baseReq) { Log.e("-------", "------req-----"); } @Override public void onResp(BaseResp baseResp) { switch (baseResp.errCode) { case BaseResp.ErrCode.ERR_OK: // 登陆获取的code String code = ((SendAuth.Resp) baseResp).code; //发送成功 getByOkhttp(code); finish(); break; case BaseResp.ErrCode.ERR_USER_CANCEL: //发送取消 finish(); break; case BaseResp.ErrCode.ERR_AUTH_DENIED: //发送被拒绝 finish(); break; default: //发送返回 finish(); break; } } //开始请求拿到openid和access_tokeno private void getByOkhttp(final String code) { Call<WXMode> call = retrofit.create(DataServer.class).getaccessToken(APP_ID, WX_APP_SECRET, code, Authorization_Code); call.enqueue(new Callback<WXMode>() { @Override public void onResponse(Call<WXMode> call, retrofit2.Response<WXMode> response) { String accessToken = response.body().getAccess_token(); String openId = response.body().getOpenid(); GetUserInfo(accessToken, openId);//获取用户信息 } @Override public void onFailure(Call<WXMode> call, Throwable t) { //网络异常(5s) } }); } //拿到用户信息 private void GetUserInfo(final String accessToken, final String openId) { Call<WXUserInfo> call = retrofit.create(DataServer.class).getWXuserInfo(accessToken, openId); call.enqueue(new Callback<WXUserInfo>() { @Override public void onResponse(Call<WXUserInfo> call, retrofit2.Response<WXUserInfo> response) { if (response.isSuccessful()) { String openid = response.body().getOpenid(); String nickname = response.body().getNickname(); String headimgurl = response.body().getHeadimgurl(); int sex = response.body().getSex(); weichatLogin(nickname, sex, headimgurl, openid);//开始登录 } else { //失败 } } @Override public void onFailure(Call<WXUserInfo> call, Throwable t) { //网络异常 } }); } //拿到用户信息开始微信登录 public void weichatLogin(String nickName, int sex, String headImg, final String openId) { Retrofit retrofit = RetrofitManager.getInstance().getRetrofit(); Call<User> call = retrofit.create(DataServer.class).getweiChatuser(nickName, sex, headImg, openId, 0); call.enqueue(new Callback<User>() { @Override public void onResponse(Call<User> call, retrofit2.Response<User> response) { if (response.body().getStatus() == 200) { app.setToken(response.body().getToken()); Intent intent = new Intent(WXEntryActivity.this, StartActivity.class); startActivity(intent); } else { //失败 } } @Override public void onFailure(Call<User> call, Throwable t) { //网络异常 } }); } }
B2:
public class LoginActivity extends AppCompatActivity { @BindView(R.id.ic_qq) ImageView icQq; @BindView(R.id.ic_wechat) ImageView icWechat; @BindView(R.id.ic_sina) ImageView icSina; public static IWXAPI mWxApi; private static final String APP_ID = "XXXXXXXXXXXXXXXXXXXXXXXXXXX";//自己的appid @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 启动activity时不自动弹出软键盘 setContentView(R.layout.activity_login); ButterKnife.bind(this); //通过WXAPIFactory工厂获取IWXApI的示例 mWxApi = WXAPIFactory.createWXAPI(this, APP_ID, true); //将应用的appid注册到微信 mWxApi.registerApp(APP_ID); // 动态权限 if (Build.VERSION.SDK_INT >= 23) { String[] permissions = { Manifest.permission.INTERNET, Manifest.permission.ACCESS_NETWORK_STATE, Manifest.permission.ACCESS_WIFI_STATE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE }; if (checkSelfPermission(permissions[0]) != PackageManager.PERMISSION_GRANTED) { requestPermissions(permissions, 0); } } } @OnClick({R.id.ic_qq, R.id.ic_wechat, R.id.ic_sina}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.ic_qq: //QQ登录 QQLogin(); break; case R.id.ic_wechat: wxLogin();//微信登录 break; case R.id.ic_sina: break; } } public void wxLogin() { //调用微信登录界面 if (!mWxApi.isWXAppInstalled()) { //您还未安装微信客户端 return; } SendAuth.Req req = new SendAuth.Req(); req.scope = "snsapi_userinfo"; req.state = "wechat_sdk_demo"; mWxApi.sendReq(req); } }
B3:这里用到了三个mode,1.是微信端返回openid和期限之类的mode. 2.微信端返回的用户信息 3.微信接口文档的返回示例.
mode1:
public class WXMode { /** * access_token : hSTsG7nq8e0yEFhOZFT-wAdTsjT9jC0AYvGRiqGwwR6Hko99o_mmYR8KO18kMxeDOz33d9tnBhMzu_NLsIha2HqvTm1OGPL1weBdvXZVFFc * expires_in : 7200 * refresh_token : AeN69M27vttqCedxoIOSeY6cxvbt1N584HjEOclUXtNWxRaZWgmtfvn2jWIDX4tq5t-7Btlc1UkEyyFhV7HVIMXe-V6RPjoZdF525vLzev8 * openid : olmt4wfxS21G4VeeVX16_zUhZezY * scope : snsapi_userinfo * unionid : o5aWQwAa7niCIXhAIRBOwglIJ7UQ */ private String access_token; private int expires_in; private String refresh_token; private String openid; private String scope; private String unionid; public String getAccess_token() { return access_token; } public void setAccess_token(String access_token) { this.access_token = access_token; } public int getExpires_in() { return expires_in; } public void setExpires_in(int expires_in) { this.expires_in = expires_in; } public String getRefresh_token() { return refresh_token; } public void setRefresh_token(String refresh_token) { this.refresh_token = refresh_token; } public String getOpenid() { return openid; } public void setOpenid(String openid) { this.openid = openid; } public String getScope() { return scope; } public void setScope(String scope) { this.scope = scope; } public String getUnionid() { return unionid; } public void setUnionid(String unionid) { this.unionid = unionid; } }
mode2:
public class WXUserInfo { /** * openid : olmt4wfxS24VeeVX16_zUhZezY * nickname : 李文星 * sex : 1 * language : zh_CN * city : Shenzhen * province : Guangdong * country : CN * headimgurl : http://wx.qlogo.cn/mmopen/ajNVdqHZLLDickRibe5D4x2ADgSfianmA4kK9hY4esrvGhmAFCe5wjox6b6pL4ibiblKnxibzVtGdqfa2UVHACfmmUsQ/0 * privilege : [] * unionid : o5aWQwAa7niCIXhAIRBOwglIJ7UQ */ private String openid; private String nickname; private int sex; private String language; private String city; private String province; private String country; private String headimgurl; private String unionid; private List<?> privilege; public String getOpenid() { return openid; } public void setOpenid(String openid) { this.openid = openid; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public int getSex() { return sex; } public void setSex(int sex) { this.sex = sex; } public String getLanguage() { return language; } public void setLanguage(String language) { this.language = language; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getProvince() { return province; } public void setProvince(String province) { this.province = province; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public String getHeadimgurl() { return headimgurl; } public void setHeadimgurl(String headimgurl) { this.headimgurl = headimgurl; } public String getUnionid() { return unionid; } public void setUnionid(String unionid) { this.unionid = unionid; } public List<?> getPrivilege() { return privilege; } public void setPrivilege(List<?> privilege) { this.privilege = privilege; } }
mode3,后台给你的接口文档中返回的示例,这里是我的示例:
public class User{ /** * message : 请求成功 * status : 200 * code : 0 * token : hpvymDJdYxvaj2cX+vM/9Q== * currentTime : 1524896417273 */ private String message; private int status; private String code; private String token; private long currentTime; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getToken() { return token; } public void setToken(String token) { this.token = token; } public long getCurrentTime() { return currentTime; } public void setCurrentTime(long currentTime) { this.currentTime = currentTime; } }
最后:这里用的是Retrofit请求