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

  • iOS

  • Flutter

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

  • Radius
  • 错误代码
  1. 开发集成
  2. /
  3. 微信小程序

¶ 微信小程序 SDK

Authing 小程序 SDK已经 于 2024 年 3 月 20 日使用新的文档。 Authing 小程序 SDK (opens new window)

¶ 说明

Authing 小程序 SDK 5.0 (opens new window) 于 2022 年 9 月 7 日发布,相较于原版 SDK,Authing 小程序 SDK 5.0 主要有以下几个优势:

  • 用法更简单,NPM 包名更清晰:用法更简单,按需导入 NPM 包。
  • 支持的接口更多、框架更多,覆盖更多开发者需求:
    • 支持的接口更多:集成并增强 Authing 最新 V3 版认证 API,覆盖核心认证、授权类功能。
    • 支持的小程序框架更多:包括 微信原生小程序、Taro、uni-app 框架。
  • 支持完整的 TS 类型提示,操作更便捷。
  • 运行更流畅:包体积更小,不到 5 分钟即可完成接入。
  • 支持小程序基础库 2.14.1+。

升级版 SDK 为开发者提供了更稳定、更便捷的开发环境,建议您尽快升级。

条目说明
最新版本5.1.4
仓库地址https://github.com/authing/authing-js-sdk

¶ 第一步:创建应用

使用 Authing 创建一个应用:

  • 进入控制台;
  • 展开左侧 应用 菜单,点击 自建应用 菜单;
  • 点击右上角 创建自建应用 按钮;
  • 填写 应用名称、认证地址、选择 小程序应用;
  • 点击 创建。

sdk-for-app-1

¶ 第二步:创建社会化身份源

  1. 在微信小程序后台 (opens new window)的 开发 -> 开发管理 -> 开发设置 页面获取 APPID(小程序 ID) 和 AppSecrect(小程序密钥)。

sdk-for-app-3

在当前页面底部配置 服务器域名,添加 request 合法域名。

如果你使用的是 Authing 公有云服务,request 合法域名 添加 https://core.authing.cn;如果是私有化部署,请填写你的私有化服务端地址。

sdk-wechat-request-domain

  1. 在 Authing 控制台 身份源管理 -> 社会化身份源 -> 创建社会化身份源 -> 微信 -> 小程序 创建一个微信社会化身份源,并填写以下信息:

    • 唯一标识:因为这是此连接的唯一标识,所以设置之后不能修改。
    • 显示名称
    • 小程序 ID
    • 小程序密钥

sdk-for-app-4

以上内容填写完成后,点击 创建 按钮进行保存。

sdk-for-app-5

  1. 在当前页面选择 使用此身份源的应用 并点击 保存 按钮再次保存。

sdk-for-app-6

¶ 第三步:安装 SDK

# 原生小程序 npm 支持:
# https://developers.weixin.qq.com/miniprogram/dev/devtools/npm.html
npm install --save @authing/miniapp-wx

or

yarn add @authing/miniapp-wx
npm install --save @authing/miniapp-taro

or

yarn add @authing/miniapp-taro
npm install --save @authing/miniapp-uniapp

or

yarn add @authing/miniapp-uniapp

如果你是使用账号密码登录,且不想让密码以明文传输,可以按需使用以下两种加密方式之一实现密码加密

npm install --save @authing/miniapp-jsencrypt

or

yarn add @authing/miniapp-jsencrypt
npm install --save @authing/miniapp-sm2encrypt

or

yarn add @authing/miniapp-sm2encrypt

¶ 第四步:初始化 SDK

import { Authing } from '@authing/miniapp-wx'

// 以下两种密码加密方式可以按需使用,选其一即可

// rsa 加密
import { encryptFunction } from '@authing/miniapp-jsencrypt'

// sm2 加密
import { encryptFunction } from '@authing/miniapp-sm2encrypt'

const authing = new Authing({
  appId: 'AUTHING_APP_ID',

  // 公有云部署:Authing 控制台 -> 选择已创建的小程序应用 -> 应用配置 -> 认证配置 -> 认证地址
  // 私有化部署:填写你的私有服务地址
  host: 'https://my-authing-app.example.com',

  // 用户池 ID
  userPoolId: '62e221xxxxxxxxxxx7037a39',

  // 非必传,密码默认将以明文传输
  encryptFunction
})
import { Authing } from '@authing/miniapp-taro'

// 以下两种密码加密方式可以按需使用,选其一即可

// rsa 加密
import { encryptFunction } from '@authing/miniapp-jsencrypt'

