一、设置协议等相关

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

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

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

Request.png

主协议界面

主协议.png

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

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

添加新的联系信息.png

4.填写完整并保存。
!填写完整并保存.png](https://upload-images.jianshu.io/upload_images/2267403-171bc9c91b214d53.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

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

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

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

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

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

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

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

image.png

填写 CNAPS Code,点击 next。

image.png

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

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

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

image.png

确认一下,点击 save 保存。

image.png

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

image.png

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

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

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

image.png

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

image.png

如果没有就选择 NO。

image.png

填写完整,点击 Submit。

image.png

image.png

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

image.png

二、创建项目的内购条目

1.进入 APP,点击功能。

image.png

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

image.png

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

image.png

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

image.png

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

image.png

三、添加沙盒测试账号

1.点击用户和职能

image.png

2.点击沙盒技术测试员

image.png

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

image.png

四、代码集成

#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.
}

链接:https://www.jianshu.com/p/dfbcbf40c5f8

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

  1. iOS 苹果内购详细步骤

    一.设置协议等相关 1.点击协议.税务和银行业务. 2.点击 Request Contracts 下面的 Request,一直点击直到主协议界面. 主协议界面 Contact info :联系人信息 ...

  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. iOS安全攻防(十七):Fishhook
  2. Dockerfile中通过ENV指定动态参数在RUN时传递参数(部署后台jar包时指定端口为例)
  3. 机器学习解决什么问题_机器学习帮助解决水危机
  4. Promise解决多个异步Ajax请求导致的代码嵌套问题(完美解决方案)
  5. 孙鑫-MFC笔记五--对话框
  6. 《Effective Java 3rd》读书笔记——类和接口
  7. 网络 | OSI七层模型各层常见协议
  8. axure能做剪切蒙版吗_二手车销售好做吗?没经验能做二手车销售吗?
  9. 【支付架构】支付营销 - 微信会员有礼
  10. 梅特勒托利多xk3124电子秤说明书_梅特勒-托利多电子称设置方法
  11. 腾讯2018秋招笔试真题(1)
  12. 文件下载和二进制文件(图片、mp4视频)预览响应头的设置(防止中文名名乱码)
  13. 《程序设计基础》 第五章 函数 6-6 字符金字塔 (15 分)
  14. 黑马编程开发各种免费资源-安排一下
  15. (四)u-boot2013.01.01 for s5pv210:《mkconfig分析》
  16. PM、RD、FE、UE...等等这些互联网相关的缩写
  17. 智能家居创意DIY之智能触摸面板开关
  18. Qt学习1——Hello World程序
  19. 在西瓜数据集上用Python实现ID3决策树算法完整代码
  20. 杀死比尔盖茨:美国有31万脑子被撞坏的人,认为他创造了新冠病毒

热门文章

  1. python3实现softmax + 函数曲线绘制
  2. 固态硬盘跟机械硬盘的区别
  3. matlab如何打开dcm_MATLAB绘图干货
  4. LED电子显示屏真彩显示的几种关键技术[转]
  5. oracle index alter,Oracle alter index rebuild 一系列问题
  6. imx6 android 最新,Re: IMX6D Android6.0 OTA 升级问题
  7. [转载]Android性能优化来龙去脉总结
  8. html的网页制作需要哪些知识,网页制作之HTML基础知识
  9. SSL证书是要怎么部署的,SSL证书怎么安装你知道吗?
  10. linux服务器断电后系统报错,Linux服务器开机启动报错.docx