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

定义前言

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


猜你喜欢

转载自blog.csdn.net/ouyangshima/article/details/78628136