全部产品

账户通接入服务端

更新时间:2020-04-28 16:55:41

账户通服务用于在非支付宝客户端上实现支付宝用户登录态获取并访问支付宝相关的服务,如授权、支付等。除了需要在客户端接入相关 SDK 之外,接入方还需要在服务端实现相关服务以完成支付宝三方授权流程。支付宝三方授权的流程如下:

procedure

服务端接入流程包含以下几步:

  1. 应用配置
  2. 生成授权链接
  3. 获取 access_token 和支付宝 user_id
  4. 同步账户绑定关系

应用配置

接入开始前,需要在支付宝开放平台上创建、配置并上线应用。详情参考 创建应用

创建说明:

  • 创建应用时选择 自定义接入,应用类型选择 移动应用
  • 添加应用功能,选择 获取会员信息
  • 所填写的授权回调地址必须与后续接入中使用的回调地址一致。

生成授权请求链接

为帮助开发者调用支付宝开放平台接口,我们提供开放平台服务端 SDK,用于封装签名验签、HTTP 请求等基础功能。您可前往 下载页面 下载选择所需语言的版本。在下文中会通过 JAVA 版本的 SDK 做接入用于举例说明。

授权请求链接构造分为两个步骤:

  1. 接口调用初始化
  2. 构造业务请求参数

接口调用初始化

代码如下:

  1. AlipayClient alipayClient = new DefaultAlipayClient(ALIPAY_GATEWAY_URL, APP_ID,
  2. APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);

参数说明:

配置参数 参数说明 参数值或获取方式
ALIPAY_GATEWAY_URL 支付宝网关,此为固定值。 固定值,填写内容为:https://openapi.alipay.com/gateway.do
APP_ID 创建应用时获得的 APPID。 参考 创建应用 > 查看 APPID
APP_PRIVATE_KEY 开发者私钥,由开发者自己生成。 参考 创建应用 > 配置应用环境
FORMAT 参数返回格式,只支持 json。 固定值,填写内容为:json
CHARSET 编码格式,支持 GBK/UTF-8。 开发者按需选择
ALIPAY_PUBLIC_KEY 支付宝公钥。 参考 生成公钥
SIGN_TYPE 开发者生成签名所使用的算法类型,支持 RSA 与 RSA2,推荐使用 RSA2。 RSA2

构造业务请求参数

参数名称 是否必须 参数说明
return_url 回调地址,必须与配置应用时设置的回调地址一致。
scopes 接口权限值,如:auth_userauth_base 等,请求格式为:"scopes":["auth_user","auth_base"]
state
  • 自定义参数,用户授权后,重定向到 redirect_uri 时会原样回传给开发者。
  • 为防止 CSRF 攻击,建议开发者请求授权时传入 state 参数,该参数要做到既不可预测,又可以证明客户端和当前第三方网站的登录认证状态存在关联。
  • 只允许 Base64 字符(长度小于等于 100)。
auth_type auth_type,用于标识授权类别。值为:MY_PASS_OAUTH
origin 调用来源,填写一个宿主标识,由我方分配
is_mobile true

代码示例

  1. AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", appId, appPrivateKey, "json", "UTF-8", alipayPublicKey, "RSA2");
  2. // 创建 API 对应的 request
  3. AlipayUserInfoAuthRequest alipayRequest = new AlipayUserInfoAuthRequest();
  4. // 设置授权回调地址,在开放平台后台配置
  5. alipayRequest.setReturnUrl("授权回调 url 地址");
  6. // 构造 scope 列表
  7. List<String> scopes = new ArrayList<String>();
  8. scopes.add("auth_base");
  9. scopes.add("auth_user");
  10. Map<String, Object> bizContent = new HashMap<String, Object>();
  11. bizContent.put("scopes", scopes);
  12. bizContent.put("auth_type", "MY_PASS_OAUTH"); // 固定值
  13. bizContent.put("origin", "XXXX"); // 调用来源,例如 AMAP、UC_BROSWER、NAPOS 等
  14. bizContent.put("is_mobile", "true"); // 固定值
  15. // 请求唯一随机标识,用于防 CSRF 攻击,只允许 Base64 字符(长度小于等于 100)
  16. bizContent.put("state", "xxxxxx");
  17. // 填充业务参数
  18. alipayRequest.setBizContent(JSONObject.toJSON(bizContent).toString());
  19. AlipayUserInfoAuthResponse response = alipayClient.pageExecute(alipayRequest, "GET");
  20. if (response.isSuccess()) {
  21. System.out.println("调用成功");
  22. System.out.println(response.getBody());
  23. } else {
  24. System.out.println("调用失败");
  25. System.out.println(response.getSubCode() + ":" + response.getSubMsg());
  26. }

