codecamp

支付宝小程序API 用户授权

my.getAuthCode

调用接口获取授权码(authCode)。通过授权码可进而换取支付宝用户登录态信息、给用户发会员卡等,从而方便地获取支付宝用户身份标识,快速建立小程序内的用户体系。

相关问题请参见下文 用户授权 FAQ 。

注意:

  • 请勿在小程序的可重复触发的生命周期(例如 onShow)中调用 my.getAuthCode,授权弹窗的消失会触发小程序的 onShow 事件,若接入方未对是否已展现过授权做标识与逻辑判断,将引起重复触发授权。
  • 为了创造更良好的支付宝小程序用户体验,在小程序的首屏引导用户授权是不被允许的。需要在用户充分了解小程序的业务内容后再引导用户授权,建议将小程序授权环节放在业务流程中。
  • 小程序 不支持 使用拼接授权链接进行授权,建议使用 my.getAuthCode 实现用户授权、用户登录等。

扫码体验

my.getauthcode.jpeg

示例代码

// 示例一
my.getAuthCode({
  scopes: 'auth_user',
  success: (res) => {
    my.alert({
      content: res.authCode,
    });
  },
});


// 示例二
my.getAuthCode({
  scopes: ['auth_user'],
  success: (res) => {
    my.alert({
      content: res.authCode,
    });
  },
});

入参

Object 类型,属性如下:

属性 类型 必填 描述
scopes String/Array 授权类型,默认 auth_base。支持 auth_base(静默授权)/ auth_user(主动授权)/auth_zhima (获取用户芝麻信息)
success Function 调用成功的回调函数。
fail Function 调用失败的回调函数。
complete Function 调用结束的回调函数(调用成功、失败都会执行)。

scopes 说明

一个 scope 表示开发者需要请求用户授权的权限范围,一个 scope 包含至少一个 OpenAPI 接口或者 JSAPI 接口,一次授权可以组合多个 scope 做组合授权,用“,”分隔。

scopes 说明 包含的openapi接口
auth_base 静默授权。用户基础授权,仅用于静默获取用户支付宝uid。静默授权不弹框,直接获取用户信息。
auth_user 网站支付宝登录; alipay.user.info.share
auth_zhima 用户芝麻信息。 zhima.credit.score.brief.get

success 回调函数
名称 类型 描述
authCode String 授权码
authErrorScopes Key-Value 失败的授权类型,key 是授权失败的 scope,value 是对应的错误码
authSuccessScopes Array 成功的授权 scope

错误码

错误码 描述 解决方案
4 无权限调(N22104)。 确认小程序应用是否授权给了三方应用,三方应用是否添加了 JSAPI 基础包 功能包,可尝试添加 JSAPI 基础包 功能包后,重新授权、重新推送预览调试或者直接解除三方应用授权,重新推送预览调试。说明:小程序应用授权给三方应用后,小程序在真机上的运行使用的是三方应用的功能包,不再是使用小程序自身的功能包。若是小程序应用 JSAPI 基础包 功能包没有或者不全,建议删除小程序应用,重新创建一个新的小程序应用来调试。
10 Empty Data 为了创造更良好的支付宝小程序用户体验,在小程序的首屏引导用户授权是不被允许的。需要在用户充分了解小程序的业务内容后再引导用户授权,建议将小程序授权环节放在业务流程中。检查 scopes 入参是否正确(参数错误会先弹出“服务正忙,请稍后再试”)。建议在需要获取用户信息前,增加获取权限的用途和引导提示,引导用户接受小程序授权,增加用户体验。在 fail 做引导处理,重新调用 my.getAuthCode 授权。
11 用户取消授权 为了创造更良好的支付宝小程序用户体验,在小程序的首屏引导用户授权是不被允许的。需要在用户充分了解小程序的业务内容后再引导用户授权,建议将小程序授权环节放在业务流程中。建议在需要获取用户信息前,增加获取权限的用途和引导提示,引导用户接受小程序授权,增加用户体验。在 fail 做引导处理,重新调用 my.getAuthCode 授权。

