zoukankan      html  css  js  c++  java
  • 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);
            }
    
        }
  • 相关阅读:
    第6章 键盘_6.5 插入符号(不是光标)
    第6章 键盘_6.3-6.4 字符消息、键盘消息和字符集
    第6章 键盘_6.1-6.2 键盘基础与击键消息
    第5章 绘图基础_5.6 矩形、区域和剪裁
    第4章 进程(1)
    第3章 内核对象(2)
    第3章 内核对象(1)
    第2章 字符和字符串处理(2)
    第2章 字符和字符串处理(1)
    第1章 错误处理
  • 原文地址:https://www.cnblogs.com/Oldz/p/13477872.html
Copyright © 2011-2022 走看看