[ObjectC]分享到支付宝iOS接入

来源:互联网 发布:ubuntu自带gcc编译器 编辑:程序博客网 时间:2024/05/16 08:05

定义前言

引入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这两项