# Bison教你3分钟集成支付宝好友分享

语言：zh-CN
原文：[Bison教你3分钟集成支付宝好友分享](<https://allluckly.cn/%E6%94%AF%E4%BB%98%E5%AE%9D/ZFB>)
中文：[中文 HTML](<https://allluckly.cn/%E6%94%AF%E4%BB%98%E5%AE%9D/ZFB>)
English: [English HTML](<https://allluckly.cn/en/journal/2015-10-21-integrating-alipay-friend-sharing-in-three-minutes/>)
发布于: 2015-10-21T00:00:00+08:00
内容更新于: 2015-10-21T00:00:00+08:00
署名：[Bison](<https://allluckly.cn/about/>)

按应用注册、SDK 导入、URL Scheme 配置与回调处理介绍支付宝好友分享，区分文本、图片和网页消息的数据对象，并记录安装检测及鉴权失败的排查点。

原文署名 Bison，保留原发布时的内容。

**阅读前** 这是 2015–2017 年间的技术记录，本次整理未重新运行验证示例。原文采用 2015 年支付宝 SocialSDK，包含 iOS 9 Scheme 配置与支付宝钱包 9.0 的说明。

> "努力、努力、再努力，今天的付出，乃明天的收获" Bison

不知不觉的支付宝已经成为我们生活中不可或缺的一款`APP`,由最初的纯支付`APP`发展到现在集各种实用的小功能着实不容易，今天在此要给大家说说这改变导致关于我们程序员必须要做的事情，那就是迅速增加分享到支付宝好友的功能。 说到这，其实我也是无意间看到了微博客户端有分享到支付宝好友的功能，好奇来着，就弄着玩玩，像友盟、ShareSDK之类的第三方到目前为止貌似还没有增加这项分享的。 下面我带大家怎么完成这项简单的任务。恩，非常简单，看标题就知道了。。。😄 下面我们来说重点：

---

#### 准备工作

- 申请你的AppID。请到支付宝开放平台应用登记页面进行登记，登记并选择移动应用进行设置后，将获得AppID，可立即用于开发。但应用登记完成后还需要提交审核，只有审核通过的应用才能正式发布使用。
- 下载并解压接口压缩文件（文件名是SocialSDK.zip）。

#### 步骤1：启动IDE（如Xcode），把SocialSDK文件夹中以下文件拷贝到项目文件夹下，并导入到项目工程中。

历史配图暂不可用，[保留原图地址](<http://upload-images.jianshu.io/upload_images/671504-f1b1a1d5e9398e69.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240>)供查阅。

```css
APOpenAPI.h
APOpenAPIObject.h
libAPOpenSdk.a
```

#### 步骤2：在需要调用SocialSDK的文件中，增加头文件引用。

```css
#import "APOpenAPI.h"
```

#### 步骤3：工程配置

- 为Other Linker Flags 添加 ` -all_load  `
- 为URL Types 添加支付宝回调scheme 

  > **注意**
  > 
  >  
  > 
  > 1. identifier必须为 `alipayShare`
  > 2. URL Schemes 命名规则：`ap+AppID`
- iOS 9以后的系统需要添加支付宝的分享scheme 

  > **支付宝分享的URL Schemes 命名为：`alipayshare`**

#### 步骤4：注册应用并添加必要的URL Handler

如示例AppDelegate.m文件中，增加引用代码：

```css
#import "APOpenAPI.h"
```

在@implementation AppDelegate中增加如下代码：

```css
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    
    //  创建供Demo使用的根视图
    APRootViewController *rootViewController = [[APRootViewController alloc] initWithNibName:nil bundle:nil];
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
    self.window.rootViewController = navigationController;
    
    //  配置应用的AppId
    //      重要：必须先在支付宝开放平台申请您的AppId才能正常使用支付宝社交分享功能
    //      Demo中的AppId，使用xxxxxxxxxx代替
    [APOpenAPI registerApp:@"xxxxxxxxxx"];
    
    return YES;
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    //  处理支付宝通过URL启动App时传递的数据
    return [APOpenAPI handleOpenURL:url delegate:self];
}
```

#### 步骤5：分享数据到支付宝钱包

发送分享请求的过程主要分为两部分：

- 组装APMediaMessage对象
- 调用sendReq发送接口

不同类型的分享数据主要通过APMediaMessage内的mediaObject对象进行区分：

- APShareTextObject 纯文本数据
- APShareImageObject 图片数据
- APShareWebObject 网页数据

分享纯文本

```css
//  发送文本消息到支付宝
- (void)sendText
{
    //  创建消息载体 APMediaMessage 对象
    APMediaMessage *message = [[APMediaMessage alloc] init];
    
    //  创建文本类型的消息对象
    APShareTextObject *textObj = [[APShareTextObject alloc] init];
    textObj.text = @"此处填充发送到支付宝的纯文本信息";
    //  回填 APMediaMessage 的消息对象
    message.mediaObject = textObj;
    
    //  创建发送请求对象
    APSendMessageToAPReq *request = [[APSendMessageToAPReq alloc] init];
    //  填充消息载体对象
    request.message = message;
    //  发送请求
    [APOpenAPI sendReq:request];
}
```

分享纯图片（图片链接形式）

```css
//  发送图片消息到支付宝(图片链接形式)
- (void)sendPhotoByUrl
{
    //  创建消息载体 APMediaMessage 对象
    APMediaMessage *message = [[APMediaMessage alloc] init];
    
    //  创建图片类型的消息对象
    APShareImageObject *imgObj = [[APShareImageObject alloc] init];
    imgObj.imageUrl = @"此处填充图片的url链接地址";
    //  回填 APMediaMessage 的消息对象
    message.mediaObject = imgObj;
    
    //  创建发送请求对象
    APSendMessageToAPReq *request = [[APSendMessageToAPReq alloc] init];
    //  填充消息载体对象
    request.message = message;
    //  发送请求
    [APOpenAPI sendReq:request];
}
```

分享纯图片（图片数据形式）

```css
//  发送图片消息到支付宝(图片数据形式)
- (void)sendPhotoByData
{
    //  创建消息载体 APMediaMessage 对象
    APMediaMessage *message = [[APMediaMessage alloc] init];
    
    //  创建图片类型的消息对象
    APShareImageObject *imgObj = [[APShareImageObject alloc] init];
    //  此处填充图片data数据,例如 UIImagePNGRepresentation(UIImage对象)
    //  此处必须填充有效的image NSData类型数据，否则无法正常分享
    imgObj.imageData = nil;
    //  回填 APMediaMessage 的消息对象
    message.mediaObject = imgObj;
    
    //  创建发送请求对象
    APSendMessageToAPReq *request = [[APSendMessageToAPReq alloc] init];
    //  填充消息载体对象
    request.message = message;
    //  发送请求
    [APOpenAPI sendReq:request];
}
```

分享网页（缩略图链接形式）

```css
//  发送网页消息到支付宝(缩略图链接形式)
- (void)sendWebByUrl
{
    //  创建消息载体 APMediaMessage 对象
    APMediaMessage *message = [[APMediaMessage alloc] init];
    
    message.title = @"此处填充网页标题";
    message.desc = @"此处填充网页简要内容";
    message.thumbUrl = @"此处填充缩略图的url链接地址";
    
    //  创建网页类型的消息对象
    APShareWebObject *webObj = [[APShareWebObject alloc] init];
    webObj.wepageUrl = @"此处填充网页url链接地址";
    //  回填 APMediaMessage 的消息对象
    message.mediaObject = webObj;
    
    //  创建发送请求对象
    APSendMessageToAPReq *request = [[APSendMessageToAPReq alloc] init];
    //  填充消息载体对象
    request.message = message;
    //  发送请求
    [APOpenAPI sendReq:request];
}
```

分享网页（缩略图数据形式）

```css
//  发送网页消息到支付宝(缩略图链接形式)
- (void)sendWebByData
{
    //  创建消息载体 APMediaMessage 对象
    APMediaMessage *message = [[APMediaMessage alloc] init];
    
    message.title = @"此处填充网页标题";
    message.desc = @"此处填充网页简要内容";
    //  此处填充缩略图data数据,例如 UIImagePNGRepresentation(UIImage对象)
    //  此处必须填充有效的image NSData类型数据，否则无法正常分享
    message.thumbData = nil;
    
    //  创建网页类型的消息对象
    APShareWebObject *webObj = [[APShareWebObject alloc] init];
    webObj.wepageUrl = @"此处填充网页url链接地址";
    //  回填 APMediaMessage 的消息对象
    message.mediaObject = webObj;
    
    //  创建发送请求对象
    APSendMessageToAPReq *request = [[APSendMessageToAPReq alloc] init];
    //  填充消息载体对象
    request.message = message;
    //  发送请求
    [APOpenAPI sendReq:request];
}
```

> **注意** 分享纯图片、网页缩略图时，可以使用两种形式：图片url、图片data。 支付宝内`优先`使用图片data形式。

#### 步骤6： 响应自支付宝返回的分享处理结果

```css
/*
 *  收到一个来自支付宝的请求，第三方应用程序处理完后调用sendResp向支付宝发送结果
 *
 *  入参
 *      req : 支付宝向第三方发来的请求类
 */
- (void)onReq:(APBaseReq*)req
{}
/*
 *  第三方应用程序发送一个sendReq后，收到支付宝的响应结果
 *
 *  入参
 *      resp : 第三方应用收到的支付宝的响应结果类，目前支持的类型包括 APSendMessageToAPResp(分享消息)
 */
- (void)onResp:(APBaseResp*)resp
{
    //  Demo内主要是将响应结果通过alert的形式反馈出来，第三方应用可以根据 errCode 进行相应的处理。
    NSString *title = nil;
    NSString *message = nil;
    if (resp.errCode == APSuccess) {
        title = @"成功";
    } else {
        title = @"失败";
        message = [NSString stringWithFormat:@"%@(%d)", resp.errStr, resp.errCode];
    }
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:message delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil];
    [alert show];
}
```

---

### 1.4 判断当前设备是否支持分享

支付宝钱包从9.0版本开始支持分享，api中提供了接口来判断当前设备是否能够支持分享到支付宝钱包。

- \[1\]判断当前设备是否已经安装支付宝钱包

```css
/*! @brief 检查支付宝是否已被用户安装
 *
 * @return 支付宝已安装返回YES，未安装返回NO。
 */
+(BOOL) isAPAppInstalled;
```

- \[2\]判断当前设备是否支持分享到支付宝（已经安装支付宝&&支付宝版本支持分享）

```css
/*! @brief 判断当前支付宝的版本是否支持OpenApi
 *
 * @return 支持返回YES，不支持返回NO。
 */
+(BOOL) isAPAppSupportOpenApi;
```

- \[3\]获取支付宝钱包在AppStore的下载链接，未安装钱包时可使用该链接跳转安装

```css
/*! @brief 获取支付宝的itunes安装地址
 *
 * @return 支付宝的安装地址字符串。
 */
+(NSString *) getAPAppInstallUrl;
```

**至此，你已经能够使用支付宝分享SDK的所有内容了。 具体的处理逻辑请参考Demo内的示例代码。**

### PS:

#### 最后跟大家说下支付宝里面需要填的Bundle ID 必须和项目中的一样哦！

#### 否则会出现—-鉴权失败

[Demo下载](<https://github.com/AllLuckly/-iOS_Demo>)

### 技术交流群：511040024

好文推荐：[iOS9新特性之实现3D Touch就是So easy](<https://allluckly.cn/3d%20touch/3D-Touch>)

版权归©Bison所有 未经允许不得转载。

