iOS内购步骤总结

0:做内购需要添加系统框架storeKit.frameWork

1:登陆苹果开发者账号中去创建商品,即告诉苹果商场自己都卖哪些东西如图:

@interface ProductModel : NSObject

/**产品名称*/

@property (nonatomic, copy) NSString *name;

/**产品id*/

@property (nonatomic, copy) NSString *productID;

2:从服务器中取出商品,(封装:数据模型和请求模型)

@implementation AWDataTool

+(void)getProduct:(ResultBlock)resultBlock

{

ProductModel *model = [[ProductModel alloc] init];

model.name = @"大神跑鞋";

model.productID = @"dashenpaoxie";

resultBlock(@[model]);

}

3:将商品发送到苹果服务器,请求可以销售的商品;

//服务器中取出商品

[AWDataTool getProduct:^(NSArray<ProductModel *> *goods) {

//取出商品ID

NSArray *product = [goods valueForKey:@"productID"];

//将商品发送到苹果服务器,请求可以销售的商品

NSSet *set = [NSSet setWithArray:product];

SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:set];

//设置代理从代理中获取哪些商品可以销售

request.delegate = self;

[request start];

}];

#pragma mark - SKProductsRequestDelegate

/**

*  当请求到结果时会调用该方法

*

*  @param request  请求

*  @param response 响应

*/

-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response

{

self.productList = response.products;

}

-----------------------------------uitableViewController所有代码如下-----------------------------------------

//

//  ViewController.m

//  大神一期内购测试

//

//  Created by apple on 16/4/5.

//  Copyright © 2016年 apple. All rights reserved.

//

#import "ViewController.h"

#import <StoreKit/StoreKit.h>

#import "XMGDataTool.h"

#import "XMGProduct.h"

@interface ViewController () <SKProductsRequestDelegate>

/** 能销售的商品列表 */

@property (strong, nonatomic) NSArray <SKProduct *> *products;

@end

@implementation ViewController

- (void)setProducts:(NSArray<SKProduct *> *)products {

_products = products;

[self.tableView reloadData];

}

- (void)viewDidLoad {

[super viewDidLoad];

// 1.从服务器获取商品

[XMGDataTool getProducts:^(NSArray<XMGProduct *> *goods) {

// 取出商品标示

NSArray *identifiers = [goods valueForKeyPath:@"proId"];

// 将商品标示发送到苹果服务器,请求可以销售的商品

NSSet *set = [[NSSet alloc] initWithArray:identifiers];

// 请求对象

SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:set];

// 设置代理,从代理中获取哪些商品可以销售

request.delegate = self;

// 开始请求

[request start];

}];

}

#pragma mark - SKProductsRequestDelegate

/**

*  当请求到结果时会调用该方法

*

*  @param request  请求

*  @param response 响应

*/

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {

NSLog(@"%@",response.products);

self.products = response.products;

}

#pragma mark - 数据源

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

return self.products.count;

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *ID = @"cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

if (cell == nil) {

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];

}

// 1.取出模型

SKProduct *product = self.products[indexPath.row];

// 2.设置数据

cell.textLabel.text = product.localizedTitle;

cell.detailTextLabel.text = product.localizedDescription;

return cell;

}

**

*  当交易状态发生改变时会调用该方法

*

*  @param queue        交易队列

*  @param transactions 交易商品数组

*/

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions NS_AVAILABLE_IOS(3_0) {

//SKPaymentTransactionStatePurchasing, 正在支付

//SKPaymentTransactionStatePurchased,  支付成功

//SKPaymentTransactionStateFailed,     支付失败

//SKPaymentTransactionStateRestored,   恢复购买

//SKPaymentTransactionStateDeferred    延迟购买

[transactions enumerateObjectsUsingBlock:^(SKPaymentTransaction * _Nonnull transaction, NSUInteger idx, BOOL * _Nonnull stop) {

switch (transaction.transactionState) {

case SKPaymentTransactionStatePurchasing:

NSLog(@"正在支付");

break;

case SKPaymentTransactionStatePurchased:

// 当支付完成时,一定要将该订单,从支付队列中移除

[queue finishTransaction:transaction];

NSLog(@"支付成功");

break;

case SKPaymentTransactionStateFailed:

// 当支付失败时,一定要将该订单,从支付队列中移除

[queue finishTransaction:transaction];

NSLog(@"支付失败");

break;

case SKPaymentTransactionStateRestored:

NSLog(@"恢复购买");

// 当恢复时,一定要将该订单,从支付队列中移除

[queue finishTransaction:transaction];

break;

case SKPaymentTransactionStateDeferred:

NSLog(@"延迟购买");

break;

default:

break;

}

}];

}

#pragma mark - 数据源

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

return self.products.count;

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *ID = @"cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

if (cell == nil) {

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];

}

// 1.取出模型

SKProduct *product = self.products[indexPath.row];

// 2.设置数据

cell.textLabel.text = product.localizedTitle;

cell.detailTextLabel.text = product.localizedDescription;

return cell;

}

#pragma mark - 代理

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

// 1.取出选中的商品

SKProduct *product = self.products[indexPath.row];

// 2.根据商品开一个小票