// sm2 加密
import { encryptFunction } from '@authing/miniapp-sm2encrypt'

const authing = new Authing({
  appId: 'AUTHING_APP_ID',

  // 公有云部署:Authing 控制台 -> 选择已创建的小程序应用 -> 应用配置 -> -> 认证配置 -> 认证地址
  // 私有化部署:填写你的私有服务地址
  host: 'https://my-authing-app.example.com',

  // 用户池 ID
  userPoolId: '62e221xxxxxxxxxxx7037a39',

  // 非必传,密码默认将以明文传输
  encryptFunction
})
import { Authing } from '@authing/miniapp-uniapp'

// 以下两种密码加密方式可以按需使用,选其一即可

// rsa 加密
import { encryptFunction } from '@authing/miniapp-jsencrypt'

// sm2 加密
import { encryptFunction } from '@authing/miniapp-sm2encrypt'

const authing = new Authing({
  appId: 'AUTHING_APP_ID',

  // 公有云部署:Authing 控制台 -> 选择已创建的小程序应用 -> 应用配置 -> -> 认证配置 -> 认证地址
  // 私有化部署:填写你的私有服务地址
  host: 'https://my-authing-app.example.com',

  // 用户池 ID
  userPoolId: '62e221xxxxxxxxxxx7037a39',

  // 非必传,密码默认将以明文传输
  encryptFunction
})

userPoolId 可通过 控制台 -> 设置 -> 基础设置 获取。

userPoolId

¶ 第五步:使用 SDK

¶ 获取登录态

authing.getLoginState

¶ 入参

无

¶ 出参

Promise<SDKResponse<LoginState>>

¶ 示例代码

<!-- index.wxml -->
<button bindtap="getLoginState">Get Login State</button>
// index.js
Page({
  async getLoginState () {    
    const [error, loginState] = await authing.getLoginState()

    if (error) {
      // 用户未登录,或登录态已过期
    } else {
      // 用户已登录,且登录态未过期
      console.log(loginState)
    }
  }
})
export default class Index extends Component<PropsWithChildren> {
  render () {
    return (
      <View className='index'>
        <Button onClick={() => this.getLoginState()}>Get Login State</Button>
      </View>
    )
  }
  async getLoginState () {    
    const [error, loginState] = await authing.getLoginState()

    if (error) {
      // 用户未登录,或登录态已过期
    } else {
      // 用户已登录,且登录态未过期
      console.log(loginState)
    }
  }
}
export default {
  methods: {
    async getLoginState () {      
      const [error, loginState] = await authing.getLoginState()

      if (error) {
        // 用户未登录,或登录态已过期
      } else {
        // 用户已登录,且登录态未过期
        console.log(loginState)
      }
    }
  }
}

¶ 微信授权 code 登录

authing.loginByCode

¶ 入参

名称类型描述默认值必填
connectionString认证方式wechat_mini_program_code否
extIdpConnidentifierStringConsole 控制台中小程序身份源唯一标识-是
wechatMiniProgramCodePayloadWechatMiniProgramCodePayload社会化登录数据-是
optionsWxLoginOptions额外数据-否

WechatMiniProgramCodePayload

名称类型描述默认值必填
encryptedDataString包括敏感数据在内的完整用户信息的加密数据-是
ivString加密算法的初始向量-是

¶ 出参

Promise<SDKResponse<LoginState>>

¶ 说明

微信小程序相关接口说明请参考:

  • wx.getUserProfile (opens new window)

  • 小程序用户头像昵称获取规则调整公告 (opens new window)

微信小程序用户头像昵称获取规则生效后,你可以使用 authing.updateUserInfo 引导用户更新头像昵称。

¶ 示例代码

