IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 接入微信登录---(由于微信的官方文档写的有点散,特此记录一下) -> 正文阅读

[移动开发]接入微信登录---(由于微信的官方文档写的有点散,特此记录一下)

最近app上Goole市场,三方登录这块原先用的是mob的,但是Goole那边检测到mob会自动收集手机用户的手机号码信息并上传到mob的后台,所以App被下架了,没办法就让直接对接微信登录。下面就是整体的流程了

步骤:

1.接入微信的sdk,可以直接用Gradle 的方式添加??

在 build.gradle 文件中,添加如下依赖即可:

//该文件是根目录下的build.gradle
//目前 Maven Central仅支持部分版本:6.6.4、6.6.5、6.6.23、6.7.0、6.7.9、6.8.0,建议开发者升级
//至最新版本6.8.0。后续所有版本更新都会上传至Maven Central
repositories {
        jcenter() //由于 jCenter 服务关停,需要修改成引用 Maven Central
        mavenCentral()

        google()
        maven {
            url "https://jitpack.io"
        }
}
//该文件是工程目录下的build.gradle 不是根目录下的
dependencies {
//微信sdk
api 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}

2.添加权限

<!--其中网络权限如果没有使用扫码登录功能非必要;后三个权限,如果没有使用 mta,也非必要,即使有使用 mta,去掉也不影响功能-->
<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.接入sdk,添加完所需权限后,接入微信登录环境算是搭建好了。下面第一步是初始化(即:向微信注册)



//在项目的Application的onCreate()方法中调用


   @Override
    public void onCreate() {
        super.onCreate();

        wxinit();
    }




/**微信初始化*/
    public static IWXAPI api;
    private void wxinit(){
        api = WXAPIFactory.createWXAPI(this,WX_APP_ID,true);
        api.registerApp(WX_APP_ID);
        //建议动态监听微信启动广播进行注册到微信
        registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {

                // 将该app注册到微信
                api.registerApp(WX_APP_ID);
            }
        }, new IntentFilter(ConstantsAPI.ACTION_REFRESH_WXAPP));
    }

4.在项目中微信登录点击事件的方法内调起微信授权


//微信登录点击事件
onclick(v->{
  if (Application.api == null) {
                        Application.api = WXAPIFactory.createWXAPI(this, WX_APP_ID, true);
                    }
                    if(!Application.api.isWXAppInstalled()){
                        toast("未安装微信客户端!");
                    }else{
                        Application.api.registerApp(WX_APP_ID);
                        SendAuth.Req req = new SendAuth.Req();
                        req.scope = "snsapi_userinfo";
                        req.state = "wechat_sdk_demo";
                        Application.api.sendReq(req);
                    }
});

5.在项目的包名下,创建一个名为wxapi的文件夹,然后在该文件夹下创建一个名为

WXEntryActivity的java文件(文件夹和类名都是不能更改的,都是与微信约定好的名字)
/**
 * 微信客户端回调activity示例
 */
public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {

    private String openid;
    private String accessToken;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_wx);
        boolean handleIntent = XChatApplication.api.handleIntent(getIntent(), this);
        //下面代码是判断微信分享后返回WXEnteryActivity的,如果handleIntent==false,说明没有调用IWXAPIEventHandler,则需要在这里销毁这个透明的Activity;
        if (handleIntent == false) {
            Log.d("微信登录", "onCreate: " + handleIntent);
            finish();
        }
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        XChatApplication.api.handleIntent(intent, this);
    }

    @Override
    public void onReq(BaseReq baseReq) {
        Log.d("微信登录", "onReq: 退出");
        finish();
    }

    /**
     * 微信请求回调处理结果
     */
    @Override
    public void onResp(BaseResp baseResp) {
        Log.d("微信登录", "onResp: 回调");
        //登录回调
        if (baseResp != null) {
            switch (baseResp.errCode) {
                case BaseResp.ErrCode.ERR_OK:
                    String code = ((SendAuth.Resp) baseResp).code;
                    Log.d("微信登录 code", "" + code);
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            getAccessToken(code);
                        }
                    }).start();
                    break;
                case BaseResp.ErrCode.ERR_AUTH_DENIED: //用户拒绝授权
                    finish();
                    break;
                case BaseResp.ErrCode.ERR_USER_CANCEL: //用户取消
                    finish();
                    break;
                default:
                    finish();
                    break;

            }
        } else {
            Log.d("微信登录", "onResp: 回调为空");
        }
    }

    private void getAccessToken(String code) {
        //获取授权,参数拼接
        StringBuffer longUrl = new StringBuffer();
        longUrl.append("https://api.weixin.qq.com/sns/oauth2/access_token")
                .append("?appid=" + Constants.WX_APP_ID)
                .append("&secret=" + Constants.WX_APP_SECRET)
                .append("&code=" + code)
                .append("&grant_type=authorization_code");
        Log.d("微信登录请求参数", "" + longUrl);
        OkHttpClient okHttpClient = new OkHttpClient();
        final Request request = new Request.Builder()
                .url(longUrl.toString())
                .get()
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                String responseInfo = response.body().string();
                Log.d("微信登录返回值", "" + responseInfo);
                try {
                    JSONObject jo = new JSONObject(responseInfo);
                    openid = jo.getString("openid");
                    accessToken = jo.getString("access_token");
//一直到这里其实上面拿的都是微信授权的信息,这里是因为后台那边可以用这些参数去微信获取该用户
//的名称头像等数据,再进行注册。返回给我们这边是我们项目的用户数据模型。所以就直接调用的后台接
//口,没有继续查下去
                    //CoreManager.getCore(IAuthCore.class).ThirdLogin(openid, //jo.getString("unionid"), accessToken, 1);
                  
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                finish();
            }

            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {
                finish();
            }

        });
    }

//如果有需要可以再继续走该方法,获取微信用户的详细信息
    private void getWXUserInfo(String openid,String accessToken,String unionid){
        StringBuffer userUrl = new StringBuffer();
        userUrl.append("https://api.weixin.qq.com/sns/userinfo")
                .append("?access_token=" + accessToken)
                .append("&openid=" + Constants.WX_APP_SECRET);
        Log.d("微信登录请求参数", "" + openid);
        OkHttpClient okHttpClient = new OkHttpClient();
        final Request request = new Request.Builder()
                .url(userUrl.toString())
                .get()
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {

            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
               //{
                //  "openid": "OPENID",       普通用户的标识,对当前开发者帐号唯一
                //  "nickname": "NICKNAME",   普通用户昵称
                //  "sex": 1,                 普通用户性别,1 为男性,2 为女性
                //  "province": "PROVINCE",   普通用户个人资料填写的省份
                //  "city": "CITY",           普通用户个人资料填写的城市
                //  "country": "COUNTRY",     国家,如中国为 CN
                //  "headimgurl": "https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",   头像
                //  "privilege": ["PRIVILEGE1", "PRIVILEGE2"],     用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)
                //  "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"    用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的 unionid 是唯一的。
                //}

            }
        });
    }

}

上面代码中,微信的appId和secret 是自己项目在微信申请的。

以上 基本上就是接入微信登录的全部过程。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-09-27 14:12:28  更:2021-09-27 14:15:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:47:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码