极简版 SDK 调用方法
前提准备
调用 流程

客户端 Android 集成
下载 极简版 Demo 。
增加跳转配置
__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
方法,跳转到支付宝客户端,并通过 OpenAuthTask.Callback#onResult
方法获取业务结果。在调用 execute 方法时,通过参数 bizType
确定支付宝客户端内的业务类型,目前支持的业务有电子发票业务、账户授权业务。 /**
* 通用跳转授权业务 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。
// 请设置为一个不和其它应用冲突的值,并在 AndroidManifest.xml 中为 AlipayResultActivity 的 android:scheme 属性
// 指定相同的值。实际使用时请勿设置为 __alipaysdkdemo__ 。
// 如果不设置,OpenAuthTask.execute() 在用户未安装支付宝,使用网页完成业务流程后,将无法回跳至您的应用。
final String scheme = "__alipaysdkdemo__";
// 防止在支付宝客户端被强行退出等意外情况下,OpenAuthTask.Callback 一定时间内无法释放,导致
// Activity 泄漏
final WeakReference<Activity> ctxRef = new WeakReference<>(this);
// 唤起授权业务
final OpenAuthTask task = new OpenAuthTask(this);
task.execute(
scheme, // Intent Scheme
OpenAuthTask.BizType.AccountAuth, // 业务类型
bizParams, // 业务参数
new OpenAuthTask.Callback() {
@Override
public void onResult(int i, String s, Bundle bundle) {
final Context ref = ctxRef.get();
if (ref != null) {
showAlert(ref, String.format("结果码: %s\n结果信息: %s\n结果数据: %s", i, s, bundleToString(bundle)));
}
}
}, // 业务结果回调
true); // 是否需要在用户未安装支付宝客户端时,使用 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();
}
OpenAuthTask.OK = 9000 - 调用成功
OpenAuthTask.Duplex = 5000 - 3 s 内快速发起了多次支付 / 授权调用。稍后重试即可。
OpenAuthTask.NOT_INSTALLED = 4001 - 用户未安装支付宝客户端。
OpenAuthTask.SYS_ERR = 4000 - 其它错误,如参数传递错误。
客户端 iOS 集成
SDK集成
framework 导入以及导入头文件
1.
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
业务结果处理
-[AFServiceCenter handleResponseURL:withCompletion]
处理业务回跳的 URL 获得一个业务结果对象 AFServiceResponse,通过 responseCode 字段判断业务调用是否成功,result 相关字段可查看 [极简版授权请求参数和返回。](https://opendocs.alipay.com/open-v3/05w8m6?pathHash=477ce2a8#iOS 示例) /**
支付宝客户端服务调用结果状态码
- 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 ;
}