iOS: 实现苹果的内购

一、介绍:

在个人开发的app上架到AppStore后,苹果官方允许我们将自己的app在appstore上进行付费使用,也就是所谓的内购。其中,支付方式规定的必须是苹果的支付方式:应用内支付。

二、流程:

1、后台设置

(1)配置Developer.apple.com,为应用建立一个不带通配符的App ID

(2)用该应用的App ID生成和安装相应的Provisioning Profile文件

2、配置iTunes Connect

(1)用该App ID创建一个新的应用;

(2)在该应用中,创建应用内付费项目,选择付费类型,通常可选的是可重复消费的(Consumenable)和永久有效的(Non-Consumenable)两种,然后设置好价格、Product ID、购买介绍和截图,这里的Product ID是必须记住的,后面开发的时候要用到;

(3)添加一个用于在sandbox付费的测试用户,注意苹果对测试用户的密码要求和正是账号一样,至少8位,并且包包含数字和大小写字母;

(4)填写相关的税务。银行和联系人

3、iOS端开发

(1)在工程中引入storeKit.framework和#import <storeKit/storeKit.h>;

(2)获取所有的付费Product ID列表。这个可以用常量存储到本地,也可以由自己的服务器返回;

(3)制作一个界面(如tableView),显示所有的应用内付费项目。这些应用内付费项目的价格和介绍信息可以是自己的服务器返回。但如果是不带服务器的单机游戏应用或者工具类应用,则可以通过向App Store查询所得;

(4)当用户点击一个IAP项目,我们需要先查询用户是否允许应用内付费,如果不允许则不进行接下来的步骤;

(5)先通过该IAP的ProductID向AppStore查询,获取SKPayment实例,然后通过SKPaymentQueue的addPayment方法发起一个购买的操作;

(6)在ViewdidLoad方法中,将购买页面设置成购买额observe;

(7)当用户购买的操作有结果时,就会触发调用回调函数,相应的进行处理;

(8)服务器验证凭证(可选项)。如果购买成功,我们需要将凭证发送到服务器上进行验证。考虑到网路异常情况,iOS端的发送凭证操作应该可以持久化,如果程序退出、崩溃或者网络异常,可以恢复重试。

4、服务端开发

(1)接收iOS端发过来的购买凭证;

(2)判断凭证是否已经存在,是否验证过,然后进行存储;

(3)将该凭证发送到苹果的服务器验证,并将结果返回给客户端;

(4)如果需要,修改用户相应的会员权限。

注意:考虑到网络异常的情况,服务器的验证应该是一个可恢复的队列,如果失败了,应该进行重试。

苹果AppStore线上的购买凭证验证地址:htpps://buy.itunes.apple.com/verifyreceipt

测试的验证地址:htpps://sandbox.itunes.apple.com/verifyreceipt

三、iOS基本代码如下:

//  ViewController.m
//
//  Created by 夏远全 on 16/11/20.
//  Copyright ? 2016年 广州市东德网络科技有限公司. All rights reserved.
//

#import "ViewController.h"
#import <StoreKit/StoreKit.h>

@interface ViewController ()<SKProductsRequestDelegate,SKPaymentTransactionObserver>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    //监听购买结果
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
}

-(void)dealloc{

    //移除购买监听
    [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}

//用户点击一个IAP项目时,首先查询用户是否允许应用内付费(tableViewCell点击时,传递内购商品ProductId,ProductID可以提前存储到本地,用到时直接获取即可)
-(void)validateIsCanBought{

    if ([SKPaymentQueue canMakePayments]) {
        [self getProductInfo:@[@"ProductIds"]];
    }else{
        NSLog(@"失败,用户禁止应用内付费购买");
    }
}

//通过该IAP的Product ID向App Store查询,获取SKPayment实例,接着通过SKPaymentQueue的addPayment方法发起一个购买的操作
//下面的ProductId应该是事先在itunesConnect中添加好的,已存在的付费项目,否则会查询失败
-(void)getProductInfo:(NSArray *)productIds{

    NSSet *set = [NSSet setWithArray:productIds];
    SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:set];
    request.delegate = self;
    [request start];
}

