Authing 文档文档
快速开始
概念
使用指南
开发集成 V2 arrow
  • V2 文档
  • V3 文档
元数据
应用集成
身份自动化
加入 APN
开发集成
多租户(内测版)
控制台文档
多租户控制台
租户控制台
Saas 应用 Demo
快速开始
概念
使用指南
开发集成 V2 arrow
  • V2 文档
  • V3 文档
元数据
应用集成
身份自动化
加入 APN
开发集成
多租户(内测版)
控制台文档
多租户控制台
租户控制台
Saas 应用 Demo
旧版
开发集成
  • JavaScript SDK 索引
  • 单点登录(SSO)
  • 登录组件 (Guard)

  • 多因素认证组件(MFA)

  • JavaScript / Node.js

  • Java / Kotlin

  • Python

  • C#

  • PHP

  • Go

  • Ruby
  • Delphi
  • Android

    • 快速开始
    • 托管页
    • 超组件

    • APIs

    • 第三方身份源

      • 微信登录
      • 支付宝登录
      • 手机号一键登录
      • Google 登录
      • Facebook 登录
      • APP 拉起微信小程序登录
      • 腾讯 QQ 登录
      • 新浪微博登录
      • 百度登录
      • Linkedin 登录
      • Github 登录
      • Gitee 登录
      • GitLab 登录
      • 抖音登录
      • 快手登录
      • 华为登录
      • OPPO 登录
      • 小米登录
      • Line 登录
      • Slack 登录
      • 亚马逊登录
      • 企业微信登录
      • 飞书登录
      • 钉钉登录
    • 典型场景

    • 私有化部署
    • Android Guard 更新日志
    • 合规使用指南
    • 返回码对照表
  • iOS

  • Flutter

  • 微信小程序
  • 微信网页授权
  • React Native
  • 框架集成

  • Radius
  • 错误代码

¶ 微信登录

更新时间: 2025-05-14 08:32:28
编辑

¶ 准备工作

在微信开放平台 (opens new window)及 Authing Console 控制台 (opens new window) 进行配置,请参阅微信移动端。


¶ 集成步骤

¶ 第一步:添加依赖

implementation 'cn.authing:guard:+'
implementation 'com.tencent.mm.opensdk:wechat-sdk-android:6.8.0'

Guard 只是 compileOnly 依赖微信,这样可以让 App 按需引入,防止 Guard aar 包随着支持的第三方登录增加而越来越大。所以每增加一个第三方身份源,都需要 App 手动加上该身份源的依赖。

¶ 第二步:初始化

在应用启动的时候初始化 Guard Android SDK:

// context is application or initial activity
// ”AUTHING_APP_ID“ is obtained from the Authing console
Authing.init(context, "AUTHING_APP_ID");
Authing.setAuthProtocol(Authing.AuthProtocol.EOIDC)

¶ 第三步:创建WXEntryActivity

由于微信的限制,必须在应用包名所在的目录下创建一个 wxapi/WXEntryActivity。假设你的应用包名为:

com.example.myapp

则需要按照如下方式创建:

其内容只需要继承我们的实现类:

package com.example.myapp.wxapi;

import cn.authing.guard.social.callback.wechat.WXCallbackActivity;

public class WXEntryActivity extends WXCallbackActivity {
}

¶ 第四步:在 Manifest 里面声明微信回调 Activity

在 manifest 文件里面加上exported、taskAffinity及 launchMode 属性,其中 exported 设置为true,taskAffinity设置为你的包名,launchMode设置为singleTask,如:

<activity
    android:name=".wxapi.WXEntryActivity"
    android:exported="true"
    android:taskAffinity="填写你的包名"
    android:launchMode="singleTask"/>

注意事项

如果需要混淆代码,为了保证 sdk 的正常使用,需要在 proguard.cfg 加上下面配置:

-keep class com.tencent.mm.opensdk.** {
    *;
}

-keep class com.tencent.wxop.** {
    *;
}

