第三方微信登录

1:build.gradle下加入依赖

implementation 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'

2: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" />
    //在<application>下加入创建的actvity的属性
    <activity
            android:name=".wxapi.WXEntryActivity"
            android:exported="true"
            android:launchMode="singleTask"
            android:screenOrientation="portrait"
            android:taskAffinity="net.sourceforge.simcpux"
            android:theme="@style/Theme.AppCompat.Light.NoActionBar" />

3:创建微信登录需要的工具类WeiXinUtil

public class WeiXinUtil {
    // APP_ID 替换为你的应用从官方网站申请到的合法appID
    public static  String APP_ID = "";

    // IWXAPI 是第三方app和微信通信的openApi接口
    private WeiXinUtil() {

    }
    public  static  boolean success(Context context){
        //判断是否安装过微信
        if (WeiXinUtil.reg(context).isWXAppInstalled()) {
            return  true;
        }else {
            return false;
        }
    }
    public static IWXAPI reg(Context context){
        if (context!=null) {
            //AppConst.WEIXIN.APP_ID是指你应用在微信开放平台上的AppID,记得替换。
            IWXAPI wxapi = WXAPIFactory.createWXAPI(context, APP_ID, true);
            //注册到微信
            wxapi.registerApp(APP_ID);
            return wxapi;
        }else {
            return  null;
        }
    }
   /* //支付
    public static void  weiXinPay(Bean_OrderSuccessBean bean){
        IWXAPI wxapi = WXAPIFactory.createWXAPI(App.context, APP_ID, true);
        //注册到微信
        wxapi.registerApp(APP_ID);

        PayReq payReq = new PayReq();
        payReq.appId=bean.getAppId();
        payReq.prepayId=bean.getPrepayId();
        payReq.partnerId=bean.getPartnerId();
        payReq.nonceStr=bean.getNonceStr();
        payReq.timeStamp=bean.getTimeStamp();
        payReq.sign=bean.getSign();
        payReq.packageValue=bean.getPackageValue();
        Log.d("",payReq.toString()+"111111");
        wxapi.sendReq(payReq);
    }*/
}

4:在你点击微信登录的点击下加入判断手机或模拟器是否安装微信

  case R.id.iv_wx:
                // 微信登录
                if (!WeiXinUtil.success(this)) {
                    Toast.makeText(this, "请先安装应用", Toast.LENGTH_SHORT).show();
                } else {
                    //  验证
                    SendAuth.Req req = new SendAuth.Req();
                    req.scope = "snsapi_userinfo";
                    req.state = "wechat_sdk_demo_test";
                    WeiXinUtil.reg(LoginActivity.this).sendReq(req);
                }
                break;

5:创建一个微信登录的WXEntryActivity,切记创建名必须是WXEntryActivity继承IWXAPIEventHandler
在这里插入图片描述
在这里插入图片描述
6:微信登录官网接口请求工具类NetworkUtil

public class NetworkUtil {
    private static String TAG = "MicroMsg.NetworkUtil";

    public static final int GET_TOKEN = 1;
    public static final int CHECK_TOKEN = 2;
    public static final int REFRESH_TOKEN = 3;
    public static final int GET_INFO = 4;
    public static final int GET_IMG = 5;

    public static void sendWxAPI(Handler handler, String url, int msgTag) {
        Log.v(TAG, "--sendWxAPI---handler==" + handler);
        HttpsThread httpsThread = new HttpsThread(handler, url, msgTag);
        httpsThread.start();
    }

    public static void getImage(Handler handler, String url, int msgTag) {
        HttpsThread httpsThread = new HttpsThread(handler, url, msgTag);
        httpsThread.start();
    }

    static class HttpsThread extends Thread {

        private Handler handler;
        private String httpsUrl;
        private int msgTag;

        public HttpsThread(Handler handler, String url, int msgTag) {
            this.handler = handler;
            this.httpsUrl = url;
            this.msgTag = msgTag;
        }

