第三方微信登录

来源:互联网 发布:c语言产生随机数rand 编辑:程序博客网 时间:2024/05/17 06:52

activity_main:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/activity_main"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.ddgl.ddlx.MainActivity">    <Button        android:id="@+id/btn_WXlogin"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="微信登录"/></RelativeLayout>
MainActivity:

package com.ddgl.ddlx;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Toast;import com.tencent.mm.sdk.modelmsg.SendAuth;import com.tencent.mm.sdk.openapi.IWXAPI;import com.tencent.mm.sdk.openapi.WXAPIFactory;public class MainActivity extends AppCompatActivity implements View.OnClickListener{    private final String APP_ID = "wxac61dec4174c8698";    private static final String TAG = "info";    private IWXAPI api;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        if (api==null){            api = WXAPIFactory.createWXAPI(MainActivity.this, APP_ID, true);            api.registerApp(APP_ID);        }        if (!api.isWXAppInstalled()){//提醒用户没有安装微信            Toast.makeText(this, "检测到您的手机没有安装微信,请先安装微信!", Toast.LENGTH_SHORT).show();            return;        }        if (!api.isWXAppSupportAPI()){//提醒用户没有安装微信            Toast.makeText(this, "检测到您的手机没有安装微信,请先安装微信!", Toast.LENGTH_SHORT).show();            return;        }        initView();    }    private void initView() {        findViewById(R.id.btn_WXlogin).setOnClickListener(this);    }    @Override    public void onClick(View view) {        switch (view.getId()){            case R.id.btn_WXlogin:                wxLogin();                break;        }    }    private void wxLogin() {        Log.i(TAG, "wxLogin: "+"开始发送请求");        final SendAuth.Req req = new SendAuth.Req();        req.scope = "snsapi_userinfo";        req.state = "wechat_sdk_demo_test";        api.sendReq(req);    }}
wxapi-WXEntryActivity:

package com.ddgl.ddlx.wxapi;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.widget.Toast;import com.ddgl.ddlx.R;import com.tencent.mm.sdk.constants.ConstantsAPI;import com.tencent.mm.sdk.modelbase.BaseReq;import com.tencent.mm.sdk.modelbase.BaseResp;import com.tencent.mm.sdk.modelmsg.SendAuth;import com.tencent.mm.sdk.openapi.IWXAPI;import com.tencent.mm.sdk.openapi.IWXAPIEventHandler;import com.tencent.mm.sdk.openapi.WXAPIFactory;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.util.EntityUtils;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import java.io.IOException;import static android.provider.UserDictionary.Words.APP_ID;public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {    private static final String TAG = "info";    private IWXAPI api;    private String code;    private String APPID = "wxac61dec4174c8698";    private String APP_SECRET = "431ccf907f8d2057cb0a87843a6df6af";    private String ACCESS_TOKEN;    private String access_token;    private String REFRESH_TOKEN;    private String refresh_token;    private String scope;    private String OPENID;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_wxentry);        api = WXAPIFactory.createWXAPI(this, APPID, false);        api.handleIntent(getIntent(), this);    }    // 微信发送请求到第三方应用时,会回调到该方法    @Override    public void onReq(BaseReq baseReq) {    }    // 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法    @Override    public void onResp(BaseResp baseResp) {        switch (baseResp.errCode) {            case BaseResp.ErrCode.ERR_OK:                //即为所需的code                SendAuth.Resp newResp = (SendAuth.Resp) baseResp;                code = newResp.code;                Log.i(TAG, "onResp: " + "code获取成功");                //耗时操作开启子线程                new Thread(new Runnable() {                    @Override                    public void run() {                        accessToken(code);                    }                }).start();                break;            case BaseResp.ErrCode.ERR_AUTH_DENIED:                Log.i(TAG, "onResp: " + "用户拒绝授权");                break;            case BaseResp.ErrCode.ERR_USER_CANCEL:                Log.i(TAG, "onResp: " + "用户取消");                break;            default:                break;        }    }    //用get方式请求    private void accessToken(String CODE) {        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + APPID + "&secret=" + APP_SECRET + "&code=" + CODE + "&grant_type=authorization_code";        HttpClient httpClient = new DefaultHttpClient();        HttpGet httpGet = new HttpGet(url);        try {            HttpResponse response = httpClient.execute(httpGet);            if (response.getStatusLine().getStatusCode() == 200) {//表示链接成功                String result = EntityUtils.toString(response.getEntity(), "utf-8");                JSONObject jsonObject = new JSONObject(result);                if (jsonObject.toString().contains("access_token")) {                    access_token = jsonObject.getString("access_token");                    refresh_token = jsonObject.getString("refresh_token");                    scope = jsonObject.getString("scope");                    Log.i(TAG, "accessToken: " + access_token + " " + "refreshToken==" + refresh_token + " " + "SCOPE==" + scope);                    refreshToken();                } else {                    String errcode = jsonObject.getString("errcode");                    String errmsg = jsonObject.getString("errmsg");                    Log.i(TAG, "access: 返回的错误结果是:" + errcode + "或者" + errmsg);                }            } else {                Log.i(TAG, "access: " + "链接失败");            }        } catch (IOException e) {            e.printStackTrace();        } catch (JSONException e) {            e.printStackTrace();        }    }    private void refreshToken() {        String url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" + APPID + "&grant_type=refresh_token&refresh_token=" + refresh_token;        HttpClient httpClient = new DefaultHttpClient();        HttpGet httpGet = new HttpGet(url);        try {            HttpResponse response = httpClient.execute(httpGet);            if (response.getStatusLine().getStatusCode() == 200) {//表示链接成功                String result = EntityUtils.toString(response.getEntity(), "utf-8");                JSONObject jsonObject = new JSONObject(result);                if (jsonObject.toString().contains("access_token")) {                    ACCESS_TOKEN = jsonObject.getString("access_token");                    REFRESH_TOKEN = jsonObject.getString("refresh_token");                    OPENID = jsonObject.getString("openid");                    String scope = jsonObject.getString("scope");                    //判断access_token是否有效                    judgeAccessToken();                } else {                    String errcode = jsonObject.getString("errcode");                    String errmsg = jsonObject.getString("errmsg");                    Log.i(TAG, "access: 返回的错误结果是:" + errcode + "或者" + errmsg);                }            } else {                Log.i(TAG, "access: " + "链接失败");            }        } catch (IOException e) {            e.printStackTrace();        } catch (JSONException e) {            e.printStackTrace();        }    }    //判断AccessToken是否有效    private void judgeAccessToken() {        String url = "https://api.weixin.qq.com/sns/auth?access_token=" + ACCESS_TOKEN + "&openid=" + OPENID;        HttpClient httpClient = new DefaultHttpClient();        HttpGet httpGet = new HttpGet(url);        try {            HttpResponse response = httpClient.execute(httpGet);            if (response.getStatusLine().getStatusCode() == 200) {//表示链接成功                String result = EntityUtils.toString(response.getEntity(), "utf-8");                JSONObject jsonObject = new JSONObject(result);                int errcode = jsonObject.getInt("errcode");                String errmsg = jsonObject.getString("errmsg");                if (errcode == 0 && errmsg.equals("ok")) {                    Log.i(TAG, "judgeAccessToken: " + "有效");                    getUserInfos();                } else if (errcode == 40003 && errmsg.equals("invalid openid")) {                    Log.i(TAG, "judgeAccessToken: " + "无效");                }            } else {                Log.i(TAG, "access: " + "链接失败");            }        } catch (IOException e) {            e.printStackTrace();        } catch (JSONException e) {            e.printStackTrace();        }    }    //获取用户信息    private void getUserInfos() {        String url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + ACCESS_TOKEN + "&openid=" + OPENID;        HttpClient httpClient = new DefaultHttpClient();        HttpGet httpGet = new HttpGet(url);        try {            HttpResponse response = httpClient.execute(httpGet);            if (response.getStatusLine().getStatusCode() == 200) {//表示链接成功                String result = EntityUtils.toString(response.getEntity(), "utf-8");                JSONObject jsonObject = new JSONObject(result);                if (jsonObject.toString().contains("openid")) {                    Log.i(TAG, "getUserInfos: " + "获取用户信息成功");                    String openid = jsonObject.getString("openid");                    String nickname = jsonObject.getString("nickname");                    Log.i(TAG, "getUserInfos: 昵称为:"+nickname);                    String sex = jsonObject.getString("sex");                    String province = jsonObject.getString("province");                    String city = jsonObject.getString("city");                    String country = jsonObject.getString("country");                    String headimgurl = jsonObject.getString("headimgurl");                    JSONArray privilege = jsonObject.getJSONArray("privilege");                    //遍历数组                    String unionid = jsonObject.getString("unionid");                } else {                    Log.i(TAG, "getUserInfos: " + "获取用户信息失败");                    String errcode = jsonObject.getString("errcode");                    String errmsg = jsonObject.getString("errmsg");                    Log.i(TAG, "access: 返回的错误结果是:" + errcode + "或者" + errmsg);                }            } else {                Log.i(TAG, "access: " + "链接失败");            }        } catch (IOException e) {            e.printStackTrace();        } catch (JSONException e) {            e.printStackTrace();        }    }    @Override    protected void onNewIntent(Intent intent) {        super.onNewIntent(intent);        setIntent(intent);        api.handleIntent(intent, this);        finish();    }}

笔记:

第一步:导包-add as library
第二步:添加权限
第三步:MainActivity写代码,给微信发送授权请求
第四步:新建一个wxapi包,新建一个WXEntryActivity类(记得修改menifest里边activity的属性)--还有handlerIntent一定要写
第五步:如果需要混淆代码,为了保证sdk的正常使用,需要在proguard.cfg加上下面两行配置:
-keep class com.tencent.mm.sdk.** {
   *;
}


自己做项目中遇到的问题:
1.keystore文件的改变和app项目的改变都会导致签名的变化,即使它的包名不变,谨记。一定记得要去修改一下应用签名。
2.WXEntryActivity中:api的值为空,以后复制粘贴的时候要注意
3.api.handlerIntent(getIntent(),this);----一定要写
4.注意WXEntryActivity中APP_ID为空值。因为另一个界面APP_ID写的是private。


最后感谢这两个链接,让我能够不断思考,成功做成项目

第三方App接入微信登录 解读

Android 微信第三方登录


微信开放平台链接:

移动应用微信登录开发指南



0 0
原创粉丝点击