-keep class com.tencent.mm.sdk.** {
    *;
}

通过以上步骤即可简单快速的通过 Authing 管理控制台配置后自动获取微信身份源,登录入口会在 Guard 内置登录界面的社会化登录按钮列表中体现

  • 接下来,如果使用我们提供的微信登录按钮,则在布局文件里面加上(当然也可以用代码初始化):
<cn.authing.guard.social.view.WechatLoginButton
    android:id="@+id/btn_login"
    android:layout_width="44dp"
    android:layout_height="44dp"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"/>

然后在 java 代码里面处理事件:

WechatLoginButton wechatLoginButton = findViewById(R.id.btn_login);
wechatLoginButton.setOnLoginListener(new AuthCallback<UserInfo>() {
    @Override
    public void call(int code, String message, UserInfo data) {
      	if (code == 200) {
        	// 登录成功,data 是用户信息
       	} else {
        	// 登录失败
      	}
    }
});

  • 如果不想使用我们内置的按钮,则可以在自己按钮的点击事件里面调用 Authing 微信登录 API:

    如果想获取到用户信息:

Wechat wechat = new Wechat();
wechat.login(appContext, context, new AuthCallback<UserInfo>() {
    @Override
    public void call(int code, String message, UserInfo data) {
        if (code == 200) {
          // 登录成功,data 是用户信息
        } else if (code == 1640) {
          // 只允许绑定已有账号
          // data.getSocialBindData() 中返回 method(登录方式) 以及 key(中间态键)
        } else if (code == 1641) {
          // 允许绑定已有账号,或者创建新账号
          // data.getSocialBindData() 中返回 method(登录方式) 以及 key(中间态键)
        } else if (code == 2921) {
          // 多账号选择后绑定
          // data.getSocialBindData() 中返回 accounts(账号列表) 以及 key(中间态键)
        } else {
          // 登录失败
        }
    }
});

​ data 包含用户信息(用户名、昵称、姓名等)以及 idToken。

​ 如果想只获取微信的授权码:

Wechat wechat = new Wechat();
wechat.getAuthCode(this, new AuthCallback<String>() {
    @Override
    public void call(int code, String message, String authCode) {
      	if (code == 200) {
      	  // 获取成功,authCode 是微信授权码
       	} 
    }
});

  • 如果想完全自己实现微信登录,拿到授权码后,可以调用下面 API 换取用户信息:
public static void loginByWechatWithBind(String authCode, String context, @NotNull AuthCallback<UserInfo> callback)

参数

  • authCode 微信授权码

  • context 请求上下文,这里设置的 context 可以在 pipeline 的 context 中获取到。

示例

如果你只需要获取到用户信息(用户名、昵称、姓名等)和 idToken,调用:

AuthClient.loginByWechatWithBind(authCode, context, new AuthCallback<UserInfo>() {
    @Override
    public void call(int code, String message, UserInfo data) {
        if (code == 200) {
          // 登录成功,data 是用户信息,包含 idToken。
        } else if (code == 1640) {
          // 只允许绑定已有账号
          // data.getSocialBindData() 中返回 method(登录方式) 以及 key(中间态键)
        } else if (code == 1641) {
          // 允许绑定已有账号,或者创建新账号
          // data.getSocialBindData() 中返回 method(登录方式) 以及 key(中间态键)
        } else if (code == 2921) {
          // 多账号选择后绑定
          // data.getSocialBindData() 中返回 accounts(账号列表) 以及 key(中间态键)
        }  else {
          // 登录失败
        }
    }
});

如果你需要获取到用户信息(用户名、昵称、姓名等)、idToken、accessToken 和 refreshToken,调用:

