iOS开发 内购流程

时间:2021-02-23 03:25:59

一.向appStore提交资料

iOS开发 内购流程
第一步
iOS开发 内购流程
第二步
iOS开发 内购流程
第三步


操作完第三步然后记得保存

iOS开发 内购流程
第四步
iOS开发 内购流程
第五步

先点击Contact Info 的Set Up

iOS开发 内购流程
第六步
iOS开发 内购流程
第七步

都填写完记得保存,然后回到上一个页面

iOS开发 内购流程
第八步
iOS开发 内购流程
第九步
iOS开发 内购流程
第十步
iOS开发 内购流程
第十一步
iOS开发 内购流程
第十二步


进行十二步的时候可能有些银行通过苹果这个方法查不到,就需要借助百度了,一定要准确查询,否则会有问题。我这里推荐一个地址
https://e.czbank.com/CORPORBANK/query_unionBank_index.jsp

iOS开发 内购流程
第十三步


这一步需要注意的是,货币类型可能有歧义,看你是想收美元还是人民币了,都说美元合适。不过,我做的时候为了避免事情,还是选择了CNY,支持国产。还有一点,银行账号如果是对公的账号,需要填写公司的英文名称,如果没有的话,上拼音!然后点击保存银行信息就算ok了,然后退回到最开始的页面

iOS开发 内购流程
第十四步
iOS开发 内购流程
第十五步
iOS开发 内购流程
第十六步
iOS开发 内购流程
第十七步
iOS开发 内购流程
第十八步
iOS开发 内购流程
第十九步


这里要注意的是,虽然这个页面看起来要填写的信息很多,其实很多都没有什么卵用,都是对于美国那边什么法律需要配合的那些,一般咱们都不用,只需要把该勾选的地方勾选,然后提交就好了。

iOS开发 内购流程
第二十步
iOS开发 内购流程
第二十一步
iOS开发 内购流程
第二十二步

二.创建内购项目

iOS开发 内购流程
第一步
iOS开发 内购流程
第二步


根据自己app的需要选择类型,写的很详细,就不多说了

iOS开发 内购流程
第三步
iOS开发 内购流程
第四步
iOS开发 内购流程
第五步
iOS开发 内购流程
第六步

三、添加项目内购测试帐号

iOS开发 内购流程
第一步
iOS开发 内购流程
第二步

四、废话不多说,上代码

第一步导入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

后记

苹果内购还是有不少问题的,还是需要和后台多多配合,例如,购买的时候默认的是当前登录的苹果id付款,如果想切换到别的id就会出现问题。。原来也没有退款流程,现在可以退款了,

简书链接:http://www.jianshu.com/p/d9d742e82188