广告
返回顶部
首页 > 资讯 > 移动开发 >微信第三方登录Android实现代码
  • 522
分享到

微信第三方登录Android实现代码

微信第三方Android 2022-06-06 06:06:07 522人浏览 八月长安
摘要

记录一下微信第三方实现登录的方法。还是比较简单。 一、必要的准备工作 1.首先需要注册并被审核通过的微信开放平台帐号,然后创建一个移动应用,也需要被审核; 2.然后到资源

记录一下微信第三方实现登录的方法。还是比较简单。

一、必要的准备工作

1.首先需要注册并被审核通过的微信开放平台帐号,然后创建一个移动应用,也需要被审核;

2.然后到资源中心下载开发微信所需的工具

下载的网址:点击打开链接,有一个是SDK,一个是签名生成工具还有一个范例代码。

3.将SDK文件夹lib下的jar文件libammsdk.jar导入到项目工程中;

4.你的测试手机需要装好微信客户端;

5.在项目的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"/>  

6.因为微信登录后会返回结果到我们自己的应用,因此,我们需要按如下的规则来建立一个可供回调的Activity

a. 在包名(申请移动应用时所填的包名)下新建一个名为wxapi的包,然后再在wxapi的包中新增一个WXEntryActivity类,这个类需要继承自Activity。

然后再在这个AndroidManifest.xml文件中,将这个activity的export属性设置为true,如下所示。


 <activity 
      android:name=".wxapi.WXEntryActivity" 
      android:label="@string/title_activity_wxlogin" 
      android:launchMode="singleTop" 
      android:exported="true"> 
      <intent-filter> 
        <action android:name="android.intent.action.MaiN" /> 
        <cateGory android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
</activity> 

b. 实现IWXAPIEventHandler接口,微信发送的请求将回调到onReq方法,发送到微信请求的响应结果将回调到onResp方法

c. 在WXEntryActivity中将接收到的intent及实现了IWXAPIEventHandler接口的对象传递给IWXAPI接口的handleIntent方法,如下所示


api.handleIntent(getIntent(), this); 

7.微信认证的时序图

这里有一点要注意,就是从上往下数第6个箭头,即通过code加上appid和appsecret换取access_token,其实这一步是在第三方应用服务器上做的,因为appsecret和access_token直接存储于客户端是非常不安全的。Android客户端获取code后,把这个code提交给应用服务器,应用服务器上保存有appsecret信息,由应用服务器来获取access_token,并用access_token来完成其它工作。

二、Android代码

在上一步添加的WXEntryActivity对应的类文件中添加必要的代码,我的代码如下:


package com.example.justyoung.logintest.wxapi; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Toast; 
import com.example.justyoung.logintest.httpsHelper; 
import com.example.justyoung.logintest.R; 
import com.example.justyoung.logintest.fileExplorer.WXConstant; 
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 java.io.IOException; 
import java.security.KeyManagementException; 
import java.security.NoSuchAlgorithmException; 
import java.util.UUID; 
public class WXEntryActivity extends ActionBarActivity implements IWXAPIEventHandler{ 
  private Button wxLogin; 
  private IWXAPI api; 
  private static String uuid; 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_wxlogin); 
    wxLogin = (Button) findViewById(R.id.wx_login_button); 
    wxLogin.setOnClickListener(new WXLoginEvent()); 
    api = WXAPIFactory.createWXAPI(this, WXConstant.APPID); 
    api.reGISterApp(WXConstant.APPID); 
    api.handleIntent(getIntent(), this); 
  } 
  @Override 
  public void onReq(BaseReq baseReq) { 
  } 
  @Override 
  public void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 
    setIntent(intent); 
    api.handleIntent(intent, this); 
  } 
  @Override 
  public void onResp(BaseResp resp) { 
    String result; 
    switch (resp.errCode) { 
      case BaseResp.ErrCode.ERR_OK: 
        result = "OK"; 
        SendAuth.Resp regResp = (SendAuth.Resp)resp; 
        if (!regResp.state.equals(uuid)) 
          return; 
        String code = regResp.code; 
        new WXLoginThread("Https://192.168.2.133:8443/CloudStorageServer/wechat/login?code=" + code).start(); 
        break; 
      case BaseResp.ErrCode.ERR_USER_CANCEL: 
        result = "USER_CANCEL"; 
        break; 
      case BaseResp.ErrCode.ERR_AUTH_DENIED: 
        result = "ERR_AUTH_DENIED"; 
        break; 
      default: 
        result = "errcode_unknown"; 
        break; 
    } 
    Toast.makeText(this, result, Toast.LENGTH_LONG).show(); 
  } 
  class WXLoginEvent implements View.OnClickListener { 
    @Override 
    public void onClick(View v) { 
      uuid = UUID.randomUUID().toString(); 
      final SendAuth.Req req = new SendAuth.Req(); 
      req.scope = "snsapi_userinfo"; 
      req.state = uuid; 
      api.sendReq(req); 
    } 
  } 
  private class WXLoginThread extends Thread { 
    private String url; 
    public WXLoginThread(String url) { 
      this.url = url; 
    } 
    @Override 
    public void run() { 
      HttpsHelper httpsHelper = new HttpsHelper(); 
      try { 
        httpsHelper.prepareHttpsConnection(url); 
        String response = httpsHelper.connect(); 
      } catch (KeyManagementException e) { 
        e.printStackTrace(); 
      } catch (NoSuchAlgorithmException e) { 
        e.printStackTrace(); 
      } catch (IOException e) { 
        e.printStackTrace(); 
      } 
    } 
  } 
} 