OIDCClient oidcClient = new OIDCClient();
oidcClient.loginByWechatWithBind(authCode, context, new AuthCallback<UserInfo>() {
    @Override
    public void call(int code, String message, UserInfo data) {
        if (code == 200) {
          // 登录成功,data 是用户信息,包含 idToken、accessToken 和 refreshToken。
        } else if (code == 1640) {
          // 只允许绑定已有账号
          // data.getSocialBindData() 中返回 method(登录方式) 以及 key(中间态键)
        } else if (code == 1641) {
          // 允许绑定已有账号,或者创建新账号
          // data.getSocialBindData() 中返回 method(登录方式) 以及 key(中间态键)
        } else if (code == 2921) {
          // 多账号选择后绑定
          // data.getSocialBindData() 中返回 accounts(账号列表) 以及 key(中间态键)
        }  else {
          // 登录失败
        }
    }
});

错误码

  • 1640 只允许绑定已有账号。

  • 1641 允许绑定已有账号,或者创建新账号。

  • 2921 多账号询问后选择并绑定。

  • 602 请求第三方端点时返回错误,请在控制台检查微信移动端身份源 appSecret 配置是否正确。

  • 422 外部身份源连接类型不匹配,身份源类型错误。

  • 501 此身份源连接不支持询问式绑定,未开启「询问绑定」关联方式。

  • 403 不允许的登录模式,请在控制台检查信移动端身份源配置。

  • 499 应用不存在!。

  • 404 权限组不存在,无权限登录:认证时没有用户信息,则创建新用户和身份,发现开启了「仅登录模式」。

  • 403 无权限登录,请联系管理员。

¶ 账号绑定相关 API

如果你想在微信账号登录的时候绑定实现询问是否绑定已有账号,可以在 Authing Console 控制台 (opens new window)中开启询问绑定功能,

身份源管理 -> 社会化身份源 -> 微信 -> 微信移动端 -> 账号绑定:

如果使用我们的 AuthFlow 托管页,开启了账号绑定后,托管页中处理了相关业务流程。

如果已经选择了登录模式,并且开启了账号绑定功能,通过如下 API 构建后续业务流程:

¶ 新建账号

如果登录模式选择了可用于登录注册,并且开启了账号绑定,在调用 loginByWechatWithBind 接口时会返回 1641 状态码以及 key,这个时候可以调用新建账号接口直接创建账号。

public static void bindWechatWithRegister(String key, @NotNull AuthCallback<UserInfo> callback)

参数

  • key 中间态键,由 loginByWechatWithBind 接口返回。

示例

AuthClient.bindWechatWithRegister("key", new AuthCallback<UserInfo>() {
    @Override
    public void call(int code, String message, UserInfo data) {
      	if (code == 200) {
      	  // 成功,data 是用户信息
       	} 
    }
});

¶ 通过账号密码绑定

如果开启了账号绑定,在调用 loginByWechatWithBind 接口时会返回 1640 状态码、支持的绑定方式以及 key,如果支持的绑定方式包含username-password、phone-password、email-password,这个时候可以调用通过账号密码绑定接口绑定已有账号。

public static void bindWechatByAccount(String key, String account, String password, @NotNull AuthCallback<UserInfo> callback)

参数

  • key 中间态键,由 loginByWechatWithBind 接口返回。
  • account 账号(Authing 用户:用户名 / 手机号 / 邮箱)。
  • password 密码,需要经过 rsa 算法加密。

示例

AuthClient.bindWechatByAccount("key", "张三", "xxxxxx", new AuthCallback<UserInfo>() {
    @Override
    public void call(int code, String message, UserInfo data) {
      	if (code == 200) {
      	  // 成功,data 是用户信息
       	} 
    }
});

错误码

  • 499 使用 rsa 算法解密密码失败,请检查请求参数。

¶ 通过手机号验证码绑定

如果开启了账号绑定,在调用 loginByWechatWithBind 接口时会返回 1640 状态码、支持的绑定方式以及 key,如果支持的绑定方式包含phone-code,这个时候可以调用通过手机号验证码绑定接口绑定已有账号。

public static void bindWechatByPhoneCode(String key, String phoneCountryCode, String phone, String code, @NotNull AuthCallback<UserInfo> callback)

