zoukankan      html  css  js  c++  java
  • Android 微信第三方登录(个人笔记)

    今天在写微信登录,花了半天时间搞定、然后写下自己的笔记,希望帮助更多的人。。。欢迎各位指教。

    微信授权登录,官方说的不是很清楚、所以导致有一部分的坑。

    微信注册应用平台的应用签名,下载 微信签名生成工具 输入项目的packageName也可以查看到。

    (注意:debug、Release 一定要区分,因为2种生成的微信签名不一致,会导致没有跳转、回调。。。。一般在微信开发者上面注册的是正式环境打包好的、)

    申请微信开发者账号、应用申请省略。。。。

    1. AndroidManifest.xml 权限

    <!-- 微信权限-->
    <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    2.在图一按钮上面,加上微信跳转方法、也就是启动微信登录的方法

    private void loginToWeiXin(){
            IWXAPI mApi = WXAPIFactory.createWXAPI(this, WXEntryActivity.WEIXIN_APP_ID, true);
            mApi.registerApp(WXEntryActivity.WEIXIN_APP_ID);
    
            if (mApi != null && mApi.isWXAppInstalled()) {
                SendAuth.Req req = new SendAuth.Req();
                req.scope = "snsapi_userinfo";
                req.state = "wechat_sdk_demo_test_neng";
                mApi.sendReq(req);
            } else
                Toast.makeText(this, "用户未安装微信", Toast.LENGTH_SHORT).show();
        }

    3.在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activity

     package(项目报名).wxapi.WXEntryActivity.Java 

    回调方法onResp() 方法没有触发回调、请监测WXEntryActivity onCreate中是否调用此方法  mApi.handleIntent(this.getIntent(), this);

    package com.xxx.xxxx.android.wxapi;
    /**
     * 微信登录页面
     * @author kevin_chen 2016-12-10 下午19:03:45
     * @version v1.0
     */
    public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
        private static final String APP_SECRET = "填写自己的AppSecret";
        private IWXAPI mWeixinAPI;
        public static final String WEIXIN_APP_ID = "填写自己的APP_id";
        private static String uuid;
    
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mWeixinAPI = WXAPIFactory.createWXAPI(this, WEIXIN_APP_ID, true);
            mWeixinAPI.handleIntent(this.getIntent(), this);
        }
    
        @Override
        protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);
            setIntent(intent);
            mWeixinAPI.handleIntent(intent, this);//必须调用此句话
        }
    
        //微信发送的请求将回调到onReq方法
        @Override
        public void onReq(BaseReq req) {
            LogUtils.log("onReq");
        }
    
        //发送到微信请求的响应结果
        @Override
        public void onResp(BaseResp resp) {
            LogUtils.log("onResp");
            switch (resp.errCode) {
            case BaseResp.ErrCode.ERR_OK:
                LogUtils.log("ERR_OK");
                //发送成功
                SendAuth.Resp sendResp = (SendAuth.Resp) resp;
                if (sendResp != null) {
                    String code = sendResp.code;
                    getAccess_token(code);
                }
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL:
                LogUtils.log("ERR_USER_CANCEL");
                //发送取消
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED:
                LogUtils.log("ERR_AUTH_DENIED");
                //发送被拒绝
                break;
            default:
                //发送返回
                break;
            }
    
        }
    
        /**
         * 获取openid accessToken值用于后期操作
         * @param code 请求码
         */
        private void getAccess_token(final String code) {
            String path = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="
                    + WEIXIN_APP_ID
                    + "&secret="
                    + APP_SECRET
                    + "&code="
                    + code
                    + "&grant_type=authorization_code";
            LogUtils.log("getAccess_token:" + path);
            //网络请求,根据自己的请求方式
            VolleyRequest.get(this, path, "getAccess_token", false, null, new VolleyRequest.Callback() {
                @Override
                public void onSuccess(String result) {
                    LogUtils.log("getAccess_token_result:" + result);
                    JSONObject jsonObject = null;
                    try {
                        jsonObject = new JSONObject(result);
                        String openid = jsonObject.getString("openid").toString().trim();
                        String access_token = jsonObject.getString("access_token").toString().trim();
                        getUserMesg(access_token, openid);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
    
                }
    
                @Override
                public void onError(String errorMessage) {
    
                }
            });
        }
    
    
        /**
         * 获取微信的个人信息
         * @param access_token
         * @param openid
         */
        private void getUserMesg(final String access_token, final String openid) {
            String path = "https://api.weixin.qq.com/sns/userinfo?access_token="
                    + access_token
                    + "&openid="
                    + openid;
            LogUtils.log("getUserMesg:" + path);
            //网络请求,根据自己的请求方式
            VolleyRequest.get(this, path, "getAccess_token", false, null, new VolleyRequest.Callback() {
                @Override
                public void onSuccess(String result) {
                    LogUtils.log("getUserMesg_result:" + result);
                    JSONObject jsonObject = null;
                    try {
                        jsonObject = new JSONObject(result);
                        String nickname = jsonObject.getString("nickname");
                        int sex = Integer.parseInt(jsonObject.get("sex").toString());
                        String headimgurl = jsonObject.getString("headimgurl");
                     
                        LogUtils.log("用户基本信息:");
                        LogUtils.log("nickname:" + nickname);
                        LogUtils.log("sex:" + sex);
                        LogUtils.log("headimgurl:" + headimgurl);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    finish();
                }
    
                @Override
                public void onError(String errorMessage) {
    
                }
            });
        }
    
    }

    5.在 AndroidManifest.xml 设置注册微信的页面

    当授权时候进入WXEntryActivity、当前背景可能是黒或白,为了不影响用户体验,可以把当前Activity设置为透明:

    android:theme="@android:style/Theme.Translucent" 

    <!--注册微信回调 WXEntryActivity -->
    <activity
        android:name=".wxapi.WXEntryActivity"
        android:exported="true"
        android:label="@string/app_name"
        android:launchMode="singleTop"
        android:theme="@android:style/Theme.Translucent" />

    具体可参考:微信授权登录取用户信息步骤

  • 相关阅读:
    LeetCode 81 Search in Rotated Sorted Array II(循环有序数组中的查找问题)
    LeetCode 80 Remove Duplicates from Sorted Array II(移除数组中出现两次以上的元素)
    LeetCode 79 Word Search(单词查找)
    LeetCode 78 Subsets (所有子集)
    LeetCode 77 Combinations(排列组合)
    LeetCode 50 Pow(x, n) (实现幂运算)
    LeetCode 49 Group Anagrams(字符串分组)
    LeetCode 48 Rotate Image(2D图像旋转问题)
    LeetCode 47 Permutations II(全排列)
    LeetCode 46 Permutations(全排列问题)
  • 原文地址:https://www.cnblogs.com/kevin-chen/p/6157950.html
Copyright © 2011-2022 走看看