代码中的如下片段是用来拉起微信认证界面的。这里我使用了uuid来作为state参数,(该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验)。


uuid = UUID.randomUUID().toString(); 
final SendAuth.Req req = new SendAuth.Req(); 
req.scope = "snsapi_userinfo"; 
req.state = uuid; 
api.sendReq(req); 

在用户接受认证后,微信应用会回调IWXAPIEventHandler接口的onResp方法。在该方法中,首先判断返回的resp的状态,若是正常状态,则判断state,然后从再从resp中获取code值。至此客户端便完成了它的工作。

因为客户端保留appsecret和access_token是非常不安全的,因此剩余信息的获取应放到我们的应用服务器上进行。

三、应用服务器代码

在Anroid客户端获取到code后,可提交到我们自己的应用服务器,在我们的应用服务器再通过code,来获取access_token,openid等用户信息。

1.通过code获取access_token,openid的方法是使用GET请求,按以下方式请求微信接口:

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code;

2.通过access_token获取用户的一些信息的方式是通过GET请求使用微信的接口:

https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID

下面贴一下我自己使用的代码:


private void handle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    String code = getParameter(request, "code"); 
    if (isArgumentNullOrEmpty(code)) { 
      Log.logger.info("code为空"); 
      return; 
    } 
    Log.logger.info("收到code: " + code); 
    try { 
      AccessToken accessToken = new AccessToken("/sns/oauth2/access_token", "authorization_code", code); 
      AccessToken.UserData userData = accessToken.getMetaData().getUserInfo(); 
      ... // userData中就是我们通过access_token获取的用户信息了。 
    } catch (WeiXinException e) { 
      Log.logException(e); 
      writeMessage(response, e.getMessage()); 
      return; 
    } catch (Exception e) { 
      Log.logException(e); 
      writeMessage(response, "login error"); 
      return; 
    } 
  } 

package com.cyber_space.thirdparty.weixin; 
import java.io.IOException; 
import java.lang.reflect.Field; 
import java.net.URI; 
import java.net.URISyntaxException; 
import org.apache.http.HttpEntity; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.methods.CloseableHttpResponse; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.client.utils.URIBuilder; 
import org.apache.http.entity.BufferedHttpEntity; 
import org.apache.http.impl.client.CloseableHttpClient; 
import org.apache.http.impl.client.HttpClients; 
import org.apache.http.util.EntityUtils; 
import com.cyber_space.util.JSONUtil; 
public class AccessToken { 
  CloseableHttpClient httpClient; 
  HttpGet httpGet; 
  URI uri; 
  String code; 
   
  public AccessToken() throws URISyntaxException { 
    uri = new URIBuilder().setScheme("https").setHost("api.weixin.qq.com").setPath("/cgi-bin/token") 
        .setParameter("grant_type", "client_credential").setParameter("appid", WeiXinConfig.APP_ID) 
        .setParameter("secret", WeiXinConfig.APP_SECRET).build(); 
    httpClient = HttpClients.createDefault(); 
    httpGet = new HttpGet(uri); 
  } 
  public AccessToken(String path, String grantType, String code) throws URISyntaxException { 
    uri = new URIBuilder().setScheme("https").setHost("api.weixin.qq.com").setPath(path) 
        .setParameter("grant_type", grantType).setParameter("appid", WeiXinConfig.APP_ID) 
        .setParameter("secret", WeiXinConfig.APP_SECRET).setParameter("code", code).build(); 
    httpClient = HttpClients.createDefault(); 
    httpGet = new HttpGet(uri); 
  } 
  public String getAccessToken() throws ClientProtocolException, IOException { 
    CloseableHttpResponse response = null; 
    try { 
      response = httpClient.execute(httpGet); 
      HttpEntity httpEntity = response.getEntity(); 
      if (httpEntity == null) 
        return null; 
      httpEntity = new BufferedHttpEntity(httpEntity); 
      String returnString = EntityUtils.toString(httpEntity); 
      String accessToken = com.cyber_space.util.jsonUtil.getAttribute(returnString, "access_token"); 
      return accessToken; 
    } finally { 
      response.close(); 
    } 
  } 
   
