定义前言
引入SDK头文件:
#import "APOpenAPI.h"
//支付宝
#define ZFB_APP_ID @"2017111509948730"
//继承用于回调
@interface AppController () <APOpenAPIDelegate>
@end
官方文档说明
重新函数
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// self.window = ... 应用初始化代码
// 注册应用会使用到应用的APPID
// 请参考前文获取APPID
if(![APOpenAPI registerApp:ZFB_APP_ID]) {
/*注册失败处理*/
}
return YES;
}
//A: iOS4.2 以下,现在开发的几乎都是支持iOS7+,所以这个函数可以不管
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
NSLog(@"handleOpenURL: %@", url);
//支付宝分享调用
if ([url.scheme isEqualToString:[NSString stringWithFormat:@"ap%@",ZFB_APP_ID]]) {
return [APOpenAPI handleOpenURL:url delegate:self];
//delegate如给参nil,则不会走 函数(void) onResp:(BaseResp*)resp
}
return YES;
}
//B: iOS9 以下
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
NSLog(@"openURL1: %@", url);
//支付宝分享调用
if ([url.scheme isEqualToString:[NSString stringWithFormat:@"ap%@",ZFB_APP_ID]]) {
return [APOpenAPI handleOpenURL:url delegate:self];
//delegate如给参nil,则不会走 函数(void) onResp:(BaseResp*)resp;若要给self,则需要此类继承APOpenAPIDelegate
//
}
return YES;
}
//C: iOS9+
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(nonnull NSDictionary<NSString *,id> *)options{
NSLog(@"openURL2: %@", url);
//支付宝分享调用
if ([url.scheme isEqualToString:[NSString stringWithFormat:@"ap%@",ZFB_APP_ID]]) {
return [APOpenAPI handleOpenURL:url delegate:self];
//delegate如给参nil,则不会走 函数(void) onResp:(BaseResp*)resp
}
return YES;
}
/*3个回调的功能基本一样,都是在别人通过URL Schemes打开应用的时候会执行的。不同之处:
A回调是在iOS2.0的时候推出的,参数只有url。
B回到是在iOS4.2的时候推出的,参数有url sourceApplication annotation.
C回调是iOS9.0的时候推出的,参数有url options。
这几个回调是有优先级的。C>B>A。也就是说,如果你3个回调都实现了,那么程序只会执行C回调。其他回调是不会执行的。(当然,iOS9以下只会执行B回调)*/
//接受和处理支付宝返回的响应消息
//当你的应用成功将分享请求消息发送给支付宝钱包后,用户将在钱包中完成分享操作,在用户完成操作后,支付宝将会把用户操作的结果消息返回给您的应用。你可以通过以下方法获取到消息:
- (void) onResp:(BaseResp*)resp{
//支付宝分享的返回
if([resp isKindOfClass:[APSendMessageToAPResp class]]) {
NSLog(@"APP SendMessageToAlipayResp");
APSendMessageToAPResp * tmpResp = (APSendMessageToAPResp *)resp;
NSString* res = [[NSString alloc] initWithFormat:@"%d&%@", tmpResp.errCode, tmpResp.errStr];
if(_authCodeScriptHandler) {
cocos2d::LuaBridge::pushLuaFunctionById(_authCodeScriptHandler);
cocos2d::LuaStack *stack = cocos2d::LuaBridge::getStack();
stack->pushString([res UTF8String]);
stack->executeFunction(1);
cocos2d::LuaBridge::releaseLuaFunctionById(_authCodeScriptHandler);
_authCodeScriptHandler = 0;
}
}
}
函数接口
//支付宝分享文本信息
+ (void)shareTextToZFB:(NSDictionary *)dict
{
NSString *text = [dict objectForKey:@"text"];
// lua回调函数
int scriptHandler = [[dict objectForKey:@"scriptHandler"] intValue];
if (_authCodeScriptHandler)
{
cocos2d::LuaBridge::releaseLuaFunctionById(_authCodeScriptHandler);
}
_authCodeScriptHandler = scriptHandler;
// 创建消息载体 APMediaMessage 对象
APMediaMessage *message = [[APMediaMessage alloc] init];
// 创建文本类型的消息对象
APShareTextObject *textObj = [[APShareTextObject alloc] init];
textObj.text = text;
// 回填 APMediaMessage 的消息对象
message.mediaObject = textObj;
// 创建发送请求对象
APSendMessageToAPReq *request = [[APSendMessageToAPReq alloc] init];
// 填充消息载体对象
request.message = message;
// 分享场景,0为分享到好友,1为分享到生活圈;支付宝9.9.5版本至当前版本,分享入口已合并,scene参数并没有被使用,用户会在跳转进支付宝后选择分享场景(好友、动态、圈子等),但为保证老版本上无问题,建议还是照常传入。
//request.scene = 0;
// 发送请求
BOOL result = [APOpenAPI sendReq:request];
if (!result) {
//失败处理
NSLog(@"shareTextToZFB发送失败");
}
}
//支付宝分享图片信息
+ (void)shareImageToZFB:(NSDictionary *)dict
{
NSString *filePath = [dict objectForKey:@"imgFilePath"];
NSLog(@"filePath:[%@]", filePath);
// lua回调函数
int scriptHandler = [[dict objectForKey:@"scriptHandler"] intValue];
if (_authCodeScriptHandler)
{
cocos2d::LuaBridge::releaseLuaFunctionById(_authCodeScriptHandler);
}
_authCodeScriptHandler = scriptHandler;
// 创建消息载体 APMediaMessage 对象
APMediaMessage *message = [[APMediaMessage alloc] init];
// 创建图片类型的消息对象
APShareImageObject *imgObj = [[APShareImageObject alloc] init];
//imgObj.imageUrl = @"此处填充图片的url链接地址";
//图片也可使用imageData字段分享本地UIImage类型图片,必须填充有效的image NSData类型数据,否则无法正常分享
//例如 imgObj.imageData = UIImagePNGRepresentation(Your UIImage Obj);
UIImage* image = [UIImage imageWithData:[NSData dataWithContentsOfFile:filePath]];
imgObj.imageData = UIImageJPEGRepresentation(image,0.5);// UIImagePNGRepresentation(image);
// 回填 APMediaMessage 的消息对象
message.mediaObject = imgObj;
// 创建发送请求对象
APSendMessageToAPReq *request = [[APSendMessageToAPReq alloc] init];
// 填充消息载体对象
request.message = message;
// 分享场景,0为分享到好友,1为分享到生活圈;支付宝9.9.5版本至当前版本,分享入口已合并,scene参数并没有被使用,用户会在跳转进支付宝后选择分享场景(好友、动态、圈子等),但为保证老版本上无问题,建议还是照常传入。
//request.scene = 0;
// 发送请求
BOOL result = [APOpenAPI sendReq:request];
if (!result) {
//失败处理
NSLog(@"shareImageToZFB发送失败");
}
}
//支付宝分享网页链接
+ (void)shareURLToZFB:(NSDictionary *)dict
{
NSString *url = [dict objectForKey:@"url"];
NSString *title = [dict objectForKey:@"title"];
NSString *description = [dict objectForKey:@"description"];
// lua回调函数
int scriptHandler = [[dict objectForKey:@"scriptHandler"] intValue];
if (_authCodeScriptHandler)
{
cocos2d::LuaBridge::releaseLuaFunctionById(_authCodeScriptHandler);
}
_authCodeScriptHandler = scriptHandler;
// 创建消息载体 APMediaMessage 对象
APMediaMessage *message = [[APMediaMessage alloc] init];
message.title = title;
message.desc = description;
// 此处填充缩略图data数据,例如 UIImagePNGRepresentation(UIImage对象)
// 此处必须填充有效的image NSData类型数据,否则无法正常分享
// UIImage *appIcon = [UIImage imageNamed:@"icon.png"];
// message.thumbUrl = @"https://tfsimg.alipay.com/images/openhome/TB1wH8IXl9m.eJkUuGVwu1RoFXa.png";
UIImage *appIcon = [UIImage imageNamed:@"icon.png"];
message.thumbData = UIImagePNGRepresentation(appIcon);
// 创建网页类型的消息对象
APShareWebObject *webObj = [[APShareWebObject alloc] init];
webObj.wepageUrl = url;
// 回填 APMediaMessage 的消息对象
message.mediaObject = webObj;
// 创建发送请求对象
APSendMessageToAPReq *request = [[APSendMessageToAPReq alloc] init];
// 填充消息载体对象
request.message = message;
// 分享场景,0为分享到好友,1为分享到生活圈;支付宝9.9.5版本至现在版本,分享入口已合并,这个scene并没有被使用,用户会在跳转进支付宝后选择分享场景(好友、动态、圈子等),但为保证老版本上无问题、建议还是照常传入
//request.scene = 0;
// 发送请求
BOOL result = [APOpenAPI sendReq:request];
if (!result) {
//失败处理
NSLog(@"shareURLToZFB发送失败");
}
}
/*! @brief 检查支付宝是否已被用户安装
*
* @return 支付宝已安装返回YES,未安装返回NO。
*/
+(BOOL) isAPAppInstalled
{
return [APOpenAPI isAPAppInstalled];
}
/*! @brief 判断当前支付宝的版本是否支持OpenApi
*
* @return 支持返回YES,不支持返回NO。
*/
+(BOOL) isAPAppSupportOpenApi
{
return [APOpenAPI isAPAppSupportOpenApi];
}
/*! @brief 判断当前支付宝的版本是否支持分享到生活圈
*
* @return 支持返回YES,不支持返回NO。
*/
+(BOOL) isAPAppSupportShareTimeLine
{
return [APOpenAPI isAPAppSupportShareTimeLine];
}
APOpenAPI.h
#import <Foundation/Foundation.h>
#import "APOpenAPIObject.h"
#pragma mark - APOpenAPIDelegate
/*! @brief 接收并处理来自支付宝终端程序的事件消息
*
* 接收并处理来自支付宝终端程序的事件消息,期间支付宝界面会切换到第三方应用程序。
* APOpenAPIDelegate 会在handleOpenURL:delegate:中使用并触发。
*/
@protocol APOpenAPIDelegate <NSObject>
@optional
/*! @brief 收到一个来自支付宝的请求,第三方应用程序处理完后调用sendResp向支付宝发送结果
*
* 收到一个来自支付宝的请求,异步处理完成后必须调用sendResp发送处理结果给支付宝。
* @param req 具体请求内容
*/
-(void) onReq:(APBaseReq*)req;
/*! @brief 发送一个sendReq后,收到支付宝的回应
*
* 收到一个来自支付宝的处理结果。调用一次sendReq后会收到onResp。
* @param resp具体的回应内容
*/
-(void) onResp:(APBaseResp*)resp;
@end
要继承此类
补充说明
部分目录
增加白名单
Info->LSApplicationQueriesSchemes下增加alipayshare和alipay这两项