• 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" />
  • 相关阅读:
    Park Visit
    1894: 985的方格难题
    985的数字难题
    Highways
    最短路
    SQL内容补充
    8.前端资源优化
    7.CSRF攻击和文件上传漏洞攻击
    6.XSS攻击方式及防御措施
    5.避免重复提交表单
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/7656101.html
Copyright © 2020-2023  润新知