  public UserData getMetaData() throws ClientProtocolException, IOException, WeiXinException { 
    CloseableHttpResponse response = null; 
    try { 
      response = httpClient.execute(httpGet); 
      HttpEntity httpEntity = response.getEntity(); 
      if (httpEntity == null) 
        return null; 
      httpEntity = new BufferedHttpEntity(httpEntity); 
      String returnString = EntityUtils.toString(httpEntity); 
      JsonUtil jUtil = new JsonUtil(returnString, JsonUtil.JSONOBJECT); 
      String error = null; 
      try { 
        error = jUtil.getAttribute("errcode"); 
      } catch (Exception e) { 
      } 
      if (error != null && !error.equals("")) { 
        throw new WeiXinException(WeiXinException.INVALID_OPENID); 
      } 
      String openid = jUtil.getAttribute("openid"); 
      String accessToken = jUtil.getAttribute("access_token"); 
      UserData uData = new UserData(openid, accessToken); 
      return uData; 
    } finally { 
      response.close(); 
    } 
  } 
  public class UserData { 
    public String openid; 
    public String accessToken; 
    public String nickname; 
    public String sex; 
    public String province; 
    public String city; 
    public String country; 
    public String headimgurl; 
    public String privilege; 
    public String uNIOnid; 
    public UserData(String openid, String accessToken) { 
      this.openid = openid; 
      this.accessToken = accessToken; 
    } 
    public UserData getUserInfo() 
        throws IOException, IllegalArgumentException, IllegalAccessException, URISyntaxException, WeiXinException { 
      URI uri = new URIBuilder().setScheme("https").setHost("api.weixin.qq.com").setPath("/sns/userinfo") 
          .setParameter("access_token", this.accessToken).setParameter("openid", this.openid).build(); 
      HttpGet httpGet = new HttpGet(uri); 
      CloseableHttpResponse response = null; 
      try { 
        response = httpClient.execute(httpGet); 
        HttpEntity httpEntity = response.getEntity(); 
        if (httpEntity == null) 
          throw null; 
        httpEntity = new BufferedHttpEntity(httpEntity); 
        String jsonString = EntityUtils.toString(httpEntity); 
        JsonUtil jUtil = new JsonUtil(jsonString, JsonUtil.JSONOBJECT); 
        String errcode = null; 
        try { 
          errcode = jUtil.getAttribute("errcode"); 
        } catch (Exception e) { 
        } 
        // 通过反射循环赋值 
        if (errcode == null || errcode.equals("")) { 
          for (Field i : getClass().getFields()) { 
            if (!i.getName().equals("accessToken")) 
              i.set(this, jUtil.getAttribute(i.getName())); 
          } 
          return this; 
        } 
        else { 
          throw new WeiXinException(WeiXinException.INVALID_ACCESSTOKEN); 
        } 
      } finally { 
        response.close(); 
      } 
    } 
  } 
} 
您可能感兴趣的文章:Android第三方登录之QQ登录Android第三方登录之腾讯QQ登录的实例代码Android实现第三方登录的上拉展开,下拉隐藏,下拉隐藏示例Android微信第三方登录(个人笔记)Android 第三方登录、分享(ShareSDK、友盟)Android集成新浪微博第三方登录的方法Android实现第三方授权登录、分享以及获取用户资料Android调用第三方QQ登录代码分享React Native第三方平台分享的实例(Android,iOS双平台)Android实现QQ的第三方登录和分享


--结束END--

本文标题: 微信第三方登录Android实现代码