<!-- index.wxml -->
<button bindtap="loginByCode">Login By Code</button>
// index.js
Page({
  async loginByCode () {
    // 微信小程序限制:wx.getUserProfile 必须使用 button 触发
    // 为了防止用户频繁触发登录按钮
    // 建议使用 const [error, loginState] = await authing.getLoginState() 方法获取登录态
    // 如果 loginState 为 undefined,说明用户未登录,或登录态已过期,则显示登录按钮
    // 如果 loginState 不为 undefined,说明用户已登录,且登录态未过期,则无需再显示登录按钮
    const { encryptedData, iv } = await wx.getUserProfile({
      desc: 'getUserProfile'
    })

    // 由于微信小程序 wx.login() 获取 code 、 session_key 有效期及相关数据解密的机制
    // 偶然情况下 res 会是 undefined
    // 所以需要判断 res 是否为 undefined 再进一步处理剩余业务逻辑
    // 如果 res 是 undefined,则提示用户再点击一次按钮重新登录即可
    const [error, res] = await authing.loginByCode({
      // 你的小程序身份源唯一标识
      extIdpConnidentifier: 'AUTHING_EXT_IDP_CONN_IDENTIFIER',
      wechatMiniProgramCodePayload: {
        encryptedData,
        iv
      },
      options: {
        scope: 'openid profile offline_access'
      }
    })
  }
})
export default class Index extends Component<PropsWithChildren> {
  render () {
    return (
      <View className='index'>
        <Button onClick={() => this.loginByCode()}>Login By Code</Button>
      </View>
    )
  }
  async loginByCode () {    
    // 微信小程序限制:wx.getUserProfile 必须使用 button 触发
    // 为了防止用户频繁触发登录按钮
    // 建议使用 const [error, loginState] = await authing.getLoginState() 方法获取登录态
    // 如果 loginState 为 undefined,说明用户未登录,或登录态已过期,则显示登录按钮
    // 如果 loginState 不为 undefined,说明用户已登录,且登录态未过期,则无需再显示登录按钮
    const { encryptedData, iv } = await Taro.getUserProfile({
      desc: 'getUserProfile'
    })

    // 由于微信小程序 wx.login() 获取 code 、 session_key 有效期及相关数据解密的机制
    // 偶然情况下 res 会是 undefined
    // 所以需要判断 res 是否为 undefined 再进一步处理剩余业务逻辑
    // 如果 res 是 undefined,则提示用户再点击一次按钮重新登录即可
    const [error, res] = await authing.loginByCode({
      // 你的小程序身份源唯一标识
      extIdpConnidentifier: 'AUTHING_EXT_IDP_CONN_IDENTIFIER',
      wechatMiniProgramCodePayload: {
        encryptedData,
        iv
      },
      options: {
        scope: 'openid profile offline_access'
      }
    })
  }
}
export default {
  methods: {
    async loginByCode () {   
      // 微信小程序限制:wx.getUserProfile 必须使用 button 触发
      // 为了防止用户频繁触发登录按钮
      // 建议使用 const [error, loginState] = await authing.getLoginState() 方法获取登录态
      // 如果 loginState 为 undefined,说明用户未登录,或登录态已过期,则显示登录按钮
      // 如果 loginState 不为 undefined,说明用户已登录,且登录态未过期,则无需再显示登录按钮
      const [, { encryptedData, iv }] = await uni.getUserProfile({
        desc: 'getUserProfile'
      })

      // 由于微信小程序 wx.login() 获取 code 、 session_key 有效期及相关数据解密的机制
      // 偶然情况下 res 会是 undefined
      // 所以需要判断 res 是否为 undefined 再进一步处理剩余业务逻辑
      // 如果 res 是 undefined,则提示用户再点击一次按钮重新登录即可 
      const [error, res] = await authing.loginByCode({
        // 你的小程序身份源唯一标识
        extIdpConnidentifier: 'AUTHING_EXT_IDP_CONN_IDENTIFIER',
        wechatMiniProgramCodePayload: {
          encryptedData,
          iv
        },
        options: {
          scope: 'openid profile offline_access'
        }
      })
    }
  }
}

¶ 账号密码登录

authing.loginByPassword

入参

名称类型描述默认值必填
connectionString认证方式PASSWORD否
passwordPayloadPasswordPayload登录数据-是
optionsNormalLoginOptions额外数据-否

PasswordPayload

名称类型描述默认值必填
passwordString密码-是
usernameString用户名-否
emailString邮箱-否
phoneString手机号-否
accountString用户账号(用户名/手机号/邮箱)-否

¶ 出参

Promise<SDKResponse<LoginState>>

¶ 示例代码

