第三方微信登录
来源:互联网 发布: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
- 第三方微信登录
- 第三方微信登录
- 网站登录之第三方微信登录
- android集成第三方微信登录
- 第三方微信登录详细教程
- android集成第三方微信登录
- 第三方:微信---如何使用第三方微信登录
- Android App实现第三方微信登录
- Android App实现第三方微信登录
- iOS 第三方微信登录集成-错误-40029
- iOS第三方微信登录时不走回调方法
- android app使用第三方微信登录
- 第三方微信接入登录流程整理
- iOS 第三方微信登录集成-错误-40029
- 新浪第三方登录
- 第三方帐号登录
- 第三方登录
- QQ第三方登录
- varchar与varchar2的区别
- 那些年在WebView上踩过的坑
- kafka入门:简介、使用场景、设计原理、主要配置及集群搭建
- linux svn常用命令
- CSS 属性 - 伪类和伪元素的区别
- 第三方微信登录
- Android OpenGL 纹理绘制图像---基础知识
- redis+sentinel+keepalived 高可用,可实现多台并单点访问
- Fiddler 图标含义
- jdbc,叫的很顺口,但是你真的知道这个是什么意思吗?
- 蓝桥杯算法 入门 圆的面积
- 根据sqlId查询参数及位置
- bfs hdu5965
- android 开发零起步学习笔记(十六):Android命名规范