公司好长时间都没有业务了,自己也不能闲着,就复习一下微信登录吧
必须要的:你的appID,app的Secret
你的app要有正式的打包签名例子:在你的build.gradle下的android下:
signingConfigs {
myConfig {
storeFile file("你的app,keystore")
storePassword "app打包的密码"
keyAlias "你的app别名"
keyPassword "app打包的密码"
}
}
//以下这些都是死的
buildTypes {
release {
signingConfig signingConfigs.myConfig
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug{
signingConfig signingConfigs.myConfig
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
第一步,微信开发平台下载登录SDK
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
第二步 在application下将你的app注册到微信,不要忘了注册application.
public class App extends Application {
public static IWXAPI mWxApi;
@Override
public void onCreate() {
super.onCreate();
mWxApi = WXAPIFactory.createWXAPI(this, "你的appID", false);
// 将该app注册到微信
mWxApi.registerApp("你的appID");
}
}
第三步 拉取你的微信。获取授权
点击微信登录拉取微信:
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_weixin_login:
if (!App.mWxApi.isWXAppInstalled()) {
Toast.makeText(this,"你还没有安装微信!",Toast.LENGTH_SHORT).show();
return;
}
SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "weidu_wx_login";
App.mWxApi.sendReq(req);
break;
default:
break;
}
下面是我的demo,MainActivity代码。包含以上代码,要跟着我的步骤走,下面的代码参考一下就可以。
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private SharedPreferences sharedPreferences;
private String code;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sharedPreferences = this.getSharedPreferences("dw",MODE_PRIVATE);
findViewById(R.id.btn_weixin_login).setOnClickListener(this);
code = sharedPreferences.getString("code", "");
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_weixin_login:
if (!App.mWxApi.isWXAppInstalled()) {
Toast.makeText(this,"你还没有安装微信!",Toast.LENGTH_SHORT).show();
return;
}
SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "weidu_wx_login";
App.mWxApi.sendReq(req);
break;
default:
break;
}
}
private void weiXinLogin(){
Map<String,String> map = new HashMap<>();
map.put("code",code);
new HttpHelper(this).result(new HttpHelper.HttpListener() {
@Override
public void success(String data) {
//每个用户的code值是不同的所以登录成功之后要设置为空值
sharedPreferences.edit().putString("code","").commit();
Toast.makeText(MainActivity.this,"登录成功",Toast.LENGTH_SHORT).show();
}
@Override
public void fail(String error) {
}
}).post(Http.BASE_WXLOGIN,map);
}
@Override
protected void onResume() {
super.onResume();
if (!TextUtils.isEmpty(sharedPreferences.getString("code",""))){
weiXinLogin();
}
}
}
第四步:创建一个名为wxapi的包,包下创建一个名为WXEntryActivity的类继承Acitivity,实现
IWXAPIEventHandler,并重写
onReq,onResp
public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler
第五步:在WXEntryActivity 下的onCreate下
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
App.mWxApi.handleIntent(getIntent(),this);
}
第六步:在WXEntryActivity 的onResp下回调,并授权
@Override
public void onResp(BaseResp baseResp) {
//登录回调
switch (baseResp.errCode) {
case BaseResp.ErrCode.ERR_OK:
code = ((SendAuth.Resp) baseResp).code;
//获取用户信息
getAccessToken(code);
//存储code
SharedPreferences sharedPreferences = this.getSharedPreferences("dw",MODE_PRIVATE);
sharedPreferences.edit().putString("code",code).commit();
//微信授权成功,并且获取用户信息之后,你可选择finish或者intent跳转到你的登录页面获取
finish();
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED://用户拒绝授权
finish();
break;
case BaseResp.ErrCode.ERR_USER_CANCEL://用户取消
finish();
break;
default:
finish();
break;
}
}
getAccessToken()的方法
1.APP_ID你的appId,
2.secret你的secret
3.code,上面已经获取的用户code
其他的不用动,是死的。
private void getAccessToken(String code) {
//获取授权
StringBuffer loginUrl = new StringBuffer();
loginUrl.append("https://api.weixin.qq.com/sns/oauth2/access_token")
.append("?appid=")
.append(APP_ID)
.append("&secret=")
.append("APP_SECRET")
.append("&code=")
.append(code)
.append("&grant_type=authorization_code");
}
最后一步,在你的点击微信登录页面获取到你在WXEntryActivity 用
sharedPreferences存储的code值,在onResume生命周期方法里判断code是否为null,不为空的情况下再去请求接口。
/**
* 请求微信登录接口
*/
private void weiXinLogin() {
Map<String, String> map = new HashMap<>();
map.put("code", code);
new HttpHelper(this).result(new HttpHelper.HttpListener() {
@Override
public void success(String data) {
//每个用户的code值是不同的所以登录成功之后要设置为空值
sharedPreferences.edit().putString("code", "").commit();
Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
}
@Override
public void fail(String error) {
}
}).post(Http.BASE_WXLOGIN, map);
}
@Override
protected void onResume() {
super.onResume();
if (!TextUtils.isEmpty(sharedPreferences.getString("code", ""))) {
weiXinLogin();
}
}