        @Override
        public void run() {
            if (msgTag == GET_IMG) {
                try {
                    byte[] imgdata = httpURLConnectionGet(httpsUrl);
                    Message msg = Message.obtain();
                    msg.what = msgTag;
                    Bundle data = new Bundle();
                    data.putByteArray("imgdata", imgdata);
                    msg.setData(data);
                    Log.v(TAG, "---GET_IMG---" + msg);
                    handler.sendMessage(msg);
                } catch (Exception e) {
                    Log.e(TAG, e.getMessage());
                }
            } else {
                int resCode;
                InputStream in;
                String httpResult = null;
                try {
                    URL url = new URL(httpsUrl);
                    URLConnection urlConnection = url.openConnection();
                    HttpsURLConnection httpsConn = (HttpsURLConnection) urlConnection;
                    httpsConn.setAllowUserInteraction(false);
                    httpsConn.setInstanceFollowRedirects(true);
                    httpsConn.setRequestMethod("GET");
                    httpsConn.connect();
                    resCode = httpsConn.getResponseCode();

                    if (resCode == HttpURLConnection.HTTP_OK) {
                        Log.v(TAG, "----HTTP_OK---");
                        in = httpsConn.getInputStream();

                        BufferedReader reader = new BufferedReader(new InputStreamReader(
                                in, "iso-8859-1"), 8);
                        StringBuilder sb = new StringBuilder();
                        String line;
                        while ((line = reader.readLine()) != null) {
                            sb.append(line).append("\n");
                        }
                        in.close();
                        httpResult = sb.toString();
                        Log.i(TAG, httpResult);

                        Message msg = Message.obtain();
                        msg.what = msgTag;
                        Bundle data = new Bundle();
                        data.putString("result", httpResult);
                        msg.setData(data);
                        handler.sendMessage(msg);
                        Log.v(TAG, "handler.sendMessage" + httpResult);
                    }
                } catch (Exception e) {
                    Log.e(TAG, "----HTTP_e-----" + e.getMessage());
                }
            }
        }

        private static byte[] httpURLConnectionGet(String url) throws Exception {
            HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
            if (connection == null) {
                Log.i(TAG, "open connection failed.");
            }
            int responseCode = connection.getResponseCode();
            if (responseCode >= 300) {
                connection.disconnect();
                Log.w(TAG, "dz[httpURLConnectionGet 300]");
                return null;
            }

            InputStream is = connection.getInputStream();
            byte[] data = readStream(is);
            connection.disconnect();

            return data;
        }

        private static byte[] readStream(InputStream inStream) throws IOException {
            byte[] buffer = new byte[1024];
            int len = -1;
            ByteArrayOutputStream outStream = new ByteArrayOutputStream();
            while ((len = inStream.read(buffer)) != -1) {
                outStream.write(buffer, 0, len);
            }
            byte[] data = outStream.toByteArray();
            outStream.close();
            inStream.close();
            return data;
        }
    }
}

主要代码

public class WXEntryActivity extends BaseActivity implements IWXAPIEventHandler {
    public static final String TAG = "WXEntryActivity";

    private IWXAPI wxapi;
    private String token;
    private String mUnionid;
    private String mOpenid;
    private String mName;
    private String mHeadimgurl;

    //获取请求字段返回
    private MyHandler handler = new MyHandler(this);
    //刷新或续期 access_token 使用返回
    private TokenHandler mTokenHandler = new TokenHandler(this);
    //微信登录用户信息返回
    private UserHandler mUserHandler = new UserHandler(this);

    @SuppressLint("HandlerLeak")
    private class MyHandler extends Handler {
        private final WeakReference<WXEntryActivity> wxEntryActivityWeakReference;


        public MyHandler(WXEntryActivity wxEntryActivity) {
            wxEntryActivityWeakReference = new WeakReference<WXEntryActivity>(wxEntryActivity);
        }