生成的授权链接样例如下:
https://openapi.alipay.com/gateway.do?alipay_sdk=alipay-sdk-java-3.7.4.ALL&app_id=2019040163782051&biz_content=%7B%22auth_type%22%3A%22MY_PASS_OAUTH%22%2C%22scopes%22%3A%5B%22auth_user%22%5D%2C%22state%22%3A%2210%22%2C%22is_mobile%22%3A%22true%22%7D&charset=UTF-8&format=json&method=alipay.user.info.auth&return_url=http%3A%2F%2Fzhanghutong.yuguozhou.online%2Ffirst&sign=RHLcR%2BbfgW50JgNr5e6MTT08Bnnb3%2Fyt%2B0YIObm%2Fdpq2yJtYzHKgmS2ciVrgFEk6DUKtEmipoLb8xJ8ErFQAtSS7p8AvXGGY63D95N4lm6yasUVCg2kGoofeB9OPk7GBkLkud1CY3oCbK4HgbHHnHIc43GtXuKt0QLMPivZjKgqb5u1zt%2FKscdCt8JrLG4L5vOOFGKRuh3cFq%2BVL%2Bdvaufwbut6B%2B85GjOsnvONICif8r9cxpdzlsRFoSVmYu%2F7AUM34diatlQPvKs5NOeeAg2W8QkBbQYza0f84KYrNAAeX9ITbzvc7ntiL9606qEB1OWj%2Flccm%2B1TSKQjUUjjC6A%3D%3D&sign_type=RSA2&timestamp=2019-04-28+17%3A28%3A04&version=1.0

此授权链接可重复使用,客户端使用此授权链接向支付宝发起授权请求获取 auth_code。

获取 access_token 和支付宝 user_id

通过 alipay.system.oauth.token 接口获取 access_token 和支付宝 user_id

接口调用示例:

  1. AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2");
  2. AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
  3. request.setCode("2e4248c2f50b4653bf18ecee3466UC18");
  4. request.setGrantType("authorization_code");
  5. try {
  6. AlipaySystemOauthTokenResponse oauthTokenResponse = alipayClient.execute(request);
  7. System.out.println(oauthTokenResponse.getAccessToken());
  8. } catch (AlipayApiException e) {
  9. e.printStackTrace();
  10. }

同步账户绑定关系

获取 access_token 和支付宝 user_id 后,需要进一步调用账户绑定关系同步接口,把机构的用户唯一标识与支付宝 user_id 进行绑定。

接口定义

重要
  • 绑定关系未落成功会影响登录态的创建,从而导致用户无法访问业务。
  • 由于网络超时或其他原因,如果接口返回超时或者未知异常,接入方务必保障重试直到成功为止。
接口名称 alipay.user.antpaas.role.relation.save
接口描述 保存账户绑定关系,涵盖增、删、改操作
入参说明
  • userId:接入方站点用户 UserId。
  • userSource:接入方站点名,由我方分配
  • alipayUserId:需要绑定的支付宝用户 ID。
  • userOccupiedAutoDelete:填 true 或 false,若用户已被其它支付宝用户绑定,则自动删除已有关系,仅在 opType=enable 时有效。
  • alipayUserOccupiedAutoDelete:填 true 或 false,若支付宝用户已被其它接入方站点用户绑定,则自动删除已有关系,仅在 opType=enable 时有效。
  • opType:操作类型,可选 enable 或 delete,表示 存储删除
出参说明
  • code:结果码
  • msg:结果信息
错误码 INVALID_PARAMETER
SYSTEM_ERROR
USER_OCCUPIED
ALIPAY_USER_OCCUPIED

调用示例

  1. AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","your private_key","json","GBK","alipay_public_key","RSA2");
  2. AlipayUserAntpaasRoleRelationSaveRequest request = new AlipayUserAntpaasRoleRelationSaveRequest();
  3. request.setBizContent("{" +
  4. "\"user_id\":\"287346876344\"," +
  5. "\"user_source\":\"FINTECH_TEST\"," + "\"alipay_user_id\":\"2088131231323456\"," +
  6. "\"op_type\":\"enable\"," +
  7. "\"user_occupied_auto_delete\":true," + "\"alipay_user_occupied_auto_delete\":true" +
  8. " }");
  9. AlipayUserAntpaasRoleRelationSaveResponse response = alipayClient.execute(request);
  10. if (response.isSuccess()) {
  11. System.out.println("调用成功");
  12. } else {
  13. System.out.println("调用失败");
  14. }