极简版 SDK 调用方法

前提准备

若您的应用仅需要用户使用支付宝授权登录,而并不使用任何支付功能,您可以选择极简版 SDK 接入。

由于应用市场的规则限制(比如苹果应用市场禁止有支付功能的虚拟物品交易)以及支付宝的支付属性,目前商家集成 SDK 会出现受限的情况。极简版 SDK 包含支付宝快登能力,能解决部分商家接入受限的问题。

注意:
开发者如果使用极简版 SDK 开发,则在用户发起授权时需要唤起用户的支付宝 APP 才能完成授权。如果用户未安装支付宝 APP,默认会跳转到提示下载支付宝页面,开发者可以选择是否需要展示提示下载页面。具体请参考接口头文件。

极简版 SDK 的调用流程如下图所示:

APP支付宝登录.jpg

客户端 Android 集成

增加跳转配置

要使用通用跳转能力,需要在 AndroidManifest.xml 配置文件中增加以下配置(其中的 __alipaysdkdemo__ 需要替换成你的 App 特有的 Scheme):

<!-- 为了使用 "通用跳转 SDK" 的能力,需要在你的 App 的 AndroidManifest.xml 中添加这一项 -->
<!-- 并合理设置 android:scheme 的值 -->
<activity android:name="com.alipay.sdk.app.AlipayResultActivity" tools:node="merge">
    <intent-filter tools:node="replace">
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <data android:scheme="__alipaysdkdemo__"/>
    </intent-filter>
</activity>

接口 Demo

调用 OpenAuthTask#execute 方法,跳转到支付宝 App,并通过 OpenAuthTask.Callback#onResult 方法获取业务结果。
在调用 execute 方法时,通过参数 bizType 确定支付宝 App 内的业务类型,目前支持的业务有电子发票业务,账户授权业务。

/**
 * 通用跳转授权业务的回调方法。
 * 此方法在支付宝 SDK 中为弱引用,故你的 App 需要以成员变量等方式保持对 Callback 的强引用,
 * 以免对象被回收。
 * 以局部变量保持对 Callback 的引用是不可行的。
 */
final OpenAuthTask.Callback openAuthCallback = new OpenAuthTask.Callback() {
    @Override
    public void onResult(int resultCode, String memo, Bundle bundle) {
        if (resultCode == OpenAuthTask.OK) {
            showAlert(PayDemoActivity.this, String.format("业务成功,结果码: %s\n结果信息: %s\n结果数据: %s", resultCode, memo, bundleToString(bundle)));
        } else {
            showAlert(PayDemoActivity.this, String.format("业务失败,结果码: %s\n结果信息: %s\n结果数据: %s", resultCode, memo, bundleToString(bundle)));
        }
    }
};

/**
 * 通用跳转授权业务 Demo
 */
public void openAuthScheme(View view) {

    // 传递给支付宝应用的业务参数
    final Map<String, String> bizParams = new HashMap<>();
    bizParams.put("url", "https://authweb.alipay.com/auth?auth_type=PURE_OAUTH_SDK&app_id=2016051801417322&scope=auth_user&state=init");

    // 支付宝回跳到你的应用时使用的 Intent Scheme。请设置为不和其它应用冲突的值。
    // 请不要像 Demo 这样设置为 __alipaysdkdemo__!
    // 如果不设置,将无法使用 H5 中间页的方法(OpenAuthTask.execute() 的最后一个参数)回跳至
    // 你的应用。
    //
    // 注意!参见 AndroidManifest 中 <AlipayResultActivity> 的 android:scheme,此两处
    // 必须设置为相同的值。
    final String scheme = "__alipaysdkdemo__";

    // 唤起授权业务
    final OpenAuthTask task = new OpenAuthTask(this);
    task.execute(
            scheme, // Intent Scheme
            OpenAuthTask.BizType.AccountAuth, // 业务类型
            bizParams, // 业务参数
            openAuthCallback, // 业务结果回调。注意:此回调必须被你的应用保持强引用
            true); // 是否需要在用户未安装支付宝 App 时,使用 H5 中间页中转。建议设置为 true。
}

private static String bundleToString(Bundle bundle) {
    if (bundle == null) {
        return "null";
    }
    final StringBuilder sb = new StringBuilder();
    for (String key: bundle.keySet()) {
        sb.append(key).append("=>").append(bundle.get(key)).append("\n");
    }
    return sb.toString();
}

在 callback 中可能出现的错误码(返回码):

OpenAuthTask.OK = 9000              - 调用成功
OpenAuthTask.Duplex = 5000          - 3s 内快速发起了多次支付 / 授权调用。稍后重试即可。
OpenAuthTask.NOT_INSTALLED = 4001   - 用户未安装支付宝 App。
OpenAuthTask.SYS_ERR = 4000         - 其它错误,如参数传递错误。

注意:
详细调用参数信息及 URL 拼接规则可参考极简版授权参数说明

