ios应用/游戏内购接入方法
来源:互联网 发布:七个魂器都是什么 知乎 编辑:程序博客网 时间:2024/05/21 03:27
======================第一部分协议===============
CNAPS CODE 查询地址
https://e.czbank.com/CORPORBANK/query_unionBank_index.jsp
2016/11/18号更新
没显示的都是可以不填的,主要是打钩 title 和最后面的Self
=============第二部分创建内购项目============
===========第三部分贴加内购项目测试账号==========
=============第四部分主要实现代码==========
首先导入StoreKit.framework
库
.h文件
#import <StoreKit/StoreKit.h>enum{IAP0p20=20,IAP1p100,IAP4p600,IAP9p1000,IAP24p6000,}buyCoinsTag;//代理@interface RechargeVC : UIViewController <SKPaymentTransactionObserver,SKProductsRequestDelegate >{int buyType;}- (void) requestProUpgradeProductData;-(void)RequestProductData;-(void)buy:(int)type;- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions;-(void) PurchasedTransaction: (SKPaymentTransaction *)transaction;- (void) completeTransaction: (SKPaymentTransaction *)transaction;- (void) failedTransaction: (SKPaymentTransaction *)transaction;-(void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentTransaction *)transaction;-(void) paymentQueue:(SKPaymentQueue *) paymentQueue restoreCompletedTransactionsFailedWithError:(NSError *)error;- (void) restoreTransaction: (SKPaymentTransaction *)transaction;-(void)provideContent:(NSString *)product;-(void)recordTransaction:(NSString *)product;@end
.m文件
#import "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 ()@end@implementation RechargeVC- (void)viewDidLoad { [super viewDidLoad]; [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; [self buy: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 show]; }}-(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(@"产品付费数量: %d", (int)[myProduct count]); // populate UI for(SKProduct *product in myProduct){ NSLog(@"product info"); NSLog(@"SKProduct 描述信息%@", [product description]); NSLog(@"产品标题 %@" , product.localizedTitle); NSLog(@"产品描述信息: %@" , product.localizedDescription); NSLog(@"价格: %@" , product.price); NSLog(@"Product id: %@" , product.productIdentifier);} SKPayment *payment = nil; switch (buyType) { case IAP0p20: payment = [SKPayment paymentWithProductIdentifier:ProductID_IAP0p20]; //支付25 break; case IAP1p100: payment = [SKPayment paymentWithProductIdentifier:ProductID_IAP1p100]; //支付108 break; case IAP4p600: payment = [SKPayment paymentWithProductIdentifier:ProductID_IAP4p600]; //支付618 break; case IAP9p1000: payment = [SKPayment paymentWithProductIdentifier:ProductID_IAP9p1000]; //支付1048 break; case IAP24p6000: payment = [SKPayment paymentWithProductIdentifier:ProductID_IAP24p6000]; //支付5898 break; default: break;} NSLog(@"---------发送购买请求------------"); [[SKPaymentQueue defaultQueue] addPayment:payment];}- (void)requestProUpgradeProductData{ NSLog(@"------请求升级数据---------"); NSSet *productIdentifiers = [NSSet setWithObject:@"com.productid"]; SKProductsRequest* productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers]; productsRequest.delegate = self; [productsRequest start];}//弹出错误信息- (void)request:(SKRequest *)request didFailWithError:(NSError *)error{ NSLog(@"-------弹出错误信息----------"); UIAlertView *alerView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Alert",NULL) message:[error localizedDescription] delegate:nil cancelButtonTitle:NSLocalizedString(@"Close",nil) otherButtonTitles:nil]; [alerView show];}-(void) requestDidFinish:(SKRequest *)request{ NSLog(@"----------反馈信息结束--------------");}-(void) PurchasedTransaction: (SKPaymentTransaction *)transaction{ NSLog(@"-----PurchasedTransaction----"); NSArray *transactions =[[NSArray alloc] initWithObjects:transaction, nil]; [self paymentQueue:[SKPaymentQueue defaultQueue] updatedTransactions:transactions];}//<SKPaymentTransactionObserver> 千万不要忘记绑定,代码如下://----监听购买结果//[[SKPaymentQueue defaultQueue] addTransactionObserver:self];- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions//交易结果{ NSLog(@"-----paymentQueue--------"); for (SKPaymentTransaction *transaction in transactions) { switch (transaction.transactionState) { case SKPaymentTransactionStatePurchased:{//交易完成 [self completeTransaction:transaction]; NSLog(@"-----交易完成 --------"); UIAlertView *alerView = [[UIAlertView alloc] initWithTitle:@"" message:@"购买成功" delegate:nil cancelButtonTitle:NSLocalizedString(@"关闭",nil) otherButtonTitles:nil]; [alerView show]; } break; case SKPaymentTransactionStateFailed://交易失败 { [self failedTransaction:transaction]; NSLog(@"-----交易失败 --------"); UIAlertView *alerView2 = [[UIAlertView alloc] initWithTitle:@"提示" message:@"购买失败,请重新尝试购买" delegate:nil cancelButtonTitle:NSLocalizedString(@"关闭",nil) otherButtonTitles:nil]; [alerView2 show]; }break; case SKPaymentTransactionStateRestored://已经购买过该商品 [self restoreTransaction:transaction]; NSLog(@"-----已经购买过该商品 --------"); case SKPaymentTransactionStatePurchasing: //商品添加进列表 NSLog(@"-----商品添加进列表 --------"); break; default: break; } }}- (void) completeTransaction: (SKPaymentTransaction *)transaction{ 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];}} // Remove the transaction from the payment queue. [[SKPaymentQueue defaultQueue] finishTransaction: transaction];}//记录交易-(void)recordTransaction:(NSString *)product{ NSLog(@"-----记录交易--------");}//处理下载内容-(void)provideContent:(NSString *)product{ NSLog(@"-----下载--------");}- (void) failedTransaction: (SKPaymentTransaction *)transaction{ NSLog(@"失败"); if (transaction.error.code != SKErrorPaymentCancelled) { } [[SKPaymentQueue defaultQueue] finishTransaction: transaction];}-(void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentTransaction *)transaction{}- (void) restoreTransaction: (SKPaymentTransaction *)transaction{ 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; }}- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { NSLog(@"test");}-(void)dealloc{ [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];//解除监听}@end
2016/11/22更新
内购项目不再是单独提交审核了,只要app提交审核内购项目自然跟着改变状态,不消耗物品请不要选择 托管那一项,不然会出现问题
作者:Bison
链接:http://www.jianshu.com/p/86ac7d3b593a
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
阅读全文
0 0
- ios应用/游戏内购接入方法
- Unity3d接入IOS内购
- unity接入ios内购
- Windows商店应用内购接入
- iOS开发笔记(5)---- 应用内接入Apple Pay
- ios的apple应用内支付 接入app
- 接入 iOS 10.3「应用内评分」新特性
- iOS 应用内购(内付费)
- iOS应用内支付(内购)
- iOS开发笔记(6)---- 应用内接入银联ApplePay
- iOS 应用内购(iAP)
- iOS 应用内购(iAP)
- IOS应用内购功能
- 为iOS应用/游戏内建购买项目(IAP)
- Apple Pay线上支付的流程和app应用内接入的方法
- Unity3D-应用内打开AppStore某个应用详情方法(iOS应用内下载、应用内评星)
- iOS应用内购常见问题及注意事项
- iOS 应用内跳转到应用程序的方法!
- Socket,非阻塞,fcntl
- Log4j MDC使用案例
- Leetcode#53: Maximum Subarray
- jquery通过参数给select设置默认值
- Java类加载机制
- ios应用/游戏内购接入方法
- HTML中块状元素/内联元素的种类和区分
- pom.xml配置
- 常见Java面试题
- 浅谈MySQL中优化sql语句查询常用的30种方法
- 如何用深度学习来写歌词(神经网络实现)
- EL表达式不能使用
- [主席树维护HASH] Codechef. Cloning
- c#连接Oracle11g数据库(无需安装客户端)