一、设置协议等相关

1.点击协议、税务和银行业务。

2.点击 Request Contracts 下面的 Request,一直点击直到主协议界面。

主协议界面

Contact info :联系人信息
Bank info :银行信息
Tax info :税务信息

3.点击 Contact Info 下面的Set Up,设置联系人信息,然后点击 Add New Contract,添加新的联系信息。

4.填写完整并保存。

5.选择联系人,因为我是独立开发,所以填写的自己的,如果你是多人开发,你可以添加多个联系人。

Senior Management:高级管理人员
Financial :财务
Technical :技术支持
Legal :法务
Marketing :市场推广

添加完成之后,对应选择好就行。

6.点击 Bank Info 下的 Set Up,然后点击 Add Bank Account 添加银行账号。

点击 Select One,选择 China ,点击 next。

填写 CNAPS Code,点击 next。

CNAPS Code:中国现代化支付系统代码,又叫做联行号。可以从网上查询,也可以直接点击Look up CNAPS Code进行查询,再不济,也可以直接打电话咨询相应银行客服。

点击 next,核对一下,继续 next。

填写银行卡相关信息,点击 next。(持卡人姓名,如张三(Zhang San))

确认一下,点击 save 保存。

选择对应的银行卡,点击 save。

7.点击 Tax Info 下面的 Set Up,设置税务信息。

税务分三种:
U.S Tax Forms : 美国税务
Australia Tax Forms:澳大利亚税务
Canada Tax Forms : 加拿大税务

我们选择美国税务,点击 Done。

如果没有就选择 NO,点击 Submit。

如果没有就选择 NO。

填写完整,点击 Submit。

核对信息无误后提交,状态显示 Processing 表示成功。

二、创建项目的内购条目

1.进入 APP,点击功能。

根据情况选择,我选择的第一个。

填写内购项目信息,点击存储。

下面这些信息也要填完整,否则会提示元数据丢失(坑)。

注意:你 App 有几个内购级别就需要依次创建几个条目。

三、添加沙盒测试账号

1.点击用户和职能

2.点击沙盒技术测试员

3.点击 “+” 添加测试员,邮箱和密码用于支付的时候登陆 Apple ID。

四、代码集成