客户端 iOS 集成

极简版 SDK 用于为商户、ISV 提供统一接入钱包内已有业务的能力以及提供标准化的业务结果回传回跳的能力。

注意
支付宝APP在 10.1.10 及以后的版本会通过 schema 直接跳转到钱包对应业务。之前版本会先跳转到 landing 页,通过 landing 页面中转跳往支付宝APP。

SDK集成

framework 导入以及导入头文件

  1. 在 Build Phases 选项卡的 Link Binary With Libraries 中,增加以下依赖:AFServiceSDK
  2. 增加头文件引用:import <AFServiceSDK/AFServiceSDK.h>

具体业务调用

业务调用代码示例如下:

/**
 SDK支持的业务枚举值

 - AFServiceEInvoice: 电子发票
 - AFServiceAuth: 账户授权
 */
typedef NS_ENUM(NSUInteger, AFService) {
    AFServiceEInvoice,
    AFServiceAuth,
};


extern NSString * const kAFServiceOptionBizParams;      // 钱包服务调用入参
extern NSString * const kAFServiceOptionCallbackScheme; // 业务回跳当前app的scheme
extern NSString * const kAFServiceOptionNotUseLanding;  // 不使用钱包H5landing页做补偿,为true时需要商户自己处理用户未安装支付宝的情况

typedef void(^AFServiceResultBlock)(AFServiceResponse *response);

@interface AFServiceCenter : NSObject

/**
 调用钱包服务

 @param service 业务service, 见AFService枚举值
 @param params  参数Dictionary, key值详情参见kAFServiceOptionBizParams、kAFServiceOptionCallbackScheme注释
 @param block   业务结果回调的block, block参数是AFServiceResponse类型,业务结果通过result属性获取,如果未用户未安装支付宝并且kAFServiceOptionNotUseLanding未设置为true,会使用H5landing页做补偿,这种情况下不会有block回调结果。
 */
+ (void)callService:(AFService)service
         withParams:(NSDictionary *)params
      andCompletion:(AFServiceResultBlock)block;


/**
 处理钱包服务回跳APP的URL

 @param url 回跳URL
 @param block 业务结果回掉的block,详情见调用接口入参上的block。注意此接口上的block只有在跳转钱包后,当前APP被系统回收的情况下回跳才生效
 */
+ (void)handleResponseURL:(NSURL *)url
           withCompletion:(AFServiceResultBlock)block;

@end

注意:
详细调用参数信息及 URL 拼接规则可参考极简版授权参数说明

业务结果处理

通过调用 -[AFServiceCenter handleResponseURL:withCompletion] 处理业务回跳的URL获得一个业务结果对象AFServiceResponse,通过 responseCode 字段判断业务调用是否成功,通过 result 相关字段参考接口文档。

/**
 钱包服务调用结果状态吗

 - AFResSuccess: 默认值,业务调用成功,结果数据参见result字段
 - AFResInvalidService: service枚举值错误
 - AFResInvalidURL: 钱包回跳URL错误
 - AFResRepeatCall: 业务重复调用(3s内)
 - AFResOpenURLErr: 跳转失败
 */
typedef NS_ENUM(NSUInteger, AFResCode) {
    AFResSuccess = 0,
    AFResInvalidService = 100,
    AFResInvalidURL,
    AFResRepeatCall,
    AFResOpenURLErr,
};


@interface AFServiceResponse : NSObject


/**
 业务调用状态吗
 */
@property (nonatomic, assign) AFResCode responseCode;


/**
 业务结果Dictionary, 内容请参考具体业务方接入文档
 */
@property (nonatomic, strong) NSDictionary *result;

@end

接口 Demo

服务调用

- (void)demoAuth
{
    NSDictionary *params = @{kAFServiceOptionBizParams: @{
                                     @"url": @"https://authweb.alipay.com/auth?auth_type=PURE_OAUTH_SDK&app_id=2016051801417322&scope=auth_user&state=xxx"
                                     },
                             kAFServiceOptionCallbackScheme: @"apsdkdemo",
                             };
    
    [AFServiceCenter callService:AFServiceEInvoice withParams:params andCompletion:^(AFServiceResponse *response) {
        
        NSLog(@"%@", response.result);
    }];
}

回跳URL处理

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    if ([url.host isEqualToString:@"apmqpdispatch"]) {
        [AFServiceCenter handleResponseURL:url withCompletion:^(AFServiceResponse *response) {
            
			if (AFResSuccess == response.responseCode) {
				NSLog(@"%@", response.result);
			}
        }];
    }
    
    return YES;
}

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
    if ([url.host isEqualToString:@"apmqpdispatch"]) {
        [AFServiceCenter handleResponseURL:url withCompletion:^(AFServiceResponse *response) {
        	
			if (AFResSuccess == response.responseCode) {
				NSLog(@"%@", response.result);
			}
        }];
        
        return YES;
    }
    
    return YES;
}
onlineServer