全部产品

iOS 小程序接入账户通

更新时间:2020-06-11 17:00:52

账户通组件的作用是使支付宝内部小程序在客户 APP(即使用 mPaaS 框架开发的 App) 中运行时,可通过 scheme 协议跳转支付宝授权,获取支付宝登录态,进而正常使用各项功能。例如:1688 小程序在客户 APP 中通过账户通组件获取支付宝登录态,进而可以进行购买等业务操作。

在跳转时,会根据用户手机上安装支付宝 APP 与否出现以下处理流程:

  • 当使用客户 APP 的用户手机上同时也安装了支付宝 APP 时:
    1. 客户 APP 在需要支付宝登录态时会通过 scheme 协议跳转打开支付宝申请授权。
    2. 授权成功后,回到客户 APP 就可以正常使用了。
  • 如果没有安装支付宝,则需要注册或者在小程序中输入账号密码登录。

前置条件

您已按照小程序接入文档接入小程序框架,并且各项功能验证正常。

说明:目前账户通支持的是小程序中获取支付宝授权登录,插件接入账户通时不要选择接入快捷支付组件,账户通依赖中有快捷支付的解决冲突问题版本。

通用接入配置

添加 SDK

如果您已使用 mPaaS 插件集成过快捷支付 SDK,则需要在按如下步骤操作:

  1. 点击右侧的 取消 快捷支付 SDK。
  2. 点击 开始编辑
  3. 点击 小程序账户通 右侧的 添加,集成 SDK。

如果在添加小程序账户通前不取消快捷支付,则有可能出现符号冲突问题。

插件接入方式

使用 Xcode 插件添加账户通组件。

xcode plugin

小程序自身会提供众多的 JSAPI 和 OpenAPI 能力,因此在插件中选择小程序组件后,相应的依赖组件也会默认添加到工程中。

CocoaPods 接入方式

  1. 搭建 mPaaS CocoaPods 环境,参见 基于原生框架且使用 CocoaPods 接入
  2. 按照下方示例修改 podfile,引入账户通。
    1. # mPaaS Pods Begin
    2. plugin "cocoapods-mPaaS", :show_all_specs => true
    3. source "https://code.aliyun.com/mpaas-public/podspecs_test.git"
    4. #use_pod_for_mPaaS!
    5. mPaaS_baseline '10.1.60' # 请将 x.x.x 替换成真实基线版本
    6. # mPaaS Pods End
    7. platform :ios, '9.0'
    8. target 'MPTinyAppDemo_pod' do
    9. // 小程序
    10. mPaaS_pod "mPaaS_TinyApp"
    11. // 账户通
    12. mPaaS_pod "mPaaS_AliAccount"
    13. end

配置 scheme 协议跳转

  1. 配置 scheme 跳转白名单,添加 alipayalipays,以确保 App 可以跳转到支付宝。
    alipays
  2. 确定 App 的 URLTypes,如 mpaasinsidedemo
    URLTypes
  3. 配置 scheme 协议相关。
    • 配置 mPaaS 容器 scheme:
      container
      说明:下文中涉及到的所有 scheme 值都需要和此处一致。
    • scheme 系统回调配置:
      • 非框架托管接入方式,在使用的 AppDelegate 中的系统回调配置。
        AppDelegate
      • 框架托管接入方式,在 mPaaS 框架提供的回调中配置。
        host
  4. 账户通其他配置。
    • 提交工单 或联系售后,生成新的 ANX_ALIPAY_INSIDE_CONFIG,覆盖 InsideDataConfig.bundle 中的原有配置。
    • 使用 mPaaS 无线保镖图片生成工具 生成新的无线保镖图片并替换。注意 Type 选择 账户通,并且使用新无线保镖图片后,注意对账户通和网关相关功能(包括业务网关、发布、离线包等)进行回归测试。
  5. 需要账户通的小程序打开方式。

    • 当要打开的小程序需要账户通能力时,不要 使用原有小程序打开接口,而需要使用以下专门的账户通小程序打开接口:

      1. #import <NBInsideAccountAdaptor/NBIAuthService.h>
      2. #import <InsideAccountOpenAuth/ANXAccountOpenAuthModel.h>
      3. #import <InsideService/ANXInsideService.h>
      4. [NBIAuthService shareInstance].delegate = self;
      5. [[NBIAuthService shareInstance] startTinyApp:item[0] uId:nil params:nil];
    • 且需要实现 NBIAuthDelegate 这个 delegate:
      1. - (void)authModelForMode:(NBIAuthMode)mode extendParams:(NSDictionary *)extendParams callback:(NBIAuthCallback)callback {
      2. // NeedRefreshToken == YES;
      3. // 账户通来保障是串型的,如果一直是 NeedRefreshToken,那么就是要不断跳授权
      4. // TODO:此处跳转支付宝获取授权然后获取 accessToken 等以及从本地持久化获取 accessToken 均为样例参考,实际情况接入方自定义
      5. if (YES == [[extendParams objectForKey:@"NeedRefreshToken"] boolValue]) {
      6. [self getOnlineTokenWithMode:mode callback:callback];
      7. } else {
      8. NBIAuthModel *model = [self getLocalTokenModelWithMode:mode];
      9. if (nil == model) {
      10. [self getOnlineTokenWithMode:mode callback:callback];
      11. return;
      12. }
      13. if(mode == NBIAuthModePlatformOnly) {
      14. callback(model);
      15. }
      16. }
      17. }

获取数据 model