<!-- index.wxml -->
<button bindtap="loginByPassword">Login By Password</button>
// index.js
Page({
  async loginByPassword () {
    const [error, res] = await authing.loginByPassword({
      passwordPayload: {
        // 你的用户密码
        password: 'USER_PASSWORD',
        // 你的用户名
        username: 'USER_NAME'
      },
      options: {
        // 如果使用 rsa,则需要安装 @authing/miniapp-jsencrypt 并在初始化 SDK 时传入 encryptFunction 
        // 如果使用 sm2,则需要安装 @authing/miniapp-sm2encrypt 并在初始化 SDK 时传入 encryptFunction 
        passwordEncryptType: 'sm2',
        scope: 'offline_access openid profile'
      }
    })
  }
})
export default class Index extends Component<PropsWithChildren> {
  render () {
    return (
      <View className='index'>
        <Button onClick={() => this.loginByPassword()}>Login By Password</Button>
      </View>
    )
  }
  async loginByPassword () {
    const [error, res] = await authing.loginByPassword({
      passwordPayload: {
        // 你的用户密码
        password: 'USER_PASSWORD',
        // 你的用户名
        username: 'USER_NAME'
      },
      options: {
        // 如果使用 rsa,则需要安装 @authing/miniapp-jsencrypt 并在初始化 SDK 时传入 encryptFunction 
        // 如果使用 sm2,则需要安装 @authing/miniapp-sm2encrypt 并在初始化 SDK 时传入 encryptFunction 
        passwordEncryptType: 'sm2',
        scope: 'offline_access openid profile'
      }
    })
  }
}
export default {
  methods: {
    async loginByPassword () {
      const [error, res] = await authing.loginByPassword({
        passwordPayload: {
          // 你的用户密码
          password: 'USER_PASSWORD',
          // 你的用户名
          username: 'USER_NAME'
        },
        options: {
          // 如果使用 rsa,则需要安装 @authing/miniapp-jsencrypt 并在初始化 SDK 时传入 encryptFunction 
          // 如果使用 sm2,则需要安装 @authing/miniapp-sm2encrypt 并在初始化 SDK 时传入 encryptFunction 
          passwordEncryptType: 'rsa',
          scope: 'offline_access openid profile'
        }
      })
    }
  }
}

¶ 发送短信验证码

authing.sendSms

¶ 入参

名称类型描述默认值必填
phoneNumberString手机号码是
phoneCountryCodeString默认 +86,手机区号,中国大陆手机号可不填+86否
channelSmsChannel短信验证码用途-是

¶ 出参

Promise<SDKResponse<SimpleResponseData>>

名称类型描述
messageString返回信息
statusCodeNumber状态码

¶ 示例代码

<!-- index.wxml -->
<button bindtap="sendSms">Send Sms</button>
// index.js
Page({
  async sendSms () {
    const [error, res] = await authing.sendSms({
      phoneNumber: '188xxxx8888',
      phoneCountryCode: '+86',
      // 指定 channel 为 CHANNEL_LOGIN,发送登录所用的验证码
      channel: 'CHANNEL_LOGIN'
    })
  }
})
export default class Index extends Component<PropsWithChildren> {
  render () {
    return (
      <View className='index'>
        <Button onClick={() => this.sendSms()}>Send Sms</Button>
      </View>
    )
  }
  
  async sendSms () {
    const [error, res] = await authing.sendSms({
      phoneNumber: '188xxxx8888',
      phoneCountryCode: '+86',
      // 指定 channel 为 CHANNEL_LOGIN,发送登录所用的验证码
      channel: 'CHANNEL_LOGIN'
    })
  }
}
<button @click="sendSms">Send Sms</button>
export default {
  methods: {
    async sendSms () {
      const [error, res] = await authing.sendSms({
        phoneNumber: '188xxxx8888',
        phoneCountryCode: '+86',
        // 指定 channel 为 CHANNEL_LOGIN,发送登录所用的验证码
        channel: 'CHANNEL_LOGIN'
      })
    },
  }
}

¶ 验证码登录

authing.loginByPassCode

入参

名称类型描述默认值必填
connectionString认证方式PASSCODE否
passCodePayloadPassCodePayload登录数据-是
optionsNormalLoginOptions额外数据-否

PassCodePayload

名称类型描述默认值必填
passCodeString短信/邮箱等验证码-是
emailString邮箱-否
phoneString手机号-否
phoneCountryCodeString默认 +86,手机区号,中国大陆手机号可不填-否

¶ 出参

Promise<SDKResponse<LoginState>>

¶ 示例代码

<!-- index.wxml -->
<button bindtap="loginByPassCode">Login By Pass Code</button>
// index.js
Page({
  async loginByPassCode () {
    const [error, res] = await authing.loginByPassCode({
      passCodePayload: {
        // 手机收到的短信验证码
        passCode: 'xxxx',
        phone: '188xxxx8888',
        phoneCountryCode: '+86'
      },
      options: {
        scope: 'openid profile offline_access'
      }
    })
  }
})
export default class Index extends Component<PropsWithChildren> {
  render () {
    return (
      <View className='index'>
        <Button onClick={() => this.loginByPassCode()}>Login By Pass Code</Button>
      </View>
    )
  }
  async loginByPassCode () {
    const [error, res] = await authing.loginByPassCode({
      passCodePayload: {
        // 手机收到的短信验证码
        passCode: 'xxxx',
        phone: '188xxxx8888',
        phoneCountryCode: '+86'
      }
    })
  }
}
export default {
  methods: {
    async loginByPassCode () {
      const [error, res] = await authing.loginByPassCode({
        passCodePayload: {
          // 手机收到的短信验证码
          passCode: 'xxxx',
          phone: '188xxxx8888',
          phoneCountryCode: '+86'
        }
      })
    }
  }
}

¶ 刷新 Token

authing.refreshToken

¶ 说明

刷新 Token 需要用到登录接口返回的 refresh_token 字段,使用登录相关方法时需传入参数 scope,并包含 offline_access,具体参考:WxLoginOptions 和 NormalLoginOptions。

请前往控制台进入当前小程序应用,找到 应用配置 -> 其他配置 -> 授权配置 -> 授权模式,勾选 refresh_token。

¶ 入参

无

¶ 出参

Promise<SDKResponse<LoginState>>

¶ 示例代码

<!-- index.wxml -->
<button bindtap="refreshToken">Refresh Token</button>
// index.js
Page({
  async refreshToken () {
    const [error, res] = await authing.refreshToken()
  }
})
export default class Index extends Component<PropsWithChildren> {
  render () {
    return (
      <View className='index'>
        <Button onClick={() => this.refreshToken()}>Refresh Token</Button>
      </View>
    )
  }
  
  async refreshToken () {
    const [error, res] = await authing.refreshToken()
  }
}
<button @click="refreshToken">Refresh Token</button>
export default {
  methods: {
    async refreshToken () {
      const [error, res] = await authing.refreshToken()
    }
  }
}

¶ 获取用户手机号

authing.getPhone

¶ 入参

名称类型描述默认值必填
extIdpConnidentifierStringConsole 控制台中小程序身份源唯一标识-是
codeStringbutton 的 open-type 为 getPhoneNumber 时获取到的 code-是

¶ 出参

Promise<SDKResponse<GetUserPhoneResponseData>>

¶ 示例代码

<!-- index.wxml -->
<button open-type="getPhoneNumber" bindgetphonenumber="getPhone">Get Phone</button>
// index.js
Page({
  /**
   * 需要在真机上测试,微信开发者工具不会返回 code
   * @param {*} e 
   */
  async getPhone (e) {
    const { code } = e.detail

    const [error, res] = await authing.getPhone({
      // 你的小程序身份源唯一标识
      extIdpConnidentifier: 'AUTHING_EXT_IDP_CONN_IDENTIFIER',
      code
    })
  }
})
export default class Index extends Component<PropsWithChildren> {
  render () {
    return (
      <View className='index'>
        <Button openType="getPhoneNumber" onGetPhoneNumber={(e) => this.getPhone(e)}>Get Phone</Button>
      </View>
    )
  }
  /**
   * 需要在真机上测试,微信开发者工具不会返回 code
   * @param {*} e 
   */
  async getPhone (e) {
    const { code } = e.detail

    const [error, res] = await authing.getPhone({
      // 你的小程序身份源唯一标识
      extIdpConnidentifier: 'AUTHING_EXT_IDP_CONN_IDENTIFIER',
      code
    })
  }
}
<button open-type="getPhoneNumber" @getphonenumber="getPhone">Get Phone</button>
export default {
  methods: {
    /**
    * 需要在真机上测试,微信开发者工具不会返回 code
    * @param {*} e 
    */
    async getPhone (e) {
      const { code } = e.detail

      const [error, res] = await authing.getPhone({
        // 你的小程序身份源唯一标识
        extIdpConnidentifier: 'AUTHING_EXT_IDP_CONN_IDENTIFIER',
        code
      })
    }
  }
}

¶ 修改密码

authing.updatePassword

¶ 入参

名称类型描述默认值必填
newPasswordString新密码-是
oldPasswordString旧密码-是
passwordEncryptTypenone / rsa / sm2加密方式none否

¶ 出参

Promise<SDKResponse<SimpleResponseData>>

¶ 示例代码