#pragma mark - SKProductsRequestDelegate
//查询的回调函数
-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{

    //获取到的所有内购商品
    NSArray *myProducts = response.products;

    //判断个数
    if (myProducts.count==0) {
        NSLog(@"无法获取产品信息,购买失败。");
        return;
    }

    //发起一个购买操作
    SKPayment *payment = [SKPayment paymentWithProduct:myProducts[0]];
    [[SKPaymentQueue defaultQueue] addPayment:payment];
}

#pragma mark - SKPaymentTransactionObserver
//当用户购买的操作有结果时,就会触发下面的回调函数,相应进行处理
-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions{

    for (SKPaymentTransaction *transaction in transactions) {

        switch (transaction.transactionState) {
            case SKPaymentTransactionStatePurchased:  //交易完成
                NSLog(@"transactionIdentifier = %@",transaction.transactionIdentifier);
                [self completeTransaction:transaction];
                break;
            case SKPaymentTransactionStateFailed:     //交易失败
                [self failedTransaction:transaction];
                break;
            case SKPaymentTransactionStateRestored:  //已经购买过该商品
                [self restoreTransaction:transaction];
                break;
            case SKPaymentTransactionStatePurchasing: //商品添加进列表
                NSLog(@"商品添加进列表");
                break;
            default:
                break;
        }
    }
}

//交易完成后的操作
-(void)completeTransaction:(SKPaymentTransaction *)transaction{

    NSString *productIdentifier = transaction.payment.productIdentifier;
    NSData *transactionReceiptData = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]];
    NSString *receipt = [transactionReceiptData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];

    if ([productIdentifier length]>0) {
        //向自己的服务器验证购买凭证
        NSLog(@"%@",receipt);
    }

    //移除transaction购买操作
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}

//交易失败后的操作
-(void)failedTransaction:(SKPaymentTransaction *)transaction{

    if (transaction.error.code != SKErrorPaymentCancelled) {
        NSLog(@"购买失败");
    }else{
        NSLog(@"用户取消交易");
    }
    //移除transaction购买操作
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}

//已经购买过该商品
-(void)restoreTransaction:(SKPaymentTransaction *)transaction{

    //对于已购买商品,处理恢复购买的逻辑
    //移除transaction购买操作
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}

@end

参考书籍:唐巧《iOS开发进阶》

时间: 2024-10-25 00:11:04

iOS: 实现苹果的内购的相关文章

iOS开发——高级技术&amp;内购服务

内购服务 大家都知道做iOS开发本身的收入有三种来源:出售应用.内购和广告.国内用户通常很少直接 购买应用,因此对于开发者而言(特别是个人开发者),内购和广告收入就成了主要的收入来源.内购营销模式,通常软件本身是不收费的,但是要获得某些特权就 必须购买一些道具,而内购的过程是由苹果官方统一来管理的,所以和Game Center一样,在开发内购程序之前要做一些准备工作(下面的准备工作主要是针对真机的,模拟器省略Provisioning Profile配置过程): 前四步和Game Center基本

iOS开发支付篇-内购(IAP)

     重点总结: 1.获取内购列表(从App内读取或从自己服务器读取) 2.App Store请求可用的内购列表 3.向用户展示内购列表 4.用户选择了内购列表,再发个购买请求,收到购买完成的回调(购买完成后会把钱打给申请内购的银行卡内) 5.购买流程结束后, 向服务器发起验证凭证以及支付结果的请求 6.自己的服务器将支付结果信息返回给前端并发放虚拟产品 7.服务端的工作比较简单,分4步: 7.1.接收ios端发过来的购买凭证. 7.2.判断凭证是否已经存在或验证过,然后存储该凭证. 7.3

iOS:苹果内购实践

