用户信息授权

用户信息授权主要是为了获取支付宝用户ID(USER_ID)、授权令牌(access_token),便于开发者处理自身业务逻辑的时候使用,例如:获取支付宝用户信息、发会员卡、快捷登录等。授权支持多种场景,如:H5(需安装支付宝手机客户端)、PC、APP(可参考APP支付宝登录)。

PC授权页面示例:

H5授权页面示例:

若要实现用户信息授权功能,请按照下面的步骤实现即可。

一、应用设置

  1. 您需要先去支付宝开放平台(open.alipay.com),在开发者中心创建登记您的应用,此时您将获得应用唯一标识(APPID);
  2. 请在【功能信息】中点击【添加功能】,选择【获取会员信息】;
  3. 设置密钥(如下图);
  4. 设置授权回调地址(如下图),授权回调地址是用户授权结束后回跳的地址,用于接收用户授权的结果,如:授权、拿到auth_code,便于后续换取授权令牌(access_token)等;
  5. 提交审核,等待审核通过,该应用正式可以使用。

需要详细了解开放平台创建应用步骤请参考《开放平台应用创建指南》。

图1 设置密钥、授权回调地址
 

添加功能【获取会员信息】
 

添加功能【获取会员信息】

二、搭建和配置开发环境

1. 下载服务端SDK
为了帮助开发者调用开放接口,我们提供了开放平台服务端SDK,包含JAVA、PHP和.NET三个语言版本,封装了签名&验签、HTTP接口请求等基础功能。请先下载对应语言版本的SDK并引入您的开发工程。
各语言版本服务端SDK详细使用说明,请参考《服务端SDK说明》。
2. 接口调用配置
在SDK调用前需要进行初始化,以Java代码为示例如下:

AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);

关键参数说明:

配置参数 示例值解释 获取方式/示例值
URL 支付宝网关(固定) https://openapi.alipay.com/gateway.do
APPID APPID 即创建应用后生成 获取见上面应用设置
APP_PRIVATE_KEY 开发者私钥,由开发者自己生成 获取详见上面应用设置
FORMAT 参数返回格式,只支持json json(固定)
CHARSET 编码集,支持GBK/UTF-8 开发者根据实际工程编码配置
ALIPAY_PUBLIC_KEY 支付宝公钥,由支付宝生成 获取详见上面应用设置
SIGN_TYPE 商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2 RSA2

三、开发授权功能

授权完整流程如下:

需要开发的关键点是:获取auth_code、auth_code换取access_token与user_id、使用token完成其他业务处理,如token换取用户信息等。

第一步:URL拼接与scope详解

商户/开发者通过以下的 URL 拼接规则拼接用户授权的 URL 地址,该地址展示给用户,用户需在支付宝端点开 URL 地址,并点击授权,商户/开发者即可获得用户的授权。
url拼接规则:https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=APPID&scope=SCOPE&redirect_uri=ENCODED_URL

TIPS:沙箱拼接规则详见关于沙箱。

url参数说明

参数名 是否必须 长度 描述
app_id 16 开发者应用的app_id; 相同支付宝账号下,不同的app_id获取的token切忌混用。
scope 不定,取决于请求授权时scope个数 接口权限值,目前只支持auth_user(获取用户信息、网站支付宝登录)、auth_base(用户信息授权)、auth_ecard(商户会员卡)、auth_invoice_info(支付宝闪电开票)、auth_puc_charge(生活缴费)五个值;多个scope时用”,”分隔,如scope为”auth_user,auth_ecard”时,此时获取到的access_token,既可以用来获取用户信息,又可以给用户发送会员卡。
redirect_uri 100 授权回调地址,是经过URLENCODE转义 的url链接(url必须以http或者https开头); 在请求之前,开发者需要先到开发者中心对应应用内,配置授权回调地址。 redirect_uri与应用配置的授权回调地址域名部分必须一致。
state 100 商户自定义参数,用户授权后,重定向到redirect_uri时会原样回传给商户。 为防止CSRF攻击,建议开发者请求授权时传入state参数,该参数要做到既不可预测,又可以证明客户端和当前第三方网站的登录认证状态存在关联。

第二步:获取auth_code

当用户授权成功后,会跳转至开发者定义的回调页面,支付宝会在回调页面请求中加入参数,包括auth_code、app_id、scope等,支付宝请求开发者回调页面示例如下:

http或https打头的授权回调地址? app_id=2016032301002387 &scope=auth_user&auth_code=10e20498fe5d42f18427d893fc06WX59

关键返回参数说明:

