支付宝小程序授权登陆篇

用户授权

产品介绍 image

概述

所有支付宝开放平台的用户信息的读写均需要经过用户的许可才允许开发者使用,用户授权基于国际标准的 OAuth2.0 授权机制,基于此机制开发者可以获取支付宝用户信息、给用户发会员卡等。

术语解释

概念

说明

备注

scope

授权范围

一个 scope 表示开发者需要请求用户授权的权限范围,一个 scope 包含至少一个 openapi 接口或者 jsApi接口,一次授权可以组合多个 scope 做组合授权

auth_code

授权码

临时的用户授权凭证,获取后应及时换取下面提到的授权令牌

access_token/auth_token

授权令牌,或者叫访问令牌

长时效的授权凭证,用于调用 openapi.alipay.com 网关进行服务端授权接口调用。注意token需要注意权限范围和有效期

refresh_token

刷新令牌

用于在授权令牌过期后刷新重新获取新的授权令牌,刷新令牌也有有效期

关联产品

获取会员基础信息

scopes 列表

scopes

说明

包含的 openapi 接口

auth_base

静默授权,不会发起授权浮窗;在支付宝客户端获取 auth_code,传入服务端端调用 alipay.system.oauth.token 接口获取支付宝会员标识(user_id)

auth_user

主动授权,需要用户手动点击同意,用户同意后,用于 网站支付宝登录 和 获取用户信息(现已升级为“获取会员基础信息”,且新功能包不再使用 alipay.user.info.share 接口)功能。

alipay.user.info.share

auth_zhima

用户芝麻信息

zhima.credit.score.brief.get

准入条件

  • 该能力对企业支付宝账户和个人支付宝账户(含个体工商户)均开放;

  • 小程序开发者需充分尊重用户个人隐私,妥善使用用户授权。若发现信息存在超出约定范围使用或者不合理使用等情况,平台有权永久收回该小程序的接口权限。

计费模式

免费

快速示例

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

获取用户授权的演示效果请参考以下示例,实际返回的授权码以真机调试为准。

 axml.html

<view class="page">
  <view class="page-section">
    <view>请不要一进入小程序就弹框授权,建议先了解小程序的服务内容</view>
    <button type="primary" onTap="getAuthCode">
      获取授权码
    </button>
  </view>
</view>

index.js

Page({
  onLoad() {},
  data: {},
  getAuthCode: () => {
    my.getAuthCode({
      scopes: 'auth_user',
      success: ({ authCode }) => {
        my.alert({
          content: authCode,
        });
      },
    });
  },
});

接入指引

接入流程

以获取用户信息举例,整体的接入流程如下(若需要授权其它信息,只需要在调用 getAuthCode 的时候的 scopes 参数使用不同的 scope 即可)。

客户端获取 authcode

通过调用 my.getAuthCode 这个 jsapi 获取用户授权,在 success 回调中可以获取到 authcode,js 代码如下:

my.getAuthCode({
  scopes: 'auth_user', // 主动授权:auth_user,静默授权:auth_base。或者其它scope
  success: (res) => {
  
    if (res.authCode) {
      // 认证成功
      // 调用自己的服务端接口,让服务端进行后端的授权认证,并且利用session,需要解决跨域问题
      my.request({
        url: 'https://isv.com/auth', // 该url是您自己的服务地址,实现的功能是服务端拿到authcode去开放平台进行token验证
        data: {
          authcode: res.authCode,
        },
        success: () => {
          // 授权成功并且服务器端登录成功
        },
        fail: () => {
          // 根据自己的业务场景来进行错误处理
        },
      });
    }
  },
});

服务端获取 access_token

服务器端调用 alipay.system.oauth.token 接口换取授权访问令牌,开发者可通过获取到的 auth_code 换取access_token 和用户 ID。auth_code 作为换取 access_token 的票据,每次用户授权完成,回调地址中的 auth_code 将不一样,auth_cod 只能使用一次,一天未被使用自动过期。具体可参见文档alipay.system.oauth.token。 开放平台服务端SDK 的 java 调用示例如下:

AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","your private_key","json","GBK","alipay_public_key","RSA2");
AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
request.setGrantType("authorization_code");
request.setCode("4b203fe6c11548bcabd8da5bb087a83b");
request.setRefreshToken("201208134b203fe6c11548bcabd8da5bb087a83b");
AlipaySystemOauthTokenResponse response = alipayClient.execute(request);
if(response.isSuccess()){
System.out.println("调用成功");
} else {
System.out.println("调用失败");
}
  • 认证成功 把 uid&token 保存到 session 中,在 session 有效期内就不需要每次都走授权平台进行验证。

  • 认证失败 则返回失败原因,需要再重新走授权流程。

  • 注意 如果仅是为了授权或获取用户 ID,那么到此授权结束。