<!-- index.wxml -->
<button bindtap="updatePassword">Update Password</button>
// index.js
Page({
  async updatePassword () {
    const [error, res] = await authing.updatePassword({
      newPassword: 'USER_NEW_PASSWORD',
      oldPassword: 'USER_OLD_PASSWORD',
      // 如果使用 rsa,则需要安装 @authing/miniapp-jsencrypt 并在初始化 SDK 时传入 encryptFunction 
      // 如果使用 sm2,则需要安装 @authing/miniapp-sm2encrypt 并在初始化 SDK 时传入 encryptFunction
      passwordEncryptType: 'sm2'
    })
  },
})
export default class Index extends Component<PropsWithChildren> {
  render () {
    return (
      <View className='index'>
        <Button onClick={() => this.updatePassword()}>Update Password</Button>
      </View>
    )
  }
  
  async updatePassword () {
    const [error, res] = await authing.updatePassword({
      newPassword: 'USER_NEW_PASSWORD',
      oldPassword: 'USER_OLD_PASSWORD',
      // 如果使用 rsa,则需要安装 @authing/miniapp-jsencrypt 并在初始化 SDK 时传入 encryptFunction 
      // 如果使用 sm2,则需要安装 @authing/miniapp-sm2encrypt 并在初始化 SDK 时传入 encryptFunction
      passwordEncryptType: 'sm2'
    })
  }
}
<button @click="updatePassword">Update Password</button>
export default {
  methods: {
    async updatePassword () {
      const [error, res] = await authing.updatePassword({
        newPassword: 'USER_NEW_PASSWORD',
        oldPassword: 'USER_OLD_PASSWORD',
        // 如果使用 rsa,则需要安装 @authing/miniapp-jsencrypt 并在初始化 SDK 时传入 encryptFunction 
        // 如果使用 sm2,则需要安装 @authing/miniapp-sm2encrypt 并在初始化 SDK 时传入 encryptFunction
        passwordEncryptType: 'sm2'
      })
    },
  }
}

¶ 获取用户信息

authing.getUserInfo

¶ 入参

无

¶ 出参

Promise<SDKResponse<UserInfo>>

¶ 示例代码

<!-- index.wxml -->
<button bindtap="getUserInfo">Get User Info</button>
// index.js
Page({
  async getUserInfo () {
    const [error, res] = await authing.getUserInfo()
  }
})
export default class Index extends Component<PropsWithChildren> {
  render () {
    return (
      <View className='index'>
        <Button onClick={() => this.getUserInfo()}>Get User Info</Button>
      </View>
    )
  }
  
  async getUserInfo () {
    const [error, res] = await authing.getUserInfo()
  }
}
<button @click="getUserInfo">Get User Info</button>
export default {
  methods: {
    async getUserInfo () {
      const [error, res] = await authing.getUserInfo()
    }
  }
}

¶ 修改头像

authing.updateAvatar

¶ 入参

无

¶ 出参

Promise<SDKResponse<UploadFileResponseData>>

¶ 示例代码

<!-- index.wxml -->
<button bindtap="updateAvatar">Update Avatar</button>
// index.js
Page({
  async updateAvatar () {
    const [error, res] = await authing.updateAvatar()
  },
})
export default class Index extends Component<PropsWithChildren> {
  render () {
    return (
      <View className='index'>
        <Button onClick={() => this.updateAvatar()}>Update Avatar</Button>
      </View>
    )
  }
  
  async updateAvatar () {
    const [error, res] = await authing.updateAvatar()
  }
}
<button @click="updateAvatar">Update Avatar</button>
export default {
  methods: {
    async updateAvatar () {
      const [error, res] = await authing.updateAvatar()
    }
  }
}

¶ 修改用户信息

authing.updateUserInfo

¶ 入参

参考:UpdateUserInfo

¶ 出参

Promise<SDKResponse<UserInfo>>

¶ 示例代码

<!-- index.wxml -->
<button bindtap="updateUserInfo">Update User Info</button>
// index.js
Page({
  async updateUserInfo () {
    const [error, res] = await authing.updateUserInfo({
      address: 'YOUR_ADDRESS'
    })
  }
})
export default class Index extends Component<PropsWithChildren> {
  render () {
    return (
      <View className='index'>
        <Button onClick={() => this.updateUserInfo()}>Update User Info</Button>
      </View>
    )
  }
  
  async updateUserInfo () {
    const [error, res] = await authing.updateUserInfo({
      address: 'YOUR_ADDRESS'
    })
  }
}
<button @click="updateUserInfo">Update User Info</button>
export default {
  methods: {
    async updateUserInfo () {
      const [error, res] = await authing.updateUserInfo({
        address: 'YOUR_ADDRESS'
      })
    }
  }
}

¶ 退出登录

authing.logout

¶ 入参

无

¶ 出参

Promise<SDKResponse<boolean>>

¶ 示例代码