小程序需要支付宝登录态时,会回调到上文中的 delegate 函数,在这个函数中需要获取对应数据 model 并通过 callback 返回给小程序容器,容器会使用这个数据 model 获取支付宝登录态。

  • 数据 model 有三个部分:
    • uid(支付宝用户 ID)
    • accessToken(支付宝授权 Token)
    • mcUid(App 用户 ID)
  • 获取数据 model 的流程为:
    1. 回调中通过 AuthURL 跳转支付宝获取授权。
    2. 授权成功后获得 authCode。
    3. 将 authCode 传给接入方的接口获取 model,调用 delegate 中的回调将数据传给小程序容器进行获取支付宝登录态操作。
  • 通常 accessToken 存在一个有效期,为了避免每次打开小程序都跳转支付宝要求授权,常规做法为:首次获取支付宝授权并获取数据 model 后,将 model 缓存下来,当 model 没有过期时,将 model 返回给小程序容器即可。
  • 判断 model 有无过期的标志是 delegate 回调携带的参数 extendParams 中的 NeedRefreshToken 标识,NeedRefreshToken 表示 accessToken 等过期,需要重新跳转支付宝授权,这时就可以重新走获取数据 model 的流程。
    示例如下:

    1. - (void)getOnlineTokenWithMode:(NBIAuthMode)mode callback:(NBIAuthCallback)callback
    2. {
    3. ANXAccountOpenAuthModel *model = [[ANXAccountOpenAuthModel alloc] init];
    4. model.scheme = PortalScheme;
    5. model.thirdAuth = YES;
    6. // TODO: 接入方提供 AuthURL
    7. model.authURL = @"xxx";
    8. model.phoneNum = nil;
    9. [[ANXInsideService sharedService] startServiceWithModel:model completion:^(NSDictionary<ANXCallbackKey *,id> *result, NSError *error) {
    10. if ([result[ANXProductConfigResultCodeKey] isEqualToString:@"account_open_auth_9000"]) {
    11. //授权成功,可以拿到authcode、app_id
    12. NSString *authcode = result[ANXProductConfigResultKey][@"auth_code"];
    13. NSDictionary *userInfo = @{@"behaviorCode" : @"AccountOpenAuth",
    14. @"params1" : result[ANXProductConfigResultKey]
    15. };
    16. [[NSNotificationCenter defaultCenter] postNotificationName:@"ANX_Login_log" object:nil userInfo:userInfo];
    17. NBIAuthModel *model = [[NBIAuthModel alloc] init];
    18. model.uid = @"xxx";
    19. model.token = @"xxx";
    20. model.extraInfo = @{@"mcUid": @"xxx"};
    21. if(mode == NBIAuthModePlatformOnly) {
    22. callback(model);
    23. }
    24. }
    25. }];
    26. }
说明:AuthURL 与根据 authCode 获取 uid、accessToken、mcUid 的接口都是由接入方提供。

接入支付

小程序需要支付宝快捷支付能力时,需要配置 scheme 系统回调。

  • 对于非 mPaaS 框架托管模式,添加如下代码:
    1. #import <AlipaySDK/AlipaySDK.h>
    2. - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
    3. {
    4. if ([url.host containsString:@"safepay"])
    5. {
    6. [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:nil];
    7. }
    8. // TODO: 其他跳转逻辑
    9. return YES;
    10. }
  • 对于 mPaaS 框架托管模式,在框架类的 Category 中添加:
    1. #import <AlipaySDK/AlipaySDK.h>
    2. - (DTFrameworkCallbackResult)application:(UIApplication *)application openURL:(NSURL *)url newURL:(NSURL **)newURL sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
    3. {
    4. if ([url.host containsString:@"safepay"])
    5. {
    6. [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:nil];
    7. }
    8. // TODO: 其他跳转逻辑
    9. return YES;
    10. }
说明:上方两端代码中的 AlipaySDK 调用的 callback 需要为 nil,这样小程序中调用 tradePay jsapi 时使用的 AlipaySDK 在支付完成时才能拿到回调。

客户端退出登录或切换用户

接入方退出登录或者切换用户时,需要清除客户端支付宝登录态,否则会造成小程序仍使用前用户的支付宝登录信息。接入方需在退出登录或者切换用户处调用下面的方法,并且注意在使用账户通功能时,清除 authcode、accesstoken 等的持久化或缓存。

  1. // 当商户账号退出或切换账号时,都需要调用账号退出登录函数,告知账户通退出登录,然后再次进入账户通时重新授权和绑定
  2. ANXMCAccountStatusChangeModel *model = [ANXMCAccountStatusChangeModel new];
  3. model.status = MCAccountLogout; // 账号退出登录
  4. //model.status = MCAccountUnbind; // 账号解绑支付宝
  5. [[ANXInsideService sharedService] startServiceWithModel:model completion:nil];
  6. // TODO: 注意在使用账户通功能时,清除 authcode、accesstoken 等的持久化或缓存

支付配置

接入方对于支付配置有要求时,可通过 提交工单 获取活动标识和业务场景标识。获取标识后,在客户端 info.plist 中进行设置,设置参考如下:

  1. <key>MPAuthIdentity</key>
  2. <dict>
  3. <key>instBizSceneCode</key>
  4. <string>业务场景标识(替换为实际值)</string>
  5. <key>instCampaignIds</key>
  6. <string>活动标识(替换为实际值)</string>
  7. </dict>

注意事项

如果用户在进行支付宝授权的过程中,即从 App 跳转到支付宝请求授权时,若在支付宝页面不做任何操作又返回 App,这时过几分钟会出现授权超时失败。由于当前的授权机制为一直等待支付宝完成,所以此情况目前会一直存在。