本文链接: https://www.lsjlt.com/news/23321.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 微信第三方登录Android实现代码
    记录一下微信第三方实现登录的方法。还是比较简单。 一、必要的准备工作 1.首先需要注册并被审核通过的微信开放平台帐号,然后创建一个移动应用,也需要被审核; 2.然后到资源...
    99+
    2022-06-06
    微信第三方 Android
  • 第三方网站微信登录java代码实现
    前两个星期在公司中的项目加上了微信登录、绑定的功能,在这里做个记录!一、开发前知识微信开放平台与微信公众平台的区别 1.1 微信公众平台:   ① 地址:https://mp.weixin.qq.com/cgi-bin/loginpage&...
    99+
    2023-05-31
    java 网站 微信登录
  • Android实现使用微信登录第三方APP的方法
    本文实例讲述了Android实现使用微信登录第三方APP的方法。分享给大家供大家参考,具体如下: 使用微信登录APP,免去注册过程,现在已经有很多的类似应用了。集成该功能过程不...
    99+
    2022-06-06
    方法 app Android
  • Android微信第三方登录(个人笔记)
    今天在写微信登录,花了半天时间搞定、然后写下自己的笔记,希望帮助更多的人。欢迎各位指教。 微信授权登录,官方说的不是很清楚、所以导致有一部分的坑。 微信注册应用平台的应用签名,...
    99+
    2022-06-06
    Android
  • Android第三方登录之腾讯QQ登录的实例代码
    布局文件<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="登录成功" androi...
    99+
    2023-05-31
    android 第三方登录
  • Android实现微信登录的示例代码
    目录一、布局界面二、MainActivity.java微信登录的实现与qq登录类似。不过微信登录比较麻烦,需要拿到开发者资质认证,花300块钱,然后应用的话还得有官网之类的,就是比较...
    99+
    2022-11-12
  • Android调用第三方QQ登录代码分享
    本文为大家分享了调用QQ登录的相关代码,希望对大家有帮助,减少项目开发的时间,具体内容如下 1、去QQ开放平台注册帐号(http://open.qq.com/),为应用申请QQ...
    99+
    2022-06-06
    Android
  • Vue实现Google第三方登录的示例代码
    目录一、开发者平台配置解决问题BUG一、开发者平台配置 1、进入开发者平台,首先前往Google API 控制台选择或者创建一个项目 谷歌开发者平台 一堆眼花缭乱的API让你...
    99+
    2022-11-12
  • Android中怎么实现第三方QQ登录
    本篇文章给大家分享的是有关Android中怎么实现第三方QQ登录,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。第三方登录之QQ代码区public class ...
    99+
    2023-05-30
    android
  • Android集成新浪微博第三方登录的方法
    本文实例讲述了Android集成新浪微博第三方登录的方法。分享给大家供大家参考。具体实现方法如下: 1.下载微博的sdk ,导入微博的jar包两个 android-suppor...
    99+
    2022-06-06
    新浪微博 方法 新浪 Android
  • .Net Core实现第三方QQ扫码登录
    目录效果展示:核心实现展示二维码解析扫码结果登录视图登录授权配置Cookie认证策略创建用户登录标识用户退出登录代码开源效果展示: 核心实现 展示二维码 public static...
    99+
    2022-11-13
  • web实现QQ第三方登录
    要实现QQ第三方登录,可以按照以下步骤进行:1. 注册QQ互联开发者账号:前往QQ互联开发者平台(https://connect.q...
    99+
    2023-09-23
    web
  • 原生java代码实现码云第三方验证登录的示例代码
    目录码云第三方验证登录一、在码云上创建应用1、在码云上注册一个账号,点击右上角设置2、创建应用3、填写资料4、获取到clientId以及client Secret二、在项目中实现第三...
    99+
    2022-11-12
  • Android 实现微信登录详解
    前言  分享到微信朋友圈的功能早已经有了,但微信登录推出并不久,文档写的也并不是很清楚,这里记录分享一下。  正文  一、准备  &nb...
    99+
    2022-06-06
    Android
  • 实现 Google 第三方授权登录
    最近做项目要实现Google的第三方登录,这简单的记录一下。 目前Google的第三方登录有很多方案,且官方提供SDK方便接入。但是我这个项目同时要实现网页和客户端。所以选择了 Google OAuth 2.0 的方案。 当然,也可以 《...
    99+
    2023-10-07
    服务器 前端
  • Java实现微信扫码登录
    微信扫码登录 1. 授权流程说明第一步:请求 code第二步:通过 code 获取 access_token第三步:通过 access_token 调用接口 2. 授权流程代码3...
    99+
    2023-09-01
    微信 java
  • vue3微信扫码登录及获取个人信息实现的三种方法
    目录一、流程:二、前置条件:三、具体登录实现实现方式一:方式二:方式三:结合后端获取到二维码四、登录微信后获取微信中用户头像和昵称一、流程: 微信提供的扫码方式有两种,分别是: 跳转...
    99+
    2023-03-02
    vue3 微信扫码登录 vue3 微信获取信息
  • Vue如何实现Google第三方登录
    这篇文章主要介绍了Vue如何实现Google第三方登录的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue如何实现Google第三方登录文章都会有所收获,下面我们一起来看看吧。...
    99+
    2022-10-19
  • node如何实现github第三方登录
    这篇文章主要介绍了node如何实现github第三方登录的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇node如何实现github第三方登录文章都会有所收获,下面我们一起来看看吧。一、详细流程二、具体流程1.注...
    99+
    2023-07-04
  • Android怎么实现微信登录功能
    这篇文章主要讲解了“Android怎么实现微信登录功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android怎么实现微信登录功能”吧!目录一、布局界面二、MainActivity.ja...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作