<!-- index.wxml -->
<button bindtap="logout">Logout</button>
// index.js
Page({
  async logout () {
    const [error, res] = await authing.logout()
  }
})
export default class Index extends Component<PropsWithChildren> {
  render () {
    return (
      <View className='index'>
        <Button onClick={() => this.logout()}>Logout</Button>
      </View>
    )
  }
  
  async logout () {
    const [error, res] = await authing.logout()
  }
}
<button @click="logout">Logout</button>
export default {
  methods: {
    async logout () {
      const [error, res] = await authing.logout()
    }
  }
}

¶ 错误处理

Authing 小程序 SDK 所有方法都会返回 Promise,且提供了完善的错误处理机制。

你可以使用数组解构的方式获取 SDK 返回结果:

  • 第一个参数 error 不为 null 时表示有错误产生,此时第二个参数是 undefined。

  • 第二个参数作为成功返回的数据,如果没有异常,error 会被设为 null,第二个成功的数据就会被返回。

代码示例如下:

const [error, userInfo] = await authing.getUserInfo()

if (error) {
  wx.showToast({
    title: error.message
  })
} else {
  console.log(userInfo)
}

¶ 示例代码

当前文档对应的完整示例代码请参考:examples (opens new window)。

¶ 附录公共参数列表

¶

SDKResponse

type SDKResponse<T> = SDKResponseSuccess<T> | SDKResponseError

type SDKResponseSuccess<T> = [null, T]

type SDKResponseError = [ErrorData, undefined]

interface ErrorData {
  message: unknown
  statusCode?: number
  apiCode?: number
}

¶

WxLoginOptions

用于 authing.loginByCode

名称类型描述默认值必传
scopeScope获取的资源类型,以空格分割-否
contextObject额外请求上下文,将会传递到认证前和认证后的 Pipeline (opens new window) 的 context 对象中。了解如何在 Pipeline 的 context 参数中获取传入的额外 context (opens new window)-否
tenantIdString租户 ID-否
customDataObject自定义数据-否

¶

NormalLoginOptions

用于 authing.loginByPassword 和 authing.loginByPassCode

名称类型描述默认值必传
passwordEncryptTypenone / rsa / sm2密码加密方式none否
scopeScope获取的资源类型,以空格分割-否
autoRegisterBoolean是否开启自动注册。如果设置为 true,当用户不存在的时候,会先自动为其创建一个账号。false否
clientIpString客户端真实 IP 地址。默认情况下,Authing 会将请求来源的 IP 识别为用户登录的 IP 地址,如果你在后端服务器中调用此接口,需要将此 IP 设置为用户的真实请求 IP。-否
contextString额外请求上下文,将会传递到认证前和认证后的 Pipeline 的 context 对象中。了解如何在 Pipeline 的 context 参数中获取传入的额外 context。-否
tenantIdString租户 ID-否
customDataObject自定义数据-否

¶

Scope

以下内容需使用空格分割使用,可根据自身需要按需添加,如:openid offline_access username

  • openid:必须包含
  • offline_access: 如果存在此参数,token 接口会返回 refresh_token 字段
  • profile:返回 birthdate, family_name, gender, given_name, locale, middle_name, name, nickname, picture,preferred_username, profile, update_at, website, zoneinfo
  • username: 返回 username
  • email:返回 email、email_verified
  • phone:返回 phone_number, phone_number_verified
  • roles: 返回用户的角色列表
  • external_id:用户在原有系统的用户 ID
  • extended_fields:返回用户的扩展字段信息,内容为一个对象,key 为扩展字段,value 为扩展字段值
  • tenant_id:返回用户的租户 id

¶

UpdateUserInfo

名称类型描述
nameString姓名
nicknameString昵称
usernameString用户名
photoString头像地址
externalIdString第三方外部 ID
birthdateString出生日期
countryString所在国家
provinceString所在省份
cityString所在城市
addressString所处地址
streetAddressString所处街道地址
postalCodeString邮政编码
genderGender性别
customDataObject自定义数据,传入的对象中的 key 必须先在用户池定义相关自定义字段

¶

Gender

名称描述
M男性
F女性
U未知

¶

UserInfo