调用服务端业务接口

在获取到 access_token 后,即可以继续使用该 token 调用 openapi 的授权类接口(比如 alipay.user.info.sharealipay.marketing.card.open等),请注意 token 的权限范围和时效性。

深入授权机制

用户授权auth_code

  • 说明 auth_code 一次有效,auth_code 有效期为3分钟到24小时(开放平台规则会根据具体的业务场景动态调整auth_code 的有效期,但是不会低于3分钟,同时也不会超过24小时),超过有效期的 auth_code 即使未使用也将无法使用。 用户的每次授权动作都会生成一个新的 auth_code。

  • 建议 基于安全考虑,开发者在获取 auth_code(用户授权码)后应尽快调用 alipay.system.oauth.token 接口换取access_token(访问令牌)。

授权scope

  • 说明 scope 为公开的资源,其使用不需要签约,但是其包含的接口是否需要签约请看具体的功能包或者接口定义。 开发者可以在授权请求中包含一个或者多个用户授权范围,每个授权范围称为一个 scope,一个 scope 包含若干个开放平台接口,请求的多个 scope 通过英文逗号分隔。 授权的流程是通用的,在不同的业务场景需要授权的范围不同,需要根据具体产品接入文档中指定的 scope 替换本文中的scope参数。

  • scope 有效期: 这里的 scope 有效期和前面的 auth_code 有效期是两个概念。 scope的有效期会影响开发者最终获取到的access_token和refresh_token的有效期,不同scope的有效期请参考具体的产品文档。

  • 建议: 为了产品体验考虑请按需请求需要的 scope,过多的授权范围容易导致用户放弃授权。建议在做产品的登录场景中使用 auth_base 或者 auth_user 做用户引流,后续根据需要具体业务需要引导用户请求特定scope的用户授权。

access_token

  • 有效期: access_token 取决于授权时指定的 scope 的有效期,如果授权时指定多个 scope,最终的 access_token 的有效期取决于有效期最短的 scope。 access_token 截止时间=(授权时间点)+(授权后调用 alipay.system.oauth.token 返回的 expires_in)。

  • 令牌存储要求:

    • 确保 access_token 的安全保存;

    • 根据 appId + uid +单个 scope 为索引保存 access_token,否则会因为 appid 令牌混用和不同 scope 的令牌相互覆盖导致接口调用报错,若前后多次授权范围相同,仅保存授权截止时间最长的 access_token 即可。授权截止时间 = 授权时间点+ alipay.system.oauth.token 返回的 expires_in。

注意:用户可以取消授权,取消后 access_token 即使在有效期也无法使用。

refresh_token

  • 说明: 用auth_code 调用 alipay.system.oauth.token 接口获取 access_token 时会返回一个 refresh_token(刷新令牌),在 refresh_token 有效期内可以通过 refresh_token 同样调用 alipay.system.oauth.token 刷新一个新的 access_token。

  • 有效期:

    • refresh_token 取决于授权时指定的scope的有效期,如果授权时指定多个 scope,最终的 refresh_token 的有效期取决于有效期最短的 scope。

    • refresh_token 截止时间=(第一次获得该 refresh_token 的时间 + alipay.system.oauth.token 返回的 re_expires_in)。

  • 使用:

    • 使用 refresh_token 调用 alipay.system.oauth.token。

    • 刷新后可以得到一个新的 access_token,access_token 截止时间重新计算(对应可以看到 expires_in 不会变),原来的 accesss_token 会立即失效;同时会得到一个新的refresh_token,原来的 refresh_token 会失效,新 refresh_token 截止时间不会重新计算(对应可以看到 re_expires_in 会减少)。

注意:用户可以取消授权,取消后 refresh_token 即使在有效期也无法使用。

API 列表

接口名称

描述

my.getAuthCode

获取用户授权码

alipay.system.oauth.token

换取授权访问令牌

如果您在调用 API 时出现报错:

  • 欢迎前往 开放社区 提问、留言;

  • 在 公共错误码 中根据错误码的类型,查找相关错误码及解决方案;

  • 在 蚂蚁问答 问答页面直接输入您遇到的错误码;

  • 在 云排查 中排查遇到的问题;

  • 您还可以在 文档中心 直接搜索您要的答案。

 官方文档:传送门

猜你喜欢

转载自blog.csdn.net/qq_42363090/article/details/106639741
今日推荐