参数

  • key 中间态键,由 loginByWechatWithBind 接口返回。
  • phoneCountryCode 电话国家码。可以为空,为空时默认为 +86
  • phone 手机号
  • code 短信验证码

示例

AuthClient.bindWechatByPhoneCode("key", "+86", "188xxxx8888", "1234", new AuthCallback<UserInfo>() {
    @Override
    public void call(int code, String message, UserInfo data) {
      	if (code == 200) {
      	  // 成功,data 是用户信息
       	} 
    }
});

错误码

  • 2001 验证码不正确。
  • 2001 验证码已失效,请重新获取验证码。

¶ 通过邮箱验证码绑定

如果开启了账号绑定,在调用 loginByWechatWithBind 接口时会返回 1640 状态码、支持的绑定方式以及 key,如果支持的绑定方式包含email-code,这个时候可以调用通过邮箱验证码绑定接口绑定已有账号。

public static void bindWechatByEmailCode(String key, String email, String code, @NotNull AuthCallback<UserInfo> callback)

参数

  • key 中间态键,由 loginByWechatWithBind 接口返回。
  • email 邮箱
  • code 验证码

示例

AuthClient.bindWechatByEmailCode("key", "test@example.com", "1234", new AuthCallback<UserInfo>() {
    @Override
    public void call(int code, String message, UserInfo data) {
      	if (code == 200) {
      	  // 成功,data 是用户信息
       	} 
    }
});

错误码

  • 2001 验证码不正确。
  • 2001 验证码已失效,请重新获取验证码。

¶ 通过多账号选择绑定

如果开启了账号绑定,在调用 loginByWechatWithBind 接口时会返回 2921 状态码、支持的绑定的账号数据以及 key,这个时候可以调用通过多账号选择绑定接口绑定已有账号。

public static void bindWechatBySelectedAccountId(String key, String account, @NotNull AuthCallback<UserInfo> callback)

参数

  • key 中间态键,由 loginByWechatWithBind 接口返回。
  • account 选定的账号 ID(Authing 用户),由 loginByWechatWithBind 接口返回。

示例

AuthClient.bindWechatBySelectedAccountId("key", "638xxxxxxxxxxxxxx", new AuthCallback<UserInfo>() {
    @Override
    public void call(int code, String message, UserInfo data) {
      	if (code == 200) {
      	  // 成功,data 是用户信息
       	} 
    }
});

¶ 通过账号 Id 绑定

如果开启了账号绑定,在调用 loginByWechatWithBind 接口时会返回 1640 或者 1641 状态码、支持的绑定的账号数据以及 key,这个时候可以调用通过账号 Id 绑定接口绑定已有账号。

public static void bindWechatByAccountId(String key, String accountId, @NotNull AuthCallback<UserInfo> callback)

参数

  • key 中间态键,由 loginByWechatWithBind 接口返回。
  • accountId 账号 ID(Authing 用户 ID)。

示例

AuthClient.bindWechatByAccountId("key", "638xxxxxxxxxxxxxx", new AuthCallback<UserInfo>() {
    @Override
    public void call(int code, String message, UserInfo data) {
      	if (code == 200) {
      	  // 成功,data 是用户信息
       	} 
    }
});

上一篇: 第三方身份源 下一篇: 支付宝登录
  • 准备工作
  • 集成步骤
  • 账号绑定相关 API

用户身份管理

集成第三方登录
手机号闪验 (opens new window)
通用登录表单组件
自定义认证流程

企业内部管理

单点登录
多因素认证
权限管理

开发者

开发文档
框架集成
博客 (opens new window)
GitHub (opens new window)
社区用户中心 (opens new window)

公司

400 888 2106
sales@authing.cn
北京市朝阳区北辰世纪中心 B 座 16 层(总)
成都市高新区天府五街 200 号 1 号楼 B 区 4 楼 406 室(分)

京ICP备19051205号

beian京公网安备 11010802035968号

© 北京蒸汽记忆科技有限公司