账户通组件的作用是使支付宝内部小程序在客户 App(即使用 mPaaS 框架开发的 App) 中运行时,可通过 scheme 协议跳转到支付宝授权页面,获取支付宝登录态,进而正常使用各项功能。例如:1688 小程序在客户 App 中通过账户通组件获取支付宝登录态,进而可以进行购买等业务操作。
在跳转时,会根据用户手机上安装支付宝 App 与否出现以下处理流程:
您已按照小程序接入文档接入小程序框架,并且各项功能验证正常。
如果您已使用 mPaaS 插件集成过快捷支付 SDK,则需要在按如下步骤操作:
如果在添加小程序账户通前不取消快捷支付,则有可能出现符号冲突问题。
使用 Xcode 插件添加账户通组件。
小程序自身会提供众多的 JSAPI 和 OpenAPI 能力,因此在插件中选择小程序组件后,相应的依赖组件也会默认添加到工程中。
# mPaaS Pods Begin
plugin "cocoapods-mPaaS", :show_all_specs => true
source "https://code.aliyun.com/mpaas-public/podspecs_test.git"
#use_pod_for_mPaaS!
mPaaS_baseline '10.1.60' # 请将 x.x.x 替换成真实基线版本
# mPaaS Pods End
platform :ios, '9.0'
target 'MPTinyAppDemo_pod' do
// 小程序
mPaaS_pod "mPaaS_TinyApp"
// 账户通
mPaaS_pod "mPaaS_AliAccount"
end
AppDelegate
中的系统回调配置。ANX_ALIPAY_INSIDE_CONFIG
,覆盖 InsideDataConfig.bundle
中的原有配置。需要账户通的小程序打开方式。
当要打开的小程序需要账户通能力时,不要 使用原有小程序打开接口,而需要使用以下专门的账户通小程序打开接口:
#import <NBInsideAccountAdaptor/NBIAuthService.h>
#import <InsideAccountOpenAuth/ANXAccountOpenAuthModel.h>
#import <InsideService/ANXInsideService.h>
[NBIAuthService shareInstance].delegate = self;
[[NBIAuthService shareInstance] startTinyApp:item[0] uId:nil params:nil];
NBIAuthDelegate
这个 delegate:
- (void)authModelForMode:(NBIAuthMode)mode extendParams:(NSDictionary *)extendParams callback:(NBIAuthCallback)callback {
// NeedRefreshToken == YES;
// 账户通来保障是串型的,如果一直是 NeedRefreshToken,那么就是要不断跳授权
// TODO:此处跳转支付宝获取授权然后获取 accessToken 等以及从本地持久化获取 accessToken 均为样例参考,实际情况接入方自定义
if (YES == [[extendParams objectForKey:@"NeedRefreshToken"] boolValue]) {
[self getOnlineTokenWithMode:mode callback:callback];
} else {
NBIAuthModel *model = [self getLocalTokenModelWithMode:mode];
if (nil == model) {
[self getOnlineTokenWithMode:mode callback:callback];
return;
}
if(mode == NBIAuthModePlatformOnly) {
callback(model);
}
}
}
小程序需要获取支付宝登录态时,会回调到上文中的 delegate 函数,在这个函数中需要获取对应数据 model 并通过 callback 返回给小程序容器,容器会使用这个数据 model 获取支付宝登录态。
uid
(支付宝用户 ID)accessToken
(支付宝授权 Token)mcUid
(App 用户 ID)AuthURL
跳转支付宝获取授权。判断 model 有无过期的标志是 delegate 回调携带的参数 extendParams
中的 NeedRefreshToken
标识,NeedRefreshToken
表示 accessToken 等过期,需要重新跳转支付宝授权,这时就可以重新走获取数据 model 的流程。
示例如下:
- (void)getOnlineTokenWithMode:(NBIAuthMode)mode callback:(NBIAuthCallback)callback
{
ANXAccountOpenAuthModel *model = [[ANXAccountOpenAuthModel alloc] init];
model.scheme = PortalScheme;
model.thirdAuth = YES;
// TODO: 接入方提供 AuthURL
model.authURL = @"xxx";
model.phoneNum = nil;
[[ANXInsideService sharedService] startServiceWithModel:model completion:^(NSDictionary<ANXCallbackKey *,id> *result, NSError *error) {
if ([result[ANXProductConfigResultCodeKey] isEqualToString:@"account_open_auth_9000"]) {
//授权成功,可以拿到authcode、app_id
NSString *authcode = result[ANXProductConfigResultKey][@"auth_code"];
NSDictionary *userInfo = @{@"behaviorCode" : @"AccountOpenAuth",
@"params1" : result[ANXProductConfigResultKey]
};
[[NSNotificationCenter defaultCenter] postNotificationName:@"ANX_Login_log" object:nil userInfo:userInfo];
NBIAuthModel *model = [[NBIAuthModel alloc] init];
model.uid = @"xxx";
model.token = @"xxx";
model.extraInfo = @{@"mcUid": @"xxx"};
if(mode == NBIAuthModePlatformOnly) {
callback(model);
}
}
}];
}
小程序需要支付宝快捷支付能力时,需要配置 scheme 系统回调。
#import <AlipaySDK/AlipaySDK.h>
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
if ([url.host containsString:@"safepay"])
{
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:nil];
}
// TODO: 其他跳转逻辑
return YES;
}
#import <AlipaySDK/AlipaySDK.h>
- (DTFrameworkCallbackResult)application:(UIApplication *)application openURL:(NSURL *)url newURL:(NSURL **)newURL sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
if ([url.host containsString:@"safepay"])
{
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:nil];
}
// TODO: 其他跳转逻辑
return YES;
}
nil
,这样小程序中调用 tradePay jsapi 时使用的 AlipaySDK 在支付完成时才能拿到回调。接入方退出登录或者切换用户时,需要清除客户端支付宝登录态,否则会造成小程序仍使用前用户的支付宝登录信息。接入方需在退出登录或者切换用户处调用下面的方法,并且注意在使用账户通功能时,清除 authcode、accesstoken 等的持久化或缓存。
// 当商户账号退出或切换账号时,都需要调用账号退出登录函数,告知账户通退出登录,然后再次进入账户通时重新授权和绑定
ANXMCAccountStatusChangeModel *model = [ANXMCAccountStatusChangeModel new];
model.status = MCAccountLogout; // 账号退出登录
//model.status = MCAccountUnbind; // 账号解绑支付宝
[[ANXInsideService sharedService] startServiceWithModel:model completion:nil];
// TODO: 注意在使用账户通功能时,清除 authcode、accesstoken 等的持久化或缓存
接入方对于支付配置有要求时,可通过 提交工单 获取活动标识和业务场景标识。获取标识后,在客户端 info.plist
中进行设置,设置参考如下:
<key>MPAuthIdentity</key>
<dict>
<key>instBizSceneCode</key>
<string>业务场景标识(替换为实际值)</string>
<key>instCampaignIds</key>
<string>活动标识(替换为实际值)</string>
</dict>
如果用户在进行支付宝授权的过程中,即从 App 跳转到支付宝请求授权时,若在支付宝页面不做任何操作又返回 App,这时过几分钟会出现授权超时失败。由于当前的授权机制为一直等待支付宝完成,所以此情况目前会一直存在。
在文档使用中是否遇到以下问题
更多建议
匿名提交