如果CP游戏客户端具有自己的游戏服务器,需要对充值进行数据验证的,可参考《iOS游戏IAP数据服务器验证》
一,前提:
1,注册有iOS开发者账号Apple ID(是注册过开发者账号的Apple
ID,非普通Apple ID)。
2,用上述账号Apple ID登录[苹果开发者官网]
(https://developer.apple.com/account/ios/identifiers/bundle/bundleCreate.action)为在开发的iOS应用注册一个Bundle
identifier(将正在开发的应用注册到iTunes Connect管理时用到)。
注册的字符串和对应应用XCode中的Bundle Identifier字符串
3.使用1所述开发者账号Apple ID登录 iTunes Connect(iTunes Connect可以用来管理和提交正在开发的iOS应用)。
4,此Apple ID要求已经接受或同意iTunes Connect上的一些条款,主要是关于法律,税务和银行账号完善等。否则账号上登录的很多功能不能使用,如后面注册的商品无效,商品种类选择项缺失等。
使用开发者账号登陆成功后界面如下,然后可以先点击打开最下面的红色框“协议,税务和银行业务“完成条款接受和完善银行账号信息等。
提示:现在新建APP和注册商品,包括后面的沙盒测试购买,都不会把APP提交到Appstore。
二,为在开发的应用注册商品
1,点击上图第二个红色框”我的APP“后,新建iOS APP,
SKU是自己公司应用区分的标识
。
”套装ID“就是账号上为应用注册过的Bundle Identity,这个要求和Xcode工程上的Bundle Identity一致。
最后,点击”创建“完成。
2,回到”我的APP“,点击刚刚创建的应用,
选择”App内置购买项目“
选择有左上角的”Create New“按钮,
对于网络游戏来讲,如购买”金币100“一般选择”消耗性项目“。(如果你的Apple ID没有完善条款或银行信息将不会看到这个选择类型)
一路填写下来,产品ID我写”Bundle Identity+自定义的商品名称“来保持唯一性
最后”Done“。
回到”APP内购买项目“就能够看到自己注册的商品了
到此为应用商品注册完成!
三,注册沙盒测试账号
这个账号用来对我们应用内的商品进行购买, 回到iTunes Connect主页,点击”用户和职能“
点击“沙箱技术测试员”
![]()
进去后点击“+”,
然后一路跟着填写,根据提示填写注册信息,完成后就看到自己注册的测试账号:
![]()
测试账号注册完成!
提交商品后并不会立即生效,提交到沙箱环境生效需要一定的时间,如果测试获取不到商品信息可过了一天再试。
四,测试商品
首先从Xcode引进StoreKit框架,import
ViewController.h
#import <UIKit/UIKit.h>
#import <StoreKit/StoreKit.h>
@interface ViewController : UIViewController <SKPaymentTransactionObserver, SKProductsRequestDelegate>
@end
ViewController.m
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self setOnListner];
UIButton * btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[btn setFrame:CGRectMake(100, 300, self.view.bounds.size.width/2, 50)];
[btn setTitle:@"buy" forState:UIControlStateNormal];
btn.backgroundColor = [UIColor purpleColor];
[btn addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchDown];
[self.view addSubview:btn];
}
//对交易进行监听和设置可购买
-(void)setOnListner{
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
NSString * des;
if([SKPaymentQueue canMakePayments]){
des = @"可购买内置项目!";
}else{
des = @"不可购买内置项目!";
}
NSLog(@"%@",des);
UIAlertView * a = [[UIAlertView alloc]initWithTitle:@"tips" message:des delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil, nil];
[a show];
}
-(void)click{
[self reqBuyData];
}
//请求商品信息
-(void)reqBuyData{
// 所注册的商品ID数组
NSArray * arr = [[NSArray alloc] initWithObjects:@"com.test.testiap.gold100",@"com.test.testiap.gold500", nil];
NSSet *set = [NSSet setWithArray:arr];
SKProductsRequest * req = [[SKProductsRequest alloc] initWithProductIdentifiers:set];
req.delegate = self;
[req start];
}
//SKProductsRequestDelegate代理实现
-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
NSArray * myProducts = response.products;
//如果是无效的商品将会出现在这里,如AppleID账号没完善银行信息之类也会导致
NSArray * dArr = response.invalidProductIdentifiers;
NSLog(@"接受到产品返回信息%lu", myProducts.count);
NSLog(@"接受到无效的产品返回信息%lu", dArr.count);
if(myProducts.count < 1){
NSLog(@"无有效商品信息!");
return;
}
SKProduct * buyProduct;
for (SKProduct * product in myProducts) {
NSLog(@"---pay des : %@", product.localizedDescription);
NSLog(@"product title:%@", product.localizedTitle);
NSLog(@"price:%@", product.price);
buyProduct = product;
}
//这里我直接对最后一个商品进行下单购买,
SKPayment * pay = [SKPayment paymentWithProduct:buyProduct];
[[SKPaymentQueue defaultQueue] addPayment:pay];
}
//SKProductsRequestDelegate代理实现,请求商品有错log
-(void)request:(SKRequest *)request didFailWithError:(NSError *)error{
NSLog(@"---------error log----%@", error.localizedDescription);
}
//SKProductsRequestDelegate代理实现
-(void)requestDidFinish:(SKRequest *)request{
NSLog(@"信息请求结束");
}
//SKPaymentTransactionObserver代理实现
-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
NSString * des;
for(SKPaymentTransaction * trans in transactions){
switch (trans.transactionState) {
case SKPaymentTransactionStatePurchased:
des = @"购买成功!";
break;
case SKPaymentTransactionStateFailed:
des = @"购买失败!";
break;
case SKPaymentTransactionStateRestored:
des = @"购买重复!";
break;
case SKPaymentTransactionStatePurchasing:
des = @"购买ing!";
break;
default:
break;
}
UIAlertView * a = [[UIAlertView alloc] initWithTitle:@"result" message:des delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil, nil];
[a show];
}
}
@end
运行: 这里可输入在沙箱注册的测试者账号进行测试,
打印信息: 已成功请求到所注册的商品信息!
以上代码只是说明购买内置产品大概流程,到实际应用时还有先验证商品信息的有效性,并对用户展示商品信息数据等步奏。