Android集成微信原生登录
https://blog.csdn.net/u014078990/article/details/83752223
1,app build.gradle:
//微信登录 api 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
2,权限:
<uses-permission android:name="android.permission.INTERNET" />
<!-- for mta statistics, not necessary-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
3,新建 WXEntryActivity.java
清单文件中配置:
<activity android:name=".wxapi.WXEntryActivity" android:label="@string/app_name" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:exported="true" android:taskAffinity="com.junxin.zeropay" android:launchMode="singleTask"> </activity>
混淆 proguard-rules.pro:
## - - - - - - - - 微信 - - - - - - - - - - - -
-keep class com.tencent.mm.opensdk.** {
*;
}
-keep class com.tencent.wxop.** {
*;
}
-keep class com.tencent.mm.sdk.** {
*;
}
package com.zz.zeropay.wxapi; import androidx.appcompat.app.AppCompatActivity; import android.app.Activity; import android.app.ProgressDialog; import android.content.SharedPreferences; import android.os.Bundle; import android.util.Log; import android.view.WindowManager; import com.zz.zeropay.R; 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.IWXAPI; import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler; import com.tencent.mm.opensdk.openapi.WXAPIFactory; import org.json.JSONObject; import java.io.IOException; import okhttp3.Call; import okhttp3.Callback; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class WXEntryActivity extends Activity implements IWXAPIEventHandler { private ProgressDialog mProgressDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_wxentry); // 隐藏状态栏 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); //接收到分享以及登录的intent传递handleIntent方法,处理结果 IWXAPI iwxapi = WXAPIFactory.createWXAPI(this, "wx45ccf89d8a0a24a7", false); iwxapi.handleIntent(getIntent(), this); } @Override public void onReq(BaseReq baseReq) { } //请求回调结果处理 @Override public void onResp(BaseResp baseResp) { //登录回调 switch (baseResp.errCode) { case BaseResp.ErrCode.ERR_OK: String code = ((SendAuth.Resp) baseResp).code; //获取accesstoken getAccessToken(code); Log.d(TAG, code.toString() + ""); break; case BaseResp.ErrCode.ERR_AUTH_DENIED://用户拒绝授权 Log.d(TAG, "ERR_AUTH_DENIED"); break; case BaseResp.ErrCode.ERR_USER_CANCEL://用户取消 Log.d(TAG, "ERR_USER_CANCEL"); break; default: //this.finish(); break; } } private void getAccessToken(String code) { Log.d(TAG, "微信 code = " + code); createProgressDialog(); //获取授权 StringBuffer loginUrl = new StringBuffer(); loginUrl.append("https://api.weixin.qq.com/sns/oauth2/access_token") .append("?appid=") .append("wx00bb0933b4fdb159") .append("&secret=") .append("801cb12459e1d0fdb06df216cf91755b") .append("&code=") .append(code) .append("&grant_type=authorization_code"); Log.d(TAG, loginUrl.toString()); OkHttpClient okHttpClient = new OkHttpClient(); final Request request = new Request.Builder() .url(loginUrl.toString()) .get()//默认就是GET请求,可以不写 .build(); Call call = okHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.d(TAG, "onFailure: "+e); } @Override public void onResponse(Call call, Response response) throws IOException { String responseInfo= response.body().string(); Log.d("fan12", "onResponse: " +responseInfo); String access = null; String openId = null; try { JSONObject jsonObject = new JSONObject(responseInfo); access = jsonObject.getString("access_token"); openId = jsonObject.getString("openid"); } catch (Exception e) { e.printStackTrace(); } getUserInfo(access, openId); } }); } private void createProgressDialog() { mProgressDialog = new ProgressDialog(this); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);//转盘 mProgressDialog.setCancelable(false); mProgressDialog.setCanceledOnTouchOutside(false); mProgressDialog.setTitle("提示"); mProgressDialog.setMessage("登录中,请稍后"); mProgressDialog.show(); } private void getUserInfo(String access, String openid) { String getUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access + "&openid=" + openid; OkHttpClient okHttpClient = new OkHttpClient(); final Request request = new Request.Builder() .url(getUserInfoUrl) .get()//默认就是GET请求,可以不写 .build(); Call call = okHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.d(TAG, "onFailure: "); mProgressDialog.dismiss(); } @Override public void onResponse(Call call, Response response) throws IOException { String responseInfo = response.body().string(); Log.d(TAG, "onResponse: " + responseInfo); SharedPreferences.Editor editor = getSharedPreferences("userInfo", MODE_PRIVATE).edit(); editor.putString("responseInfo", responseInfo); editor.commit(); finish(); mProgressDialog.dismiss(); } }); } String TAG = "zhu"; }
最后在需要的位置直接调用(比如MainActivity.java):
private void regToWx() {
// APP_ID 替换为你的应用从官方网站申请到的合法appID
String APP_ID = "wx00bb0933b4fcb111";
// IWXAPI 是第三方app和微信通信的openApi接口
IWXAPI api;
// 通过WXAPIFactory工厂,获取IWXAPI的实例
api = WXAPIFactory.createWXAPI(context, APP_ID, true);
// 将应用的appId注册到微信
api.registerApp(APP_ID);
//建议动态监听微信启动广播进行注册到微信
context.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// 将该app注册到微信
api.registerApp(APP_ID);
}
}, new IntentFilter(ConstantsAPI.ACTION_REFRESH_WXAPP));
if (!api.isWXAppInstalled()) {
Toast.makeText(context, "您的设备未安装微信客户端", Toast.LENGTH_SHORT).show();
} else {
final SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "wechat_sdk_demo_test";
api.sendReq(req);
}
}