用户授权 FAQ

小程序如何实现用户授权?

小程序 不支持 使用拼接授权链接进行授权,建议使用 my.getAuthCode 实现用户授权、用户登录等。

先调用my.getAuthCode,再调用my.getOpenUserInfo会出现两次授权窗口,是否有方法可以实现只出现一个授权弹框?

正常获取会员基础信息是需要弹窗两次进行授权确认的,一次是 my.getAuthCode 获取用户授权码的授权框, 一次是 my.getOpenUserInfo 中获取用户基础信息的授权框。

my.getAuthCode 使用静默授权方法(令 scopes 为 auth_base)即可实现只出现一个授权弹框。示例代码如下:

my.getAuthCode({
  scopes: ['auth_base'],
  success: (res) => {
    my.alert({
      content: res.authCode,
    });
  },
});

如何打印 my.getAuthCode 获取到的 authCode?

在 IDE 中使用 console.log,在 console 里打印即可。示例代码如下:

my.getAuthCode({
  scopes: 'auth_user',
  success: (res) => {
    console.log(res.authCode),
    my.alert({
      content: res.authCode, 
    });
  },
});

效果如下图所示:

用户授权FAQ IDE.png

为什么要使用用户授权 my.getAuthCode API?

开发者在支付宝开放平台上读写用户信息,均需经过用户许可。支付宝开放平台的用户授权基于国际标准的 OAuth2.0 授权机制。基于此机制,使用 my.getAuthCode API 得到用户授权后,方可进行获取用户信息、给用户发放会员卡等操作。

为什么不允许在小程序首屏使用用户授权 API?

为了创造更良好的支付宝小程序用户体验,在小程序的首屏引导用户授权是不被允许的。需要在用户充分了解小程序的业务内容后再引导用户授权,建议将小程序授权环节放在业务流程中。

用户的 user_id 可以通过用户授权 API 获取吗?

不可以,user_id 需要在服务器端调用 alipay.system.oauth.token 获取。

my.getAuthCode 可以在小程序 onload 的时候用吗?

可以,但是必须是静默授权。小程序审核禁止一进入就强制弹授权框。

my.getAuthCode 获取用户信息和手机号,为何报 isv.insufficient-isv-permissions?

报错描述:ISV 权限不足,建议在控制台检查对应功能是否已经添加。

报错原因:此报错的含义就是没有对应接口权限。

解决方案:

  1. 配置的账户是否有当前接口权限或代理的商户是否有当前接口权限

若没有请先完成签约,签约相关问题可咨询商服服务热线:95188-1咨询!

  1. 是否在对应 APPID 下面添加应用功能。

  1. 若是 ISV,检查授权令牌(app_auth_token)是否有对应的接口权限。

  1. 如在沙箱调试出现,请确认请求网关为沙箱 openapi 网关:https://openapi.alipaydev.com/gateway.do,并且请求的 app_id 为沙箱的 app_id。

  1. 检查此应用 ID 是否已经上线,目前必须上线的应用才可以在正式环境调用接口。

调用 my.getAuthCode 获取到的 authCode 值是否每个用户是唯一的呢?

调用 my.getAuthCode 获取到的 authCode 值是不一样的,但是在同一个支付宝账户登录的情况下,根据此值获取到的 user_id 是唯一的。

支付宝小程序API 小程序跳转
支付宝小程序API 小程序唤起支付
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

支付宝小程序开发文档

支付宝小程序 快速示例

支付宝小程序 小程序快速示例

支付宝小程序 框架

支付宝小程序 组件

支付宝小程序组件 基础组件

支付宝小程序组件 无障碍访问

支付宝小程序 扩展组件

支付宝小程序扩展组件 UI组件

支付宝小程序 API

支付宝小程序 开发工具

支付宝小程序 云服务

支付宝小程序 Serverless

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }