2017苹果内购最新教程编程,苹果内购

1.登录开发者中心[开发者中心链接](

1.登录开发者中心[开发者中心链接](
Connect–>协议、税务和银行业务

转载

2.点击iTunes Connect–>协议、税务和银行业务

编程 13.进入之后我们首先需要申请iOS
Paid
Application合同,苹果要我们添加一个联系人信息。因为已经做过所以我的界面上并没有这样的提示。盗图一张:编程 24.同意协议之后进到这个界面:编程 35.这里我们要填写的有:联系人信息(Contact
Info)、银行信息(Bank
Info)、税务信息。编程 46.进入联系人信息,增加一个联系人信息。编程 57.填写银行信息:选择所在国家编程 6填写CNAPS
Code信息,如果你不清楚的情况下你可以点击Look up CNAPS
Code编程 7查询CNAPS
Code并填写编程 8确认银行卡信息编程 9填写银行帐号信息,next确认所有信息。编程 108.填写税务信息。税务信息有三个选项:美国税务、澳大利亚税务、加拿大税务。编程 11这里我们选择美国税务编程 12这里有两个问题询问你是否是美国居民?询问你有没有美国商业活动?然后填写你的税务信息,等待审核结果。9.银行、税收/协议我们就结束了,下边我们就进入到我们的app里去。编程 1310.选择功能,我们添加一个app内购项目。编程 1411.添加内购项目选择类型编程 15产品名称:是你商品的描述。比如10颗心。产品ID:是一个比较重要的标识,项目通过ID找到商品获取商品信息。价格:可以参考价格表。编程 16添加语言编程 17提交一个屏幕快照。添加好之后编程 1812.商品添加好之后我们做最后一步的准备工作--添加沙盒测试帐号。点击进入用户和职能界面编程 19选择沙盒技术测试员编程 20填写测试员信息(填写未被其他开发者使用的邮箱,感谢夜空守望者的纠正)编程 2112.这样我们完成了最后一步的准备工作,下边就是代码实现。为了你们的方便这里我写了一个demo,你们可以下载下来参考一下,当然其中的一些参数需要修改成你们自己的(app内购讲解结束,记得好评哈)。苹果内购demo地址

公司项目中有虚拟产品,所以要使用苹果内购.自此记录一下苹果内购的流程.前提是已有开发者账号

编程 1

协议,税务和银行业务

  • 协议,税务和银行业务

编程 23

协议,税务和银行业务

编程 24

申请合同

  • 这里提示地址太长,按照要求重新填写一下就可以

编程 25

添加联系人

  • 同意协议并提交

编程 26

  • 设置相关信息

编程 27

  • 联系人信息

添加相关联系人信息之后,注意在role(角色)中,为联系人选择身份(高级管理人员
,金融,技术,法律,营销),点击Done保存

编程 28

联系人

  • 银行信息
  1. 添加银行信息

编程 29

添加银行
2.选择国家

编程 30

选择国家
3.填写CNAPS

CNAPS 银行网点联行号.我们可以直接到银行客服电话查询 CNAPS,
快速便捷.还可以通过下图的Look up CNAPS Code 查询. 不过有的查询不到

编程 31

CNAPS

编程 32

Look up CNAPS Code

4.确认银行信息

编程 33

银行信息
5.填写公司银行账号信息

编程 34

公司银行信息

  • 税务信息

税务信息有三个选项:美国税务、澳大利亚税务、加拿大税务。我们在这里选择美国税务就可以

编程 35

税务信息

这里有两个问题:如下图.我选择的都是NO

编程 36

编程 37

3.进入之后我们首先需要申请iOS Paid
Application合同,苹果要我们添加一个联系人信息。因为已经做过所以我的界面上并没有这样的提示。盗图一张:

填写税务相关信息

9b.Foreign TIN
是填写公司税务识别码.公司营业执照上同意社会信用代码去掉前两位和最后一位就是公司税务识别码(15位)

编程 38

点击提交之后会让你确认信息,确认无误后再次点击提交(提交后无法修改)

编程 2

创建测试APP

新建APP在这里就不详细描述了

4.同意协议之后进到这个界面:

添加内购

  • 选择功能,我们添加一个app内购项目

编程 40

添加内购

  • 根据项目需求,选择内购项目

编程 41

消耗性项目

  • 填写内购项目的相关信息
  1. 商品名称根据你的消费道具的实际意义来说明
  2. 产品ID是比较重要的,只要唯一即可,在实际应用中,一定要认真填写。
  3. 选择价格

编程 42

  • 本地化版本

将在 App Store 上可见的 App 内购买项目名称。可以参考App
Store中其他应用的内购项目描述
描述不得少于10个字符.没有重新截图

编程 43

本地化

  • 审核信息

1.只会在审核中使用屏幕快照,不会将其显示在 App Store
上。屏幕快照必须具有适合您 App 平台的有效尺寸。
2.能够有助于我们进行审核的关于您的 App
内购买项目的其他信息,如测试帐户(包括用户名、密码等)。审核备注不得超过
4000 个字符。

编程 43

审核信息

  • 内购项目则添加完成

编程 3

申请沙盒测试账号(用来测试购买项目)

我们不必用真实的人民币测试购买内购项目

  • 首先我们回到iTunes Connect中,在这里我们选择用户和职能。
  • 添加沙箱技术测试员

编程 46

测试人员

  • 添加测试员详细信息

所有信息都可以随意填写,不用管是否真实。但是App Store地区必须对应
注意: 邮件地址不能填写与 Apple ID 关联的, 密码保护问题必须在 6 到 35
个字符之间。密码必须包含至少一个大写字母。

编程 47

信息

所有准备工作都已完成.打开项目开始撸代码

5.这里我们要填写的有:联系人信息(Contact Info)、银行信息(Bank
Info)、税务信息。

在项目中实现购买

首先在项目工程中加入storekit.framework,加入头文件#import <StoreKit/StoreKit.h>
遵守代理SKPaymentTransactionObserver,SKProductsRequestDelegate

//添加一个交易队列观察者
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];

//self.productIds是在开发者平台填写的产品id
self.productId = @"701";
if ([SKPaymentQueue canMakePayments]) {
[self requestProductData:self.productId];
}else{
DLog(@"不允许程序内付费");
}
  • 去苹果服务器请求产品信息

// 去苹果服务器请求产品信息
- (void)requestProductData:(NSString *)productId {


[SVProgressHUD show];

NSArray *productArr = [[NSArray alloc]initWithObjects:productId, nil];

NSSet *productSet = [NSSet setWithArray:productArr];

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

request.delegate = self;
[request start];

}
  • SKProductsRequestDelegate

// 收到产品返回信息
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {


NSArray *productArr = response.products;

if ([productArr count] == 0) {
[SVProgressHUD dismiss];
DLog(@"没有该商品");
return;
}

DLog(@"productId = %@",response.invalidProductIdentifiers);
DLog(@"产品付费数量 = %zd",productArr.count);

SKProduct *p = nil;

for (SKProduct *pro in productArr) {
DLog(@"description:%@",[pro description]);
DLog(@"localizedTitle:%@",[pro localizedTitle]);
DLog(@"localizedDescription:%@",[pro localizedDescription]);
DLog(@"price:%@",[pro price]);
DLog(@"productIdentifier:%@",[pro productIdentifier]);
if ([pro.productIdentifier isEqualToString:self.productId]) {
p = pro;
}
}

SKPayment *payment = [SKPayment paymentWithProduct:p];

//发送内购请求
[[SKPaymentQueue defaultQueue] addPayment:payment];

}
  • SKRequestDelegate

- (void)requestDidFinish:(SKRequest *)request {
[SVProgressHUD dismiss];
}
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error {
[SVProgressHUD showErrorWithStatus:@"支付失败"];
}
  • SKPaymentTransactionObserver监听购买结果

// 监听购买结果

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

for (SKPaymentTransaction *tran in transactions) {
switch (tran.transactionState) {
case SKPaymentTransactionStatePurchased: //交易完成
// 发送到苹果服务器验证凭证
[self verifyPurchaseWithPaymentTrasaction];
[[SKPaymentQueue defaultQueue]finishTransaction:tran];
break;
case SKPaymentTransactionStatePurchasing: //商品添加进列表

break;
case SKPaymentTransactionStateRestored: //购买过
// 发送到苹果服务器验证凭证

[[SKPaymentQueue defaultQueue]finishTransaction:tran];
break;
case SKPaymentTransactionStateFailed: //交易失败

[[SKPaymentQueue defaultQueue]finishTransaction:tran];
[SVProgressHUD showErrorWithStatus:@"购买失败"];
break;

default:
break;
}
}
}
  • 发送到苹果服务器验证凭证
    >

