PAYATHON 2026

支付宝小程序授权登录获取用户ID是否需申请my.getAuthCode

支付老李

结论

如果业务只需识别当前支付宝用户,不需要昵称、头像或手机号,通常可以调用 my.getAuthCode 请求 auth_base 静默授权,再由服务端使用 authCode 换取用户标识。一般不需要申请“获取手机号”能力,也不必为了获取用户 ID 改用手机号接口。

这里需要区分两个概念:

  • my.getAuthCode 是获取授权码的入口。
  • 具体的授权范围可能需要额外申请。例如,auth_user 对应会员基础信息能力;如果只获取用户标识,通常使用 auth_base。

支付宝开放平台的权限规则可能会根据应用类型、所属行业和账号配置调整。如果使用 auth_base 仍提示无权限,应以小程序后台当前显示的能力要求和驳回原因为准。

推荐实现流程

建议按以下流程实现:

  1. 小程序调用 my.getAuthCode,授权范围设为 auth_base。
  2. 小程序将取得的 authCode 发送到业务服务器。
  3. 服务器调用支付宝开放平台接口 alipay.system.oauth.token。
  4. 服务器从响应中读取 user_id 或 open_id。
  5. 将该标识与业务账号绑定。
  6. 后续支付订单由服务端创建,小程序端只负责调起支付。

authCode 不是用户 ID,不能直接保存为用户标识。它的有效期通常较短,而且只能用于换取一次授权结果。

小程序端示例

my.getAuthCode({
  scopes: 'auth_base',
  success: (res) => {
    if (!res.authCode) {
      my.showToast({
        content: '未获取到授权码'
      });
      return;
    }

    my.request({
      url: 'https://example.com/api/alipay/login',
      method: 'POST',
      data: {
        authCode: res.authCode
      },
      success: (loginRes) => {
        console.log('登录结果:', loginRes.data);
      },
      fail: () => {
        my.showToast({
          content: '登录请求失败'
        });
      }
    });
  },
  fail: (err) => {
    console.error('获取 authCode 失败:', err);
    my.showToast({
      content: '支付宝授权失败'
    });
  }
});

在部分基础库或文档示例中,scopes 也可能写成数组:

scopes: ['auth_base']

实际使用时,应以目标基础库版本对应的接口定义为准。

服务端换取用户标识

服务端收到 authCode 后,调用以下接口:

alipay.system.oauth.token

核心请求参数如下:

grant_type=authorization_code
code=<小程序端取得的 authCode>

以 Java SDK 为例,核心逻辑可以这样写:

AlipayClient alipayClient = new DefaultAlipayClient(
    gatewayUrl,
    appId,
    merchantPrivateKey,
    "json",
    "UTF-8",
    alipayPublicKey,
    "RSA2"
);

AlipaySystemOauthTokenRequest request =
    new AlipaySystemOauthTokenRequest();

request.setGrantType("authorization_code");
request.setCode(authCode);

AlipaySystemOauthTokenResponse response =
    alipayClient.execute(request);

if (!response.isSuccess()) {
    throw new IllegalStateException(
        "支付宝授权码交换失败:" +
        response.getCode() + " " +
        response.getSubMsg()
    );
}

String userId = response.getUserId();

不同开放平台策略和 SDK 版本返回的用户标识字段可能不同。新接入的业务应同时检查响应中是否提供 open_id,并按照支付宝当前文档推荐的标识体系设计数据表。例如:

platform
app_id
alipay_open_id
alipay_user_id
business_user_id

不要仅根据字段名称认定 user_id 和 open_id 可以互相替代。

为什么不需要获取手机号

手机号属于另一类用户信息,主要用于手机号登录、会员注册和联系用户等场景。识别支付宝账号或完成小程序支付并不一定需要手机号。

如果业务只需要:

  • 判断是否为同一支付宝用户;
  • 将用户与业务订单关联;
  • 创建订单并调起支付宝支付;

使用 auth_base 获取用户标识更符合最小必要授权原则。审核人员建议使用手机号接口,可能是因为此前提交的权限申请场景被理解成了“注册或登录”,但这不代表获取用户标识必须依赖手机号。

如果仍然提示无权限

可以按顺序检查以下项目:

  1. scopes 是否误写为 auth_user。
    如果只需要用户标识,应使用 auth_base。

  2. 小程序端使用的 appId 是否与服务端一致。
    授权码必须通过同一应用的服务端配置进行交换。

  3. 服务端是否直接调用了 alipay.system.oauth.token。
    私钥、应用证书或密钥配置不能放在小程序端。

  4. 应用是否已完成必要的签约、审核和基础信息配置。
    不同主体和行业可能受到不同限制。

  5. 后台申请的是否其实是“会员基础信息”或手机号能力。
    如果只使用 auth_base,业务说明中不要加入头像、昵称或手机号相关内容。

  6. 查看接口返回的 code、sub_code 和 sub_msg。
    “调用失败”未必是权限问题,也可能由授权码过期、重复使用、应用不匹配或签名配置错误引起。

注意事项

  • 不要将 authCode 作为长期登录凭证或用户 ID。
  • 不要把支付宝私钥放入小程序代码。
  • 保存用户标识时应同时保存 appId,避免跨应用错误关联。
  • 不要默认不同小程序获得的用户标识相同。
  • 日志中不要完整记录授权码、访问令牌或其他敏感凭证。
  • 获取用户标识和开通支付能力是两套流程。即使授权成功,支付产品仍需根据应用的实际情况完成签约和配置。
  • 如果支付流程不要求业务方预先传入买家标识,也不必为了调起支付而额外收集手机号或用户资料。

备注:内容仅供参考。