名称类型描述
userIdString用户 ID
nameString姓名
nicknameString昵称
photoString头像
externalIdString在外部系统 ID
birthdateString生日
countryString国家
provinceString省份
cityString城市
addressString地址
streetAddressString街道地址
postalCodeString邮递地址
genderGender性别
usernameString用户名
customDataString自定义数据
createdAtString用户创建时间
emailString邮箱
emailVerifiedBoolean邮箱是否已验证
lastIpString最后一次登录的 IP 地址
lastLoginString上次登录时间
loginsCountNumber历史总登录次数
passwordLastSetAtString用户上次密码修改时间
phoneString手机号
phoneCountryCodeString手机号码所在地区编号
phoneVerifiedBoolean手机号已否已验证
resetPasswordOnNextLoginBoolean下次登录是否要求重置密码
companyString所在公司
regionString所在地区
statusSuspended / Resigned / Activated / Archived / Deactivated账户当前状态
browserString最近一次登录时使用的浏览器 UA
deviceString最近一次登录时使用的设备
givenNameString名
familyNameString姓
middleNameString中间名
profileString个人资料
preferredUsernameStringPreferred Username
websiteString用户个人网页
zoneinfoString用户时区信息
localeStringLocale
formattedString标准的完整地址
userSourceTypeexcel:通过 excel 导入 / register:用户自主注册 / adminCreated:管理员后台手动创建(包含使用管理 API 创建用户 ) / syncTask: 同步中心的同步任务来源类型
userSourceIdString应用 ID 或者同步任务 ID
lastLoginAppString用户上次登录的应用 ID
mainDepartmentIdString用户主部门 ID
lastMfaTimeString用户上次进行 MFA 认证的时间
passwordSecurityLevelNumber用户密码安全强度等级
departmentIdsString[]用户所属部门 ID 列表
identitiesIdentity[]外部身份源

¶

Identity

名称类型描述
identityIdString身份源 ID
extIdpIdString身份源连接 ID
providerProvider外部身份源类型
typeStringIdentity 类型,如 unionid, openid, primary
userIdInIdpString在外部身份源中的 ID
originConnIdsString[]身份来自的身份源连接 ID 列表

¶

Provider

名称描述
wechat微信
qqQQ
wechatwork企业微信
dingtalk钉钉
weibo微博
githubGithub
alipay支付宝
baidu百度
lark飞书
welinkWelink
yidun网易易盾
qingcloud青云
googleGoogle
gitlabGitlab
giteeGitee
twitterTwitter
facebookFacebook
slackSlack
linkedinLinkedin
instagramInstagram
oidcOIDC 型企业身份源
oauth2OAuth2 型企业身份源
samlSAML 型企业身份源
ldapLDAP 型企业身份源
adAD 型企业身份源
casCAS 型企业身份源
azure-adAzure AD 型企业身份源

¶

LoginState

名称类型描述
access_tokenStringaccess token
id_tokenStringid token
expires_inStringtoken 有效期
expires_atStringtoken 过期时间
scopeString参考 Scope
token_typeStringtoken 类型,默认:Bearer
refresh_tokenString用于更新 token

¶

SmsChannel

名称描述
CHANNEL_LOGIN登录
CHANNEL_REGISTER注册
CHANNEL_RESET_PASSWORD重置密码
CHANNEL_BIND_PHONE绑定手机号
CHANNEL_UNBIND_PHONE解绑手机号
CHANNEL_BIND_MFA绑定 MFA
CHANNEL_VERIFY_MFA校验 MFA
CHANNEL_UNBIND_MFA解绑 MFA
CHANNEL_COMPLETE_PHONE确认手机号码
CHANNEL_IDENTITY_VERIFICATION实名认证
CHANNEL_DELETE_ACCOUNT删除账号

¶

ErrorData

名称类型描述
messageString错误信息
statusCodeNumber状态码
apiCodeNumbercode

¶

SimpleResponseData

名称类型描述
messageString错误信息
statusCodeNumber状态码

¶

GetUserPhoneResponseData

名称类型描述
countryCodeString区号,默认为 86
phoneNumberString用户绑定的手机号(国外手机号会有区号)
purePhoneNumberString没有区号的手机号
watermarkWatermark微信返回的其他信息

Watermark

名称类型描述
appidStringapp id
timestampNumber时间戳

¶

UploadFileResponseData

名称类型描述
codeNumberwx.uploadFile 返回的 code
messageStringwx.uploadFile 返回的 message
dataData主体数据

Data

名称类型描述
keyStringwx.uploadFile 返回的 key
urlString文件地址
上一篇: Flutter SDK Changelog 下一篇: 微信网页授权
  • 说明
  • 第一步:创建应用
  • 第二步:创建社会化身份源
  • 第三步:安装 SDK
  • 第四步:初始化 SDK
  • 第五步:使用 SDK
  • 错误处理
  • 示例代码
  • 附录公共参数列表

用户身份管理

集成第三方登录
手机号闪验 (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号

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