//沙盒测试环境验证
#define SANDBOX @"https://sandbox.itunes.apple.com/verifyReceipt"
//正式环境验证
#define AppStore @"https://buy.itunes.apple.com/verifyReceipt"
// 验证购买
- (void)verifyPurchaseWithPaymentTrasaction {

// 验证凭据,获取到苹果返回的交易凭据
// appStoreReceiptURL iOS7.0增加的,购买交易完成后,会将凭据存放在该地址
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
// 从沙盒中获取到购买凭据
NSData *receiptData = [NSData dataWithContentsOfURL:receiptURL];
// 发送网络POST请求,对购买凭据进行验证
//测试验证地址:https://sandbox.itunes.apple.com/verifyReceipt
//正式验证地址:https://buy.itunes.apple.com/verifyReceipt
NSURL *url = [NSURL URLWithString:SANDBOX];
NSMutableURLRequest *urlRequest =
[NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0f];
urlRequest.HTTPMethod = @"POST";
NSString *encodeStr = [receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
NSString *payload = [NSString stringWithFormat:@"{\"receipt-data\" : \"%@\"}", encodeStr];
NSData *payloadData = [payload dataUsingEncoding:NSUTF8StringEncoding];
urlRequest.HTTPBody = payloadData;
// 提交验证请求,并获得官方的验证JSON结果 iOS9后更改了另外的一个方法
NSData *result = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:nil error:nil];
// 官方验证结果为空
if (result == nil) {
NSLog(@"验证失败");
return;
}
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:result options:NSJSONReadingAllowFragments error:nil];
if (dict != nil) {
// 比对字典中以下信息基本上可以保证数据安全
// bundle_id , application_version , product_id , transaction_id
NSLog(@"验证成功!购买的商品是:%@", @"_productName");
}

}
  • 移动观察者