iOS 苹果的内购 一.介绍 苹果规定,凡是虚拟的物品(例如:QQ音乐的乐币)进行交易时,都必须走苹果的内购通道,苹果要收取大约30%的抽成,所以不允许接入第三方的支付方式(微信.支付宝等),当然开发者可以设置后门,在审核时避开审核人员.这个是有风险的,一旦发现,app会被立即下架,还是老老实实接入内购吧. 二.注意 内购接入还是比较简单的,苹果提供了专门的框架<StoreKit/StoreKit.h>,只要按照它提供的api进行开发就行.然而,接入的过程还是有需要注意的地方,分别是:漏单处理

(转)Cocos 2d-X Lua 游戏添加苹果内购(一) 图文详解准备流程

事前准备 最近给游戏添加了苹果的内购,这一块的东西也是刚刚做完,总结一下,其实这里不管是游戏还是我们普通的App添加内购这一块的东西都是差不多的,多出来的部分就是我们Lua和OC的交互的部分,以前刚开始做它们交互的部分的时候,准备总结一下Lua和OC的交互的,就是它们相互的调用和传参,在这两篇文章中顺便就一起总结了.要准备内购的事情首先你要有一个开发者账号!当然是加入开发者的账号,不是一个Apple ID 登录Developer之后就OK的,这点相信做iOS的小伙伴都清楚,就不再累赘啦!下面我们

IOS,苹果内购和添加广告

内购——应用内购买 通过苹果应用程序商店有三种主要赚钱的方式: 直接收费(与国内大部分用户的消费习惯相悖) 广告(降低用户体验 应用程序名称带Lite可以添加广告) O2O -> Online推广 & Offline交易,闭环 不要砍功能,增加内容,而不是增加功能 内购:应用程序本身的增值产品,游戏装备,应用程序中增值功能同样可以内购 第三方支付:跟应用程序无关的 内购分成:三(苹果)七(开发商)开 提示: 要做好游戏 & 应用,一定要研究心理,要研究哲学 人人都是产品经理 内购的五

苹果内购流程详解

苹果内购主要分为两部分 itunnes 相关配置 一.在itunnes 上配置相关信息资料 首先需要配置一些前提条件,详细步骤如下 1.进入itunnes选择协议,税务银行业务 2.完善资料信息,主要有3项(联系人,银行信息,税务信息) 4.完善联系人信息,一般填申请开发者账号人员的信息,可以修改 5.完善银行信息 需要银行支付号(就是开户银行的一个标识),银行卡持有人名字 6.完善税务信息 7.以下默认选择no 8.确认界面,下图可能不太对,当时我是上下2个界面,第四项要上下一致才行 二.上面

iOS开发之--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook功能开发汇总

前言 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用系统应用.使用系统服务: 目录 系统应用 系统服务 2.1. 短信与邮件 2.2. 通讯录 2.3. 蓝牙 2.4. 社交 2.5. Game Center 2.6. 应用内购买 2.7. iCloud 2.8. Passbook 1. 系统应用 在开发某些应用时可能希望能够调用iOS系统内置的电话.短信.邮件.浏览

iOS开发系列——内购、GameCenter、iCloud、Passbook系统服务开发汇总

社交 Social 现在很多应用都内置“社交分享”功能,可以将看到的新闻.博客.广告等内容分享到微博.微信.QQ.空间等,其实从iOS6.0开始苹果官方就内置了Social.framework专门来实现社交分享功能,利用这个框架开发者只需要几句代码就可以实现内容分享.下面就以一个分享到新浪微博的功能为例来演示Social框架的应用,整个过程分为:创建内容编辑控制器,设置分享内容(文本内容.图片.超链接等),设置发送(或取消)后的回调事件,展示控制器. 程序代码: // // ViewContro

iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总

--系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用系统应用.使用系统服务: 调用系统应用 使用系统服务 短信与邮件 通讯录 蓝牙 社交 Game Center 应用内购买 iCloud Passbook 系统应用 在开发某些应用时可能希望能够调用iOS系统内置的电话.短信.邮件.浏览器应用,此时你可以直接使用UIApplication的OpenUR