IAP开发需要的注意点
在沙箱环境测试
Store Kit在模拟器上无法运行,需要使用真机测试
sanbox和app store内容一致,只是不执行真实的支付动作
在测试的iphone上面退出itunes账户
不能在测试的iphone手机上登录测试账户登录
在程序中购买商品后,storekit会提示你去验证交易,这个时候你需要用测试账户登录,并批复支付
登录itunes connect去用户和职能中添加沙盒技术测试账户
IAP开发在客户端和服务端需要做的事情
在客户端 检测是否可以进行支付-》获取商品信息-》创建一个支付对象-》为支付队列注册一个观察者对象-》交易结果-》提示给用户
服务端将接收到的数据以base64编码的方式创建JSON并发送给APPSore进行验证
代码如下
#import <StoreKit/StoreKit.h>
@interface ViewController ()<SKProductsRequestDelegate,SKStoreProductViewControllerDelegate>
@property (nonatomic,strong)SKProduct *product;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)startPayAction:(UIButton *)sender {
//判断当前设备是否允许支付
if(![SKPaymentQueue canMakePayments]) {
return;
}
NSSet *set =[NSSet setWithObjects:@"", nil];
SKProductsRequest *req=[[SKProductsRequest alloc] initWithProductIdentifiers:set];
req.delegate=self;
[req start];
}
#pragma mark SKStoreProductViewControllerDelegate
- (void)productViewControllerDidFinish:(SKStoreProductViewController *)viewController
{
}
#pragma mark SKProductsRequestDelegate
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
//
for (SKProduct *product in response.products) {
self.product = product;
}
//将获取到的产品信息,加入到支付队列
SKPayment *payment =[SKPayment paymentWithProduct: self.product];
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions
{
for (SKPaymentTransaction *transaction in transactions) {
switch (transaction.transactionState) {
case SKPaymentTransactionStatePurchasing:
break;
case SKPaymentTransactionStatePurchased:
{
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
break;
case SKPaymentTransactionStateFailed:
break;
case SKPaymentTransactionStateRestored:
break;
default:
break;
}
}
}
if([PKPaymentAuthorizationController canMakePayments]) {
PKPaymentRequest *request = [[PKPaymentRequest alloc] init];
PKPaymentSummaryItem *wi=[PKPaymentSummaryItem summaryItemWithLabel:@"fdfd" amount:[NSDecimalNumber decimalNumberWithString:@"0.22"]];
request.paymentSummaryItems=@[wi];
request.countryCode = @"US";
request.currencyCode = @"USD";
request.supportedNetworks = @[PKPaymentNetworkAmex,PKPaymentNetworkMasterCard];
request.merchantIdentifier = @"fdfd";
request.merchantCapabilities=PKMerchantCapabilityEMV;
request.requiredBillingAddressFields=PKAddressFieldEmail|PKAddressFieldPostalAddress;
PKPaymentAuthorizationController *paymentPane = [[PKPaymentAuthorizationController alloc] initWithPaymentRequest:request];
paymentPane.delegate = self;
[self presentViewController:paymentPane animated:true completion:nil];
}