- (void)dealloc {
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}

编程 4

测试内购

必须是没有越狱的真机
测试之前现在iPhone上的Apple id 注销

  • 使用现有Apple id

使用在沙箱测试员中添加的账号即可

编程 49

账号

  • 购买

编程 50

购买

  • 完成购买

编程 51

完成

官方文档

  • 2017.03.15更新

APP
Store首发以为会卡在内购上,但是顺利的审核过了,但是版本更新的时候,审核员如何做内购测试呢?
首先你要了解xcode运行的APP只能用沙盒测试账号进行购买,不能使用真实的Apple
id. 而你在应用商店里下载的只能使用真实的Apple id.

解决方案:

进行二次验证:测试用沙盒验证,App
Store审核的时候也使用的是沙盒购买,所以验证购买凭证的时候需要判断返回Status
Code决定是否去沙盒进行二次验证,为了线上用户的使用,验证的顺序肯定是先验证正式环境,此时若返回值为21007,就需要去沙盒二次验证,因为此购买的是在沙盒进行的

注意:

验证操作让后台去验证

丢单处理详看下篇博客

iOS开发-内购丢单处理方式

来源:http://www.jianshu.com/p/adaf472ed3ab

6.进入联系人信息,增加一个联系人信息。

编程 5

7.填写银行信息:

选择所在国家

编程 6

填写CNAPS Code信息,如果你不清楚的情况下你可以点击Look up CNAPS Code

编程 7

查询CNAPS Code并填写

编程 8

确认银行卡信息

编程 9

填写银行帐号信息,next确认所有信息。

编程 10

8.填写税务信息。

税务信息有三个选项:美国税务、澳大利亚税务、加拿大税务。

编程 11

这里我们选择美国税务

编程 12

这里有两个问题询问你是否是美国居民?询问你有没有美国商业活动?

然后填写你的税务信息,等待审核结果。

9.银行、税收/协议我们就结束了,下边我们就进入到我们的app里去。

编程 13

10.选择功能,我们添加一个app内购项目。

编程 14

11.添加内购项目

选择类型

编程 15

产品名称:是你商品的描述。比如10颗心。产品ID:是一个比较重要的标识,项目通过ID找到商品获取商品信息。价格:可以参考价格表。

编程 16

添加语言

编程 17

提交一个屏幕快照。

添加好之后

编程 18

12.商品添加好之后我们做最后一步的准备工作--添加沙盒测试帐号。

点击进入用户和职能界面

编程 19

选择沙盒技术测试员

编程 20

填写测试员信息(填写未被其他开发者使用的邮箱,感谢夜空守望者的纠正)

编程 21