参数名 是否必须 长度 描述
app_id 16 开发者应用的app_id;相同支付宝账号下,不同的app_id获取的token切忌混用。
scope 不定,取决于请求授权时scope个数 成功授权的接口权限值,目前只支持auth_user(获取用户信息、网站支付宝登录)、auth_base(用户信息授权)、auth_ecard(商户会员卡)、auth_invoice_info(支付宝闪电开票)、auth_puc_charge(生活缴费)五个值;多个scope时用“,”分隔,如scope为“auth_user,auth_ecard”时,此时获取到的access_token,既可以用来获取用户信息,又可以给用户发送会员卡
error_scope 不定,少于请求授权时scope个数 error_scope表示授权是失败的scope列表及对应的错误信息(错误列表之间用“
state 100 商户自定义参数,用户授权后,重定向到redirect_uri时会原样回传给商户。 为防止CSRF攻击,建议开发者请求授权时传入state参数,该参数要做到既不可预测,又可以证明客户端和当前第三方网站的登录认证状态存在关联。
auth_code 目前为32,后期会根据安全策略适当调整,请勿限制该字段长度。 临时授权码,一次性有效,同时若超过有效期未使用,则会失效。有效期目前至少为5分钟,最长为24小时。请获取auth_code后尽快通过调用alipay.system.oauth.token接口获取访问令牌

注意:其余返回字段无需关注。

第三步:auth_code换取access_token与user_id

通过接口 alipay.system.oauth.token 获取access_token及userId。
接口调用示例:

AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2");
AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
request.setCode("2e4248c2f50b4653bf18ecee3466UC18");
request.setGrantType("authorization_code");
try {AlipaySystemOauthTokenResponse oauthTokenResponse = alipayClient.execute(request);System.out.println(oauthTokenResponse.getAccessToken());System.out.println(oauthTokenResponse.getUserId());
} catch (AlipayApiException e) {//处理异常e.printStackTrace();
}

至此,用户信息授权流程已结束,如果只想拿到user_id(支付宝用户唯一标识符),则无需看下一步。

第四步:使用access_token完成其他业务处理

开放平台的部分接口中需要依赖access_token才能执行的,因此为了拿到这个数据,需要执行以上的两个步骤才能换取到。
另外,不同的scopes的值对应的是不同的access_token,不同的token可调用不同的接口,token的效用也因此不一样,所以这些token切忌混用,具体的接口调用场景可参考:

获取会员信息
网站支付宝登录
商户会员卡 
支付宝闪电开票
APP支付宝登录
生活缴费

授权接入注意事项【必读】

1、用户授权auth_code

说明:
auth_code一次有效,auth_code有效期为3分钟到24小时(开放平台规则会根据具体的业务场景动态调整auth_code的有效期,但是不会低于3分钟,同时也不会超过24小时),超过有效期的auth_code即使未使用也将无法使用。
用户的每次授权动作都会生成一个新的auth_code。
建议:
基于安全考虑,开发者在获取auth_code(用户授权码)后应尽快调用alipay.system.oauth.token接口换取access_token(访问令牌)。

2、授权scope

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

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

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

3、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即使在有效期也无法使用

4、刷新令牌

说明:
用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截止时间=(调用alipay.system.oauth.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即使在有效期也无法使用

授权登录安全建议

若你希望通过支付宝授权进行平台登录,同时为了让登录服务享受支付宝的安全能力,需要你在接入授权时做一些校验和处理,强烈建议做如下处理:

state防止CSRF

在 拼接授权链接做用户授权,在拼接链接中提供state参数(该参数的值需要和用户在开发者网站会话有绑定关系,同时保证一次性有效),在授权后支付宝回跳商户地址时会将该参数原样返回。在以下情况开发者应该拒绝服务:回跳链接中无state参数或者state的值与开发者平台session中记录的state参数不一致。state格式:不超过100长度的base64字符。

Referer校验

在浏览器的授权回跳地址的处理逻辑中做Http的Referer校验,目前蚂蚁金服授权产品的域名均在alipay.com下,建议将此配置做成可配置的。

授权回调地址建议

1、条件允许的情况下回跳地址强制要求https。推荐使用阿里云证书服务(阿里云提供免费的证书服务,只需要您有自己的域名即可使用);
2、开放平台授权地址配置时仅使用不带参数的地址,防止字符集问题导致的业务失败。需要的业务参数可以统一通过state参数传递;
3、尽量保证授权回调地址页面本身的安全性,包括但不限于页面所在服务器自身的安全性等。

H5网页使用支付宝授权登录获取用户信息详解相关推荐

  1. 微信小程序授权登录获取用户信息详解

    今天来说一下微信小程序的授权登录获取用户信息,首先我们看微信提供的小程序开发文档: https://blog.csdn.net/qq_41971087/article/details/82466647 ...

  2. Spring boot 项目(十三)——实现微信公众号授权登录获取用户信息

    引言 微信公众号开发中,必不可少的一环:公众号授权登录.获取微信用户信息 前期准备 内网渗透=>生成本地指定端口映射的外网域名 链接:内网渗透工具natapp使用详解 域名生成之后修改yml文件 ...

  3. Android之QQ授权登录获取用户信息

    有时候我们开发的app需要方便用户简单登录,可以让用户使用自己的qq.微信.微博登录到我们自己开发的app. 今天就在这里总结一下如何在自己的app中集成QQ授权登录获取用户信息的功能. 首先我们打开 ...

  4. 支付宝 APP登录 获取用户信息 PHP

    支付宝APP登录服务端流程如下: 1.换取授权访问令牌 2.查询用户信息 APP调用sdk组装授权登录请求(系统交互流程),成功后,支付宝会返回 auth_code,利用此 auth_code 请求 ...

  5. java实现微信公众号授权登录获取用户信息(一)

    参考文章:https://blog.csdn.net/Santiago_M/article/details/79109154 : https://www.cnblogs.com/jilu/p/6123 ...

  6. 微信登录——授权登录获取用户信息

    引言 实现微信扫码登录关键之处就是获取到微信用户信息,那么这就涉及到了微信授权,通过微信授权我们可以获取到用户信息:微信官方文档写的还是比较详细的,但是没有代码演示,这里我就用代码演示一下如何实现微信 ...

  7. 微信小程序授权登录获取用户信息并保存至缓存用于下次登录

    1.获取用户信息 wx.getUserProfile(Object object) 获取用户信息.页面产生点击事件(例如 button 上 bindtap 的回调中)后才可调用,每次请求都会弹出授权窗 ...

  8. 微信小程序授权登录——获取用户信息

    小程序登录 小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系. 登录流程时序 效果展示: 功能实现: 新建一个login页面 login.js: wx. ...

  9. 2.3 业务实现(微信获取用户信息详解)

    在业务实现部分,我们主要介绍微信服务号获取用户信息授权机制以及如何通过该机制进行编程实现用户信息获取. 在微信服务号开发中,常常需要对用户的信息进行获取,以便程序能够识别用户的标识,并有针对性的与用户 ...

最新文章

  1. docker-compose 安装方法
  2. SDUT 2133 数据结构实验之栈三:后缀式求值
  3. 在Amilal听杭盖乐队演唱
  4. ygo游戏王卡组_ACG大科普(7)游戏王
  5. Spring : 连接池-HikariCP
  6. (六)基于霍夫变换的直线和圆检测
  7. oracle 导入导出数据库、删除用户以及该用户所有的对象
  8. matlab直观数据处理,霍尔效应实验数据处理 [霍尔效应实验的MATLAB数据处理]
  9. 什么是DNS智能云解析,什么是NS,更换NS多久生效?
  10. spurious wakeup虚假唤醒
  11. 高管激励的有效手段----股权激励
  12. CodeForces 711C - Coloring Trees DP
  13. LSM存储引擎基本原理
  14. 数理逻辑与集合论复习脉络
  15. KVM虚拟机 装系统 命令行
  16. 茶学领域如何用的上计算机,计算机视觉图像理技术在茶学领域应用方法的研究.pdf...
  17. Simulink自动代码生成2——生成嵌入式代码(generating embedded code)
  18. 第十四章:Element-ui组件库
  19. c语言程序学生籍贯信息记录,C语言程序设计学生籍贯信息记录簿
  20. c++双人战争小游戏

热门文章

  1. Absolutt ingenting er mye mer skjerpende parajumpers ? v?re en ulydig prest
  2. 炫“库”行动-人大金仓有奖征文-KingbaseES V8R6 手工创建主备流复制集群案例
  3. 软文写作技巧,你的微信软文也能破100000+
  4. 同步六进制加法计数电路设计(D触发器)
  5. 2022第十四届环泰山T60线上大徒步活动线下启动仪式圆满结束
  6. 滤波器基础05——巴特沃斯、切比雪夫与贝塞尔滤波器
  7. dnf台服空白mysql文件夹_关于雨泪大神的架设教程遇到的各种问题的解决办法
  8. 计算机组装大赛主题,DIY装机大赛策划书
  9. 【CXY】JAVA基础 之 Map
  10. ipad分屏功能怎么开启_win10怎么开启投屏功能