SKPayment *payment = [SKPayment paymentWithProduct:product];

// 3.将小票添加到队列中

SKPaymentQueue *queue = [SKPaymentQueue defaultQueue];

[queue addPayment:payment];

// 4.监听交易状态

[queue addTransactionObserver:self];

}

@end

时间: 2024-12-26 02:14:20

iOS内购步骤总结的相关文章

IOS 内购

ios内购实现代码如下(): #import "ViewController.h" #import <StoreKit/StoreKit.h> @interface ViewController ()<SKProductsRequestDelegate,SKPaymentTransactionObserver> //记录产品列表 @property(nonatomic,strong)NSArray*allProducts; @end @implementatio

IOS内购支付server验证模式

IOS 内购支付两种模式: 内置模式 server模式 内置模式的流程: app从app store 获取产品信息 用户选择须要购买的产品 app发送支付请求到app store app store 处理支付请求.并返回transaction信息 app将购买的内容展示给用户 server模式的流程: app从server获取产品标识列表 app从app store 获取产品信息 用户选择须要购买的产品 app 发送 支付请求到app store app store 处理支付请求,返回trans

IOS内购支付服务器验证模式

IOS 内购支付两种模式: 内置模式 服务器模式 内置模式的流程: app从app store 获取产品信息 用户选择需要购买的产品 app发送支付请求到app store app store 处理支付请求,并返回transaction信息 app将购买的内容展示给用户 服务器模式的流程: app从服务器获取产品标识列表 app从app store 获取产品信息 用户选择需要购买的产品 app 发送 支付请求到app store app store 处理支付请求,返回transaction信息

iOS内购 服务端票据验证及漏单引发的思考.

因业务需要实现了APP内购处理,但在过程中出现了部分不可控的因素,导致部分用户反映有充值不成并漏单的情况. 仔细考虑了几个付费安全上的问题,凡是涉及到付费的问题都很敏感,任何一方出现损失都是不能接受的,所以在这里整理一些支付安全的要点分享一下. 支付方式 IAP是指In-App Purchase, 是一种付费方式,而并不是苹果专有的付费方式,在其它平台上也会有不同的实现,这里针对Apple IAP. 说到IAP安全问题,在苹果的IAP流程中有一个比较明显的逻辑漏洞,这个逻辑漏洞是建立在我们处理不

iOS 内购讲解

一.总说内购的内容 1.协议.税务和银行业务 信息填写 2.内购商品的添加 3.添加沙盒测试账号 4.内购代码的具体实现 5.内购的注意事项 二.协议.税务和银行业务 信息填写 2.1.协议.税务和银行业务 信息填写 的入口 2.2.选择申请合同类型 进入协议.税务和银行业务页面后,会有3种合同类型,如果你之前没有主动申请过去合同,那么一般你现在激活的合同只有iOS Free Application一种. 页面内容分为两块: Request Contracts(申请合同) Contracts I

IOS内购(IAP)的那些事

最近看了内购相关的东西,发现坑还真是不少,这里做个总结. IAP,即in-App Purchase,是一种智能移动终端应用程序付费的模式,在苹果(Apple)iOS.谷歌安卓(Google Android).微软WindowsPhone等智能移动终端操作系统中都有相应的实现. -- 百度百科 我们通过内购的流程,一步步地说坑到底在哪里 苹果内购的主要流程: 获取商品信息 --> 创建交易 --> 把交易添加到队列 --> 交易成功获取凭证 --> 拿着凭证做二次验证 -->

(转)iOS内购(iap)总结

刚刚做了内购, 记录一下 这里直接上代码, 至于写代码之前的一些设置工作参考以下文章: http://www.jianshu.com/p/690a7c68664e http://www.jianshu.com/p/86ac7d3b593a 需要注意的是: 只要工程配置了对应的证书, 就能请求商品信息, 不需要任何其他处理 沙盒测试填写的邮箱不能是已经绑定appleID的邮箱, 也不能是AppleID的救援邮箱, 其他的无所谓, 其实, 哪怕你填写的邮箱不存在也没有关系 // // IAPMana

IOS内购验证

客户端在沙箱环境下购买成功之后,需要进行二次验证 参考自:http://www.himigame.com/iphone-cocos2d/550.html 当应用向Apple服务器请求购买成功之后,Apple会返回数据给应用,如下所示: 产品标识符: product Identifier[在itunes store应用内定义的产品ID,例如com.公司名.产品名.道具名(com.xxxx.video.vip)] 交易状态: state Purchased 购买成功 Restored 恢复购买 Fa

iOS内购(IAP)中的那些坑

公司的公共库原来并没有这部分的代码,以前做内购是用两个比较有名的github上的第三方库.一个叫MKStoreKit,另一个叫IAPManager,我看了一下写的都很辣鸡,使用起来很不方便,而且写的还不对...... 于是我自己写了一个,一开始写的也不是很好,受了上面两个垃圾库的影响(这两个库接口是用postNotification的),使用时还要监听事件,下面的小弟吐槽说不太好用.于是我又重做了一个接口为block的版本,感觉写的还是不错的.这下用的就很舒服了! 虽然github上也有几个写的