https://wilddylan.github.io/2016/09/23/IAP/
文档:
京东支付
ios 内购1
ios 内购2
ios 内购3
ios 内购4
官方文档源码 ----- 点击传送
- 官方文档:
使在应用程序购买(IOS,tvos,MAC)
在应用程序购买商店直接嵌入到你的应用程序,允许你连接到存储和安全的支付流程从用户。你可以使用内置购买收集支付功能增强或增加内容的可用的应用程序。在你的Xcode项目配置这种技术后,您将其配置在iTunes Connect。你也可以使用iTunes Connect来创建你的应用程序内购买。
**在应用程序购买使
**
在应用程序内购买功能窗格中,如果没有启用,请在应用程序内购买部分开关。
https://developer.apple.com/library/ios/technotes/tn2259/_index.html
[图片上传失败...(image-fb1e0b-1511268395331)]
Xcode自动规定你的应用程序使用应用程序内购买并添加storekit框架到你的项目,你。
如何写你的应用程序内购买代码,读
购买程序指南
。创建一个应用程序记录在iTunes进入明确的App ID连接,读取
添加新的应用程序
进入
iTunes Connect开发者指南
。创建和上传应用内购买、阅读
应用程序内购买的iTunes Connect配置指南
.
- 自己曾经做过内购的一些截图:
在准备提交里的点击:
- 然后,往下滚动,会发现一个购买 ,接着点击 “+” 号,然后,就出现你创建的内购商品。最后,保存,就可以了。
测试我们的工程了:
需要注意:你在开发者账号的创建id 号和你的 Bundle Identifiler 要一致。否则测试不成功。
1、
2、
3、
需注意:
注意:沙盒账号支付时,连接到苹果接口是不同的,对比一下:
苹果的接口官网
// 官网原文
Submit this JSON object as the payload of an HTTP POST request. In the test environment, usehttps://sandbox.itunes.apple.com/verifyReceiptas the URL. In production, usehttps://buy.itunes.apple.com/verifyReceiptas the URL.
--- 翻译:
在测试环境中,使用https://sandbox.itunes.apple.com/verifyreceipt 作为URL。
在生产中,使用https://buy.itunes.apple.com/verifyreceipt 作为URL。
--- 白话:
https://sandbox.itunes.apple.com/verifyReceipt 沙盒订单验证接口
https://buy.itunes.apple.com/verifyReceipt 正式订单验证接口
经常遇到的常见问题:
0、为啥我的代码是对的,也没报错?打印的数据也有了,就是没有弹出对话框?
答:把你的设备上的账号注销掉就可以了。
1、app 里已经可以拿到IAP数据了,如上图,但在真机里测试时,老是提示 :“找不到您输入的Apple ID,或者您的密码不正确,请再试一次” 之类的提示!
答:需要使用 测试账号的,由于你都没上线, 正式的账号没法购买的。(另外一种就是密码不对,几乎不是这个错。)
2、“无法连接到 iTunes Store”。!
这个错误一般是由以下2个原因引起的:
(1)购买商品时,Product ID写错了。
(2)App ID中,一定要打开IAP的Development配置一致。(上面已有截图)
(3)如果你使用沙盒测试的账号(不存在的邮箱,假的)。在真机里的 iTunes Store 与 App Store 把之前的账号注销掉,然后,使用沙盒测试的账号,这是你会发现,“无法连接到 iTunes Store”。---- 这说明我们的沙盒账号是不存在的嘛!但是可以测试哦!
- 你也许有疑惑?----》为什么要使用假的?(个人理解,不足之处请多多请教)
- 因为,使用不存在的邮箱的话,也就是假的邮箱,你可以在开发测试阶段就可以使用真机测试了。
- 如果使用的是真实的,也就是可以在AppStore 里登陆的账号的话。意味着2点:
a、要求APP 上线才能测试。
b、如果不设置成 沙盒测试的话,那真的是扣你钱的。
** 小结:在开发阶段,建议创建一个假的沙盒账号。
3、如果上面2步骤,确保是对的话,那么,你在沙河测试项里添加一个或多个测试账号随便写,可以是假的,最好是假的:例如:testPay@qq.com ,然后,把真机里的原来的账号注销掉!(一定要注销),紧接着,执行我们的工程,此时!恭喜你,是不是弹出了你喜欢的输入框了?然后 把沙河测试账号 testPay@qq.com 填入,就OK了。测试成功!
PS: 也许你的测试还不成功的话,嗯!这个 锦囊 一定可以帮得上忙的。
下面让我们来认识几个重要的类:
SKProduct: --------------》需导入 @import StoreKit;
objects are returned as part of anSKProductsResponse
object. Each product object provides information about a product you previously registered in iTunes Connect.
-Getting Product Attributes 属性
@property(nonatomic, readonly) NSString *localizedDescription NS_AVAILABLE_IOS(3_0);
@property(nonatomic, readonly) NSString *localizedTitle NS_AVAILABLE_IOS(3_0);
@property(nonatomic, readonly) NSDecimalNumber *price NS_AVAILABLE_IOS(3_0);
@property(nonatomic, readonly) NSLocale *priceLocale NS_AVAILABLE_IOS(3_0);
@property(nonatomic, readonly) NSString *productIdentifier NS_AVAILABLE_IOS(3_0);
// YES if this product has content downloadable using SKDownload
@property(nonatomic, readonly, getter=isDownloadable) BOOL downloadable NS_AVAILABLE_IOS(6_0);
// Sizes in bytes (NSNumber [long long]) of the downloads available for this product
@property(nonatomic, readonly) NSArray<NSNumber *> *downloadContentLengths NS_AVAILABLE_IOS(6_0);
// Version of the downloadable content
@property(nonatomic, readonly) NSString *downloadContentVersion NS_AVAILABLE_IOS(6_0);
SKPayment 付款
这个skpayment类定义了苹果App Store的应用程序提供附加功能处理支付请求。付款将字符串,标识一个特定的产品,这些物品的用户愿意购买的数量。
-
下面的是苹果推荐的最佳内购代码逻辑(我是从苹果文档里copy过来的):
-(void)fetchProductInformation { NSSet *productID = [NSSet setWithObject:@"product_identifier"]; // Create a product request(创建内购商品请求) SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:productID]; request.delegate = self; // Send the product request to the App Store,向AppStore发送购买请求 [request start]; } - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response { // 在获取商品的内容之前,要确保产品数组不是空的 if ([response.products count] > 0) { // product is an instance of SKProduct(就是实例化) self.product = [response.products firstObject]; NSLog(@"Name: %@", self.product.localizedTitle); } } // 点击购买 - (IBAction)purchase:(id)sender { if (self.product != nil) { SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:self.product]; [[SKPaymentQueue defaultQueue] addPayment:payment]; } }