        @Override
        public void handleMessage(Message msg) {
            int tag = msg.what;
            switch (tag) {
                case NetworkUtil.GET_TOKEN: {
                    Bundle data = msg.getData();
                    JSONObject json = null;
                    try {
                        json = new JSONObject(data.getString("result"));
                        //返回示例
//                       "access_token":"36_l7UREDIdJnicBKNmwoSvxdAAHNIAJFAebDDEFs9PR_YfTAvOSylEl25d9_TdsEwTOZwXRXHlRTf4uhHVP3Irk2ikaReY1cshN1rvWXLdr2Q",
//                        "expires_in":7200,"
//                        refresh_token":"36_3RPGL8hG5AkaB11XO6lvofO-DxP5baCBXxgoB_opeiXENqMdFIuj19iFRdkDwRtEKCtmkeESaKV8jr92EvHdgyph9MwNWoWYyYN69V6F2r4",
//                        "openid":"obvoBwSjNM2cG2A5b_GjVYRTVTKw",
//                        "scope":"snsapi_userinfo",
//                        "unionid":"omA_7vgPHBCwFg9J55Xvc40N_-Qg"

                        Log.v(TAG, "MyHandler weixin==" + json);
                        String refresh_token = json.getString("refresh_token");
                        //刷新或续期 access_token 使用
                        NetworkUtil.sendWxAPI(mTokenHandler, String.format("https://api.weixin.qq.com/sns/oauth2/refresh_token?" +
                                        "appid=%s&grant_type=refresh_token&refresh_token=%s", "wxb3bd283e7ca67de1",
                                refresh_token), NetworkUtil.GET_TOKEN);

                    } catch (JSONException e) {
                        Log.e(TAG, e.getMessage());
                    }
                }
            }
        }
    }

    @SuppressLint("HandlerLeak")
    private class TokenHandler extends Handler {
        private final WeakReference<WXEntryActivity> wxEntryActivityWeakReference;


        public TokenHandler(WXEntryActivity wxEntryActivity) {
            wxEntryActivityWeakReference = new WeakReference<WXEntryActivity>(wxEntryActivity);
        }

        @Override
        public void handleMessage(Message msg) {
            int tag = msg.what;
            switch (tag) {
                case NetworkUtil.GET_TOKEN: {
                    Bundle data = msg.getData();
                    JSONObject json = null;
                    try {
                        json = new JSONObject(data.getString("result"));
                        //返回示例
//                        {
//                            "access_token": "ACCESS_TOKEN",
//                                "expires_in": 7200,
//                                "refresh_token": "REFRESH_TOKEN",
//                                "openid": "OPENID",
//                                "scope": "SCOPE"
//                        }

                        Log.v(TAG, "TokenHandler weixin==" + json);
                        String access_token = json.getString("access_token");
                        String openid = json.getString("openid");
//                        //刷新或续期 access_token 使用
                        NetworkUtil.sendWxAPI(mUserHandler, String.format("https://api.weixin.qq.com/sns/userinfo?" +
                                        "access_token=%s&openid=refresh_token&lang=zh-CN", access_token,
                                openid), NetworkUtil.GET_TOKEN);

                    } catch (JSONException e) {
                        Log.e(TAG, e.getMessage());
                    }
                }
            }
        }
    }

    @SuppressLint("HandlerLeak")
    private class UserHandler extends Handler {
        private final WeakReference<WXEntryActivity> wxEntryActivityWeakReference;


        public UserHandler(WXEntryActivity wxEntryActivity) {
            wxEntryActivityWeakReference = new WeakReference<WXEntryActivity>(wxEntryActivity);
        }