#import "ApplePayVC.h"
//导入
#import <StoreKit/StoreKit.h>//遵循代理
@interface ApplePayVC ()
<
SKPaymentTransactionObserver,
SKProductsRequestDelegate
>//支付按钮
@property (nonatomic, strong) UIButton *payBtn;@end@implementation ApplePayVC- (void)viewDidLoad
{[super viewDidLoad];[self setupPayBtn];//设置支付服务[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
}#pragma mark - UI
- (void)setupPayBtn
{_payBtn = [UIButton buttonWithType:UIButtonTypeCustom];_payBtn.frame = CGRectMake(100, 100, 100, 100);_payBtn.backgroundColor = [UIColor redColor];[_payBtn setTitle:@"支付" forState:UIControlStateNormal];[_payBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];_payBtn.titleLabel.font = [UIFont systemFontOfSize:15.0];[_payBtn addTarget:self action:@selector(payBtnAction) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:_payBtn];
}#pragma mark - BtnAction
- (void)payBtnAction
{//是否允许内购if ([SKPaymentQueue canMakePayments]) {NSLog(@"用户允许内购");//bundleid+xxx 就是你添加内购条目设置的产品IDNSArray *product = [[NSArray alloc] initWithObjects:@"bundleid+xxx",nil];NSSet *nsset = [NSSet setWithArray:product];//初始化请求SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset];request.delegate = self;//开始请求[request start];}else{NSLog(@"用户不允许内购");}}#pragma mark - SKProductsRequestDelegate
//接收到产品的返回信息,然后用返回的商品信息进行发起购买请求
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response NS_AVAILABLE_IOS(3_0)
{NSArray *product = response.products;//如果服务器没有产品if([product count] == 0){NSLog(@"没有该商品");return;}SKProduct *requestProduct = nil;for (SKProduct *pro in product) {NSLog(@"%@", [pro description]);NSLog(@"%@", [pro localizedTitle]);NSLog(@"%@", [pro localizedDescription]);NSLog(@"%@", [pro price]);NSLog(@"%@", [pro productIdentifier]);//如果后台消费条目的ID与我这里需要请求的一样(用于确保订单的正确性)if([pro.productIdentifier isEqualToString:@"bundleid+xxx"]){requestProduct = pro;}}//发送购买请求SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:requestProduct];payment.applicationUsername = userId;//可以是userId,也可以是订单id,跟你自己需要而定[[SKPaymentQueue defaultQueue] addPayment:payment];
}#pragma mark - SKRequestDelegate
//请求失败
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error
{NSLog(@"error:%@", error);
}//请求结束
- (void)requestDidFinish:(SKRequest *)request
{NSLog(@"请求结束");
}#pragma mark - SKPaymentTransactionObserver
//监听购买结果
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{for(SKPaymentTransaction *tran in transactions){switch (tran.transactionState) {case SKPaymentTransactionStatePurchased:NSLog(@"交易完成");[self completeTransaction:tran];break;case SKPaymentTransactionStatePurchasing:NSLog(@"商品添加进列表");break;case SKPaymentTransactionStateRestored:NSLog(@"已经购买过商品");
//                [[SKPaymentQueue defaultQueue] finishTransaction:tran]; 消耗型商品不用写break;case SKPaymentTransactionStateFailed:NSLog(@"交易失败");[[SKPaymentQueue defaultQueue] finishTransaction:tran];break;default:break;}}
}//交易结束,当交易结束后还要去appstore上验证支付信息是否都正确,只有所有都正确后,我们就可以给用户方法我们的虚拟物品了。
- (void)completeTransaction:(SKPaymentTransaction *)transaction
{// 验证凭据,获取到苹果返回的交易凭据// 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/verifyReceiptNSURL *url = [NSURL URLWithString:AppStore_URL];NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15.0f];urlRequest.HTTPMethod = @"POST";NSString *encodeStr = [receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];_receipt = encodeStr;NSString *payload = [NSString stringWithFormat:@"{\"receipt-data\" : \"%@\"}", encodeStr];NSData *payloadData = [payload dataUsingEncoding:NSUTF8StringEncoding];urlRequest.HTTPBody = payloadData;NSData *result = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:nil error:nil];if (result == nil) {NSLog(@"验证失败");return;}NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:result options:NSJSONReadingAllowFragments error:nil];NSLog(@"请求成功后的数据:%@",dic);//这里可以通过判断 state == 0 验证凭据成功,然后进入自己服务器二次验证,,也可以直接进行服务器逻辑的判断。//本地服务器验证成功之后别忘了 [[SKPaymentQueue defaultQueue] finishTransaction: transaction];NSString *productId = transaction.payment.productIdentifier;NSString *applicationUsername = transaction.payment.applicationUsername;NSLog(@"applicationUsername++++%@",applicationUsername);NSLog(@"payment.productIdentifier++++%@",productId);if (dic != nil) {userId = applicationUsername;//服务器二次验证[self vertifyApplePayRequestWith:transaction];}
}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}

注意:
1.内购必须用真机测试
2.测试时必须退出App Store自己的Apple ID,登录沙盒的测试Apple ID

iOS 苹果内购详细步骤相关推荐

  1. iOS苹果内购详细步骤

    一.设置协议等相关 1.点击协议.税务和银行业务. 点击协议.税务和银行业务.png 2.点击 Request Contracts 下面的 Request,一直点击直到主协议界面. Request.p ...

  2. iOS_苹果内购详细步骤

    iOS苹果内购详细步骤 iOS开发支付的两种方式 1 Apple Pay + 调取外部支付,例如支付宝.微信.银联等 2 苹果内购IAP(In-App Purchase) 1 IAP规则详解 1.1 ...

  3. ios 内购正式环境_iOS苹果内购(详细步骤)

    #### 一.设置付费协议 1.进入开发者平台,点击如下图所示: 设置 2.查看付费同意条款 1. 设置付费协议 添加这3个信息 4.添加银行账户 5.选择报税表 默认美国 6.根据报税表填写报税情况 ...

  4. uni app ios 苹果内购

    app ios 苹果内购 的步骤 1,准备工作先要uniapp 开发ios 内购需要准备的沙盒 测试账号,在苹果手机登录沙盒账号 也就是把自己的Apple ID退出登录沙盒账号,manifest.js ...

  5. java(jfinal) 接入ios苹果内购(连续包月订阅),服务端将二次验证。

    大致流程: 1.ios端进行支付,然后收到苹果的一串数据(也叫收据),然后ios端将其转码为BASE64编码的字符串. 2.ios端请求服务端接口,将数据传给服务端,服务端拿到数据后,通过一系列处理后 ...

  6. iOS苹果内购流程(Apple Pay)

    好文:https://github.com/lintide/ApplePayDemo 苹果内购流程 字数631 阅读133 评论1 喜欢6 1.登录开发者中心[开发者中心链接](https://dev ...

  7. iOS 苹果内购 In-App Purchase 踩过的坑

    项目里面要接苹果支付,结果我研究了一个小时的apple pay,结果经理说是苹果内购,当时就感觉被耍了!好了,那就说说In-App Purchase这个吧,前面所有的准备工作经理做完了,我只是码代码, ...

  8. iOS IAP应用内购详细步骤和问题总结指南

    最近公司在做APP内购会员功能 遇到了很多问题 总结记录一下 首先一定要区分Apple pay 和IAP内购的区别 可以先去看一下官方文档地址 有每个步骤的详细解释 本篇文章分为:1. 内购支付流程: ...

  9. IOS,苹果内购和添加广告

    内购--应用内购买 通过苹果应用程序商店有三种主要赚钱的方式: 直接收费(与国内大部分用户的消费习惯相悖) 广告(降低用户体验 应用程序名称带Lite可以添加广告) O2O -> Online推 ...

最新文章

  1. 06. 为知笔记 -- 我的修改
  2. 整理oracle 树形查询
  3. 仿ArrayList功能的bag类
  4. C与C++在形参的一点小区别
  5. 有一个懂机械、懂焊接、懂电子的爹是什么概念。。。
  6. 开启简单的laravel5 MVC模式
  7. 民企信息化建设个人经历(四)
  8. java 规格overview_《Java數據結構和算法》- OverView
  9. 13 CO配置-控制-内部订单-定义定单类型
  10. 查找 EXC_BAD_ACCESS 问题根源的方法
  11. Dom,JQuery
  12. angularjs指令参数transclude
  13. 如何打开 Mac 的摄像头?
  14. Technorati 推出博客广告媒体
  15. 什么是质量功能配置(QFD)(转载)
  16. 毕业有救了?!留美学生创造出了自动写论文的机器人!
  17. Solution to no ADO.NET in VS2019 VS里没有ADO的解决办法
  18. javaSE_day17 学习笔记 ——泛型、Stream
  19. 什么是 Substrate
  20. 【技巧】desc +表名;

热门文章

  1. linux 无线网络连接不上网,linux无法连接wifi,不显示wifi
  2. ROC曲线和PR曲线
  3. (译)2019年前端性能优化清单 — 中篇
  4. css 让图标上下跳,使用CSS和Bootstrap图标制作上下跳动的指示箭头动画效果
  5. arm linux 汇编.text .global 是什么意思?
  6. Flutter项目插件整理
  7. vb/vb.net开发精粹(19)
  8. 信息驾驶舱(管理驾驶舱)
  9. 最热开源实时提升动画画质MPV+Anime4K使用方法
  10. 控制面板中的程序无法正常卸载