“一开始是工作中最重要的部分。”柏拉图
==========第一部分协议=======
CNAPS代码查询地址https://e.czbank.com/CORPORBANK/query_unionBank_index.jsp
=============第二部分创建内购项目============
===========第三部分贴加内购项目测试账号==========
=============第四部分主要实现代码==========
首先导入StoreKit.framework
库
.H文件
#define kSandboxVerifyURL @ " https :// sandbox .itunes.apple.com / verifyReceipt " // 开发阶段沙盒验证URL
#define kAppStoreVerifyURL @ " https :// buy .itunes.apple.com / verifyReceipt " // 实际购买验证URL
#import < StoreKit / StoreKit .h >
枚举{
IAP0p20 = 20,
IAP1p100,
IAP4p600,
IAP9p1000,
IAP24p6000,
} buyCoinsTag ;
// 代理
@interface RechargeVC : UIViewController < SKPaymentTransactionObserver , SKProductsRequestDelegate >
{
INT buyType ;
}
- (无效) requestProUpgradeProductData ;
- (无效)RequestProductData ;
- (无效)购买:( INT )型;
- (无效)paymentQueue :( SKPaymentQueue *)队列 updatedTransactions :( NSArray的 *)的交易;
- (无效) PurchasedTransaction : (SKPaymentTransaction *)的交易;
- (无效) completeTransaction : (SKPaymentTransaction *)的交易;
- (无效) failedTransaction : (SKPaymentTransaction *)的交易;
- (无效) paymentQueueRestoreCompletedTransactionsFinished : (SKPaymentTransaction *)的交易;
- ( void ) paymentQueue :( SKPaymentQueue *) paymentQueue restoreCompletedTransactionsFailedWithError :( NSError *) error ;
- (无效) restoreTransaction : (SKPaymentTransaction *)的交易;
- (无效)provideContent :( 的NSString *)的产品;
- (无效)recordTransaction :( 的NSString *)的产品;
@结束
.M文件
#进口 “ RechargeVC .H ”
// 在内购项目中创的商品单号
#define ProductID_IAP0p20 @ " Nada .JPYF01 " // 20
#define ProductID_IAP1p100 @ " Nada .JPYF02 " // 100
#define ProductID_IAP4p600 @ " Nada .JPYF03 " // 600
#define ProductID_IAP9p1000 @ " Nada .JPYF04 " // 1000
#define ProductID_IAP24p6000 @ " Nada .JPYF05 " // 6000
@interface RechargeVC ()
@ 结束
@ 实施 RechargeVC
- (无效)viewDidLoad中 {
[ 超级 viewDidLoad中];
[ SKPaymentQueue defaultQueue ] addTransactionObserver :自我];
[ 自 团购:IAP0p20 ];
}
- ( void ) buy :( int ) type
{
buyType = type;
if ([SKPaymentQueue canMakePayments]) {
[self RequestProductData];
NSLog(@"允许程序内付费购买");
}
else
{
NSLog(@"不允许程序内付费购买");
UIAlertView *alerView = [[UIAlertView alloc] initWithTitle : @ "提示"
message : @ "您的手机没有打开程序内付费购买"
delegate : nil cancelButtonTitle : NSLocalizedString ( @ "关闭" , nil ) otherButtonTitles : nil ];
[alerView 秀]
}
}
- ( void ) RequestProductData
{
NSLog(@"---------请求对应的产品信息------------");
NSArray *product = nil;
switch (buyType) {
case IAP0p20 :
product = [[ NSArray alloc ] initWithObjects : ProductID_IAP0p20 , nil ];
break;
case IAP1p100 :
product = [[ NSArray alloc ] initWithObjects : ProductID_IAP1p100 , nil ];
break;
case IAP4p600 :
product = [[ NSArray alloc ] initWithObjects : ProductID_IAP4p600 , nil ];
break;
case IAP9p1000 :
product = [[ NSArray alloc ] initWithObjects : ProductID_IAP9p1000 , nil ];
break;
case IAP24p6000 :
product = [[ NSArray alloc ] initWithObjects : ProductID_IAP24p6000 , nil ];
break;
default :
break ;
}
NSSet * nsset = [ NSSet setWithArray :product ];
SKProductsRequest * request =[[ SKProductsRequest alloc ] initWithProductIdentifiers : nsset ];
request .delegate = self ;
[ request start ];
}
//< SKProductsRequestDelegate > 请求协议
// 收到的产品信息
- ( void ) productsRequest :( SKProductsRequest *) request didReceiveResponse :( SKProductsResponse *) response {
NSLog(@"-----------收到产品反馈信息--------------");
NSArray *myProduct = response.products;
NSLog(@"产品Product ID : %@ ",response.invalidProductIdentifiers);
的NSLog(@“ 产品付费数量: %Ð ”(INT)myProduct的计数]);
//填充UI
对于(SKProduct *在myProduct的产品){
的NSLog(@“ 产品 信息”);
的NSLog(@“ SKProduct 描述信息%@ ”,[产品说明]);
的NSLog(@“ 产品标题 %@ ”,product.localizedTitle);
的NSLog(@“ 产品描述信息: %@ ”,product.localizedDescription);
的NSLog(@“ 价格: %@ ”,product.price);
的NSLog(@“ 产品 ID : %@ ”,product.productIdentifier);
}
SKPayment *支付=零;
开关(buyType){
案例IAP0p20:
支付= [SKPayment paymentWithProductIdentifier:ProductID_IAP0p20]; //支付25
打破;
案例IAP1p100:
支付= [SKPayment paymentWithProductIdentifier:ProductID_IAP1p100]; //支付108
打破;
案例IAP4p600:
支付= [SKPayment paymentWithProductIdentifier:ProductID_IAP4p600]; //支付618
打破;
案例IAP9p1000:
支付= [SKPayment paymentWithProductIdentifier:ProductID_IAP9p1000]; //支付1048
打破;
案例IAP24p6000:
支付= [SKPayment paymentWithProductIdentifier:ProductID_IAP24p6000]; //支付5898
打破;
默认:
打破;
}
的NSLog(@“ --------- 发送购买请求------------ ”);
[SKPaymentQueue defaultQueue] addPayment:付款];
}
- (无效)requestProUpgradeProductData
{
的NSLog(@“ ------ 请求升级数据--------- ”);
*的NSSet = productIdentifiers [的NSSet setWithObject:“@ COM 。的productid ”];
SKProductsRequest * productsRequest = [[SKProductsRequest页头] initWithProductIdentifiers:productIdentifiers];
productsRequest.delegate =自我;
[productsRequest开始]
}
//弹出错误信息
- (无效)要求:(SKRequest *)要求didFailWithError:(NSError *)错误{
的NSLog(@“ ------- 弹出错误信息---------- ”);
UIAlertView中* alerView = [[UIAlertView中页头] initWithTitle:NSLocalizedString(@“ 警报”,NULL)消息:[错误localizedDescription]
代表:无cancelButtonTitle:NSLocalizedString(@“ 关闭”,无)otherButtonTitles:无];
[alerView秀]
}
- (无效)requestDidFinish:(SKRequest *)的请求
{
的NSLog(@“ ---------- 反馈信息结束-------------- ”);
}
- (无效)PurchasedTransaction:(SKPaymentTransaction *){交易
的NSLog(@“ ----- PurchasedTransaction ---- ”);
NSArray的*交易= [[NSArray的页头] initWithObjects:交易,无]
[个体经营paymentQueue:[SKPaymentQueue defaultQueue] updatedTransactions:交易]
}
// <SKPaymentTransactionObserver>千万不要忘记绑定,代码如下:
// ----监听购买结果
// [SKPaymentQueue defaultQueue] addTransactionObserver:个体经营];
- (无效)paymentQueue:(SKPaymentQueue *)队列updatedTransactions:(NSArray的*)交易//交易结果
{
的NSLog(@“ ----- paymentQueue -------- ”);
对(在交易SKPaymentTransaction *交易)
{
开关(transaction.transactionState)
{
案例SKPaymentTransactionStatePurchased:{//交易完成
[个体经营completeTransaction:交易]
的NSLog(@“ ----- 交易完成 -------- ”);
//购买成功后进行验证
[个体经营verifyPurchaseWithPaymentTransaction]
}打破;
案例SKPaymentTransactionStateFailed://交易失败
{[自failedTransaction:交易]
的NSLog(@“ ----- 交易失败 -------- ”);
UIAlertView中* alerView2 = [[UIAlertView中页头] initWithTitle:@“ 提示”
消息:@“ 购买失败,请重新尝试购买”
代表:无cancelButtonTitle:NSLocalizedString(@“ 关闭”,无)otherButtonTitles:无];
[alerView2秀]
}打破;
案例SKPaymentTransactionStateRestored://已经购买过该商品
[个体经营restoreTransaction:交易]
的NSLog(@“ ----- 已经购买过该商品 -------- ”);
案例SKPaymentTransactionStatePurchasing://商品添加进列表
的NSLog(@“ ----- 商品添加进列表 -------- ”);
打破;
默认:
打破;
}
}
}
/ **
*验证购买,避免越狱软件模拟苹果请求达到非法购买问题
*
* /
- (无效){verifyPurchaseWithPaymentTransaction
//从沙盒中获取交易凭证并且拼接成请求体数据
NSURL * receiptUrl = [[一个NSBundle mainBundle] appStoreReceiptURL];
NSData的* receiptData = [NSData的dataWithContentsOfURL:receiptUrl];
* NSString的receiptString = [receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed]; //转化为BASE64字符串
* NSString的bodyString = [的NSString stringWithFormat:@“ {\ ” 接收数据\“: \"%@\"}" , receiptString ]; //拼接请求数据
NSData *bodyData = [bodyString dataUsingEncoding : NSUTF8StringEncoding ];
//创建请求到苹果官方进行购买验证
NSURL *url=[NSURL URLWithString : kSandboxVerifyURL ];
NSMutableURLRequest *requestM=[NSMutableURLRequest requestWithURL : url ];
requestM.HTTPBody=bodyData;
requestM.HTTPMethod=@"POST";
//创建连接并发送同步请求
NSError *error=nil;
NSData *responseData=[NSURLConnection sendSynchronousRequest : requestM returningResponse : nil error : & error ];
if (error) {
NSLog(@"验证购买过程中发生错误,错误信息:%@",error.localizedDescription);
return;
}
NSDictionary * dic =[ NSJSONSerialization JSONObjectWithData :responseData options :NSJSONReadingAllowFragments error :nil ];
NSLog (@ " %@ " , dic );
if ([ dic [@ " status " ] intValue ]== 0 ) {
NSLog(@"购买成功!");
NSDictionary *dicReceipt= dic[@"receipt"];
NSDictionary *dicInApp=[dicReceipt[@"in_app"] firstObject];
NSString *productIdentifier= dicInApp[@"product_id"];//读取产品标识
//如果是消耗品则记录购买数量,非消耗品则记录是否购买过
NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
if ([productIdentifier isEqualToString : kProductID3 ]) {
int purchasedCount = [ defaults integerForKey : productIdentifier ]; //已购买数量
[[NSUserDefaults standardUserDefaults] setInteger :( purchasedCount + 1 ) forKey : productIdentifier ];
} else {
[defaults setBool : YES forKey : productIdentifier ];
}
[ self .tableView reloadData ];
// 在此处对购买记录进行存储,可以存储到开发商的服务器端
} else {
NSLog(@"购买失败,未通过验证!");
}
}
- (无效) completeTransaction : (SKPaymentTransaction *)交易
{
NSLog(@"-----completeTransaction--------");
// Your application should implement these two methods.
NSString *product = transaction.payment.productIdentifier;
if ([product length] > 0) {
NSArray *tt = [product componentsSeparatedByString : @ "." ];
NSString *bookid = [tt lastObject];
if ([bookid length] > 0) {
[self recordTransaction : bookid ];
[self provideContent : bookid ];
}
}
// 删除 该 交易 从 该 支付 队列。
[ SKPaymentQueue defaultQueue ] finishTransaction : 交易]
}
// 记录交易
- (无效)recordTransaction :( 的NSString *)产品{
的NSLog(@“-----记录交易--------”);
}
// 处理下载内容
- (无效)provideContent :( 的NSString *)产品{
的NSLog(@“-----下载--------”);
}
- ( void ) failedTransaction : ( SKPaymentTransaction *) transaction {
NSLog(@"失败");
if (transaction.error.code != SKErrorPaymentCancelled)
{
}
[ SKPaymentQueue defaultQueue ] finishTransaction : 交易]
}
- (无效) paymentQueueRestoreCompletedTransactionsFinished : (SKPaymentTransaction *)交易{
}
- (无效) restoreTransaction : (SKPaymentTransaction *)交易
{
的NSLog(@“ 交易恢复处理”);
}
- ( void ) paymentQueue :( SKPaymentQueue *) paymentQueue restoreCompletedTransactionsFailedWithError :( NSError *) error {
NSLog(@"-------paymentQueue----");
}
#pragma mark connection delegate
- ( void ) connection :( NSURLConnection *) connection didReceiveData :( NSData *) data
{
NSLog(@"%@", [[NSString alloc] initWithData : data encoding : NSUTF8StringEncoding ]);
}
- ( void ) connectionDidFinishLoading :( NSURLConnection *) connection {
}
- ( void ) connection :( NSURLConnection *) connection didReceiveResponse :( NSURLResponse *) response {
switch([(NSHTTPURLResponse *)response statusCode]) {
case 200 :
case 206 :
break ;
case 304 :
break ;
case 400 :
break ;
case 404 :
break ;
case 416 :
break ;
case 403 :
break ;
case 401 :
case 500 :
break ;
default :
break ;
}
}
- (无效)连接:( NSURLConnection的 *)连接 didFailWithError :( NSError *)错误 {
的NSLog(@“测试”);
}
- (无效)的dealloc
{
[SKPaymentQueue defaultQueue] removeTransactionObserver :自我]; //解除监听
}
@结束