        @Override
        public void handleMessage(Message msg) {
            int tag = msg.what;
            switch (tag) {
                case NetworkUtil.GET_TOKEN: {
                    Bundle data = msg.getData();
                    JSONObject json = null;
                    try {
                        json = new JSONObject(data.getString("result"));
                        //返回示例
//                        {
//                            "openid": "OPENID",
//                                "nickname": "NICKNAME",
//                                "sex": 1,
//                                "province": "PROVINCE",
//                                "city": "CITY",
//                                "country": "COUNTRY",
//                                "headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
//                                "privilege": ["PRIVILEGE1", "PRIVILEGE2"],
//                            "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
//                        }

                        Log.v(TAG, "UserHandler weixin==" + json);
                        mOpenid = json.getString("openid");
                        mUnionid = json.getString("unionid");
                        mName = json.getString("nickname");
                        mHeadimgurl = json.getString("headimgurl");
                        if (!TextUtils.isEmpty(mUnionid)) {
                            Log.v(TAG, "--unionid==" + mUnionid + "---openid==" + mOpenid + "---nickname==" + mName + "---headimgurl" + mHeadimgurl);
                            //这里就进行微信登录之后要进行的一些操作,比如将用户信息传给接口等
                            ThirdLoginPresenter thirdLoginPresenter = new ThirdLoginPresenter(new WxCall());
                            Map<String, Object> maps = new HashMap<>();
                            maps.put("platform", "wechat");
                            maps.put("unionid", mUnionid);
                            RequestBody bodys = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),
                                    new Gson().toJson(maps));
                            thirdLoginPresenter.reqeust(bodys);
                        }

                    } catch (JSONException e) {
                        Log.e(TAG, e.getMessage());
                    }
                }
            }
        }
    }

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

    @Override
    protected int getLayoutId() {
        return R.layout.activity_wxentry;
    }

    @Override
    protected void initView() {
        token = PreferenceUtil.getString(Zhijiaojia, "token");
        wxapi = WXAPIFactory.createWXAPI(this, "wxb3bd283e7ca67de1");
        wxapi.handleIntent(getIntent(), this);
        WeiXinUtil.reg(WXEntryActivity.this).handleIntent(getIntent(), this);

    }

    @Override
    protected void destoryData() {

    }

    @Override
    public void onReq(BaseReq baseReq) {

    }

    @Override
    public void onResp(BaseResp baseResp) {
        switch (baseResp.errCode) {
            // 正确返回
            case BaseResp.ErrCode.ERR_OK:
                switch (baseResp.getType()) {
                    case ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX:
                        //微信分享
                        Log.v(TAG, "----onResp----token==" + token);
                        //分享成功请求赚取佣金接口
                        SharePresenter sharePresenter = new SharePresenter(new shareCall());
                        Map<String, Object> map = new HashMap<>();
                        map.put("type", "goods");
                        RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),
                                new Gson().toJson(map));
                        sharePresenter.reqeust(token, body);

                        break;
                    case ConstantsAPI.COMMAND_SENDAUTH:
                        SendAuth.Resp authResp = (SendAuth.Resp) baseResp;
                        final String code = authResp.code;
                        //微信登录
                        //官网步骤https://developers.weixin.qq.com/doc/oplatform/Mobile_App/WeChat_Login/Authorized_API_call_UnionID.html
//                        通过 code 获取 access_token
                        Log.v(TAG, "---code==" + code);
                        NetworkUtil.sendWxAPI(handler, String.format("https://api.weixin.qq.com/sns/oauth2/access_token?" +
                                        "appid=%s&secret=%s&code=%s&grant_type=authorization_code", "wxb3bd283e7ca67de1",
                                "d39b1b8ece397dd3db74a7ecf52c5684", code), NetworkUtil.GET_TOKEN);

                        break;
                    default:
                        break;
                }
                break;

            default:
                // 错误返回
                switch (baseResp.getType()) {
                    // 微信分享
                    case ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX:
                        Log.e("WXEntryActivity", ">>>errCode = " + baseResp.errCode);
                        ToastUtil.show("分享失败");
                        finish();
                        break;
                    default:
                        break;
                }
                break;
        }
    }

    /**
     * 接口请求成功
     */
    class WxCall implements DataCall<Result<DataBean>> {

        @Override
        public void success(Result<DataBean> data) {
            ToastUtil.show(data.getMsg());
          
        }

        @Override
        public void fail(ApiException e) {

        }
    }

    /**
     * 分享成功回调
     */
    class shareCall implements DataCall<Result> {

        @Override
        public void success(Result data) {
            Log.v(TAG, "---shareCall---" + data.getMsg());
            if (data.getCode() == 200) {
                ToastUtil.show(data.getMsg());
            } else {
                ToastUtil.show(data.getMsg());
            }
            finish();
        }

        @Override
        public void fail(ApiException e) {

        }
    }
}

QQ登录请查看QQ登录

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值