在內(nèi)購項(xiàng)目中的那些奇葩事
一、 首先就是在自己的開發(fā)者賬號中設(shè)置的一些亂七八糟的東西,在我們公司這些東西都是運(yùn)營的哥哥姐姐們搞得,不過在其它的博客中也有詳細(xì)的說明,我也不再多說晦闰。
注意:在開始擼代碼的時(shí)候銀行卡的一些稅務(wù)信息必須是通過蘋果審核通過的,否則是無法擼代碼進(jìn)行測試的唉铜。
二、 接下來就是搞代碼的時(shí)候了:
1农渊、 #import <StoreKit/StoreKit.h>導(dǎo)入文件
2贝或、 <SKPaymentTransactionObserver,SKProductsRequestDelegate,SKRequestDelegate>這些代理協(xié)議是必須遵守的
3芝发、 在你的充值控制器里面自定義自己的方法
/**
請求產(chǎn)品信息
@param product prodect
*/
-(void)requestProductData:(NSString *)product;
/**
是否允許購買
@param buy buy
*/
- (void)allowedBuy:(NSString *)buy;
/**
交易結(jié)果
@param queue queue
@param transactions ransactions
* /
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions;
/**
購買交易
@param transaction transaction
*/
-(void) PurchasedTransaction: (SKPaymentTransaction *)transaction;
/**
交易完成
@param transaction transaction
*/
- (void) completeTransaction: (SKPaymentTransaction *)transaction;
/**
交易失敗
@param transaction transaction
*/
- (void) failedTransaction: (SKPaymentTransaction *)transaction;
去實(shí)現(xiàn)這些方法
1.渡讼、在ViewDidLoad里面添加蘋果的監(jiān)聽
//添加蘋果支付監(jiān)聽
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
2骂束、 在dealloc里面接觸這個(gè)監(jiān)聽
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];//解除監(jiān)聽
3、 #pragma mark -- /*蘋果支付*/
/**
是否允許購買
@param buy buy
*/
- (void)allowedBuy:(NSString *)buy {
if ([SKPaymentQueue canMakePayments]) {
NSLog(@"允許程序內(nèi)購買此商品");
[self requestProductData:buy];
}else {
NSLog(@"不允許程序內(nèi)購買此商品");
}
}
/**
請求產(chǎn)品信息
@param product prodect
*/
-(void)requestProductData:(NSString *)product {
NSArray *productArray = @[product];
NSSet *productSet = [NSSet setWithArray:productArray];//集合
//開始請求
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:productSet];
request.delegate = self;
[request start];
}
/**
收到產(chǎn)品的反饋信息
@param request request
@param response response
*/
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
NSArray *myProduct = response.products;
SKProduct *p = nil;
for (SKProduct *product in myProduct) {
p = product;
}
SKPayment *payment = [SKPayment paymentWithProduct:p];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
/**
請求失敗
@param request request
@param error error
*/
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error {
[self.loading stop];
UIAlertController *alertController = [[UIAlertController alloc] init];
UIAlertAction *errorAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Alert", NULL) style:UIAlertActionStyleCancel handler:nil];
[alertController addAction:errorAction];
[self presentViewController:alertController animated:YES completion:nil];
}
/**
結(jié)束反饋
@param request request
*/
- (void)requestDidFinish:(SKRequest *)request {
NSLog(@"-----反饋結(jié)束-----");
}
/**
交易結(jié)果
@param queue queue
@param transactions ransactions
*/
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
for (SKPaymentTransaction *transaction in transactions)
{
switch (transaction.transactionState)
{
case SKPaymentTransactionStatePurchased: {//交易完成
[self completeTransaction:transaction];
}
break;
case SKPaymentTransactionStateFailed: {
//交易失敗
[self failedTransaction:transaction];
}
break;
case SKPaymentTransactionStateRestored: {
}
break;
case SKPaymentTransactionStatePurchasing: //商品添加進(jìn)列表
break;
default:
break;
}
}
}
/**
購買交易
@param transaction transaction
*/
-(void) PurchasedTransaction: (SKPaymentTransaction *)transaction {
NSLog(@"-----購買交易----");
NSArray *transactions =[[NSArray alloc] initWithObjects:transaction, nil];
[self paymentQueue:[SKPaymentQueue defaultQueue] updatedTransactions:transactions];
}
/**
交易完成
@param transaction transaction
*/
- (void) completeTransaction: (SKPaymentTransaction *)transaction {
NSURL *recepitURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSData *receipt = [NSData dataWithContentsOfURL:recepitURL];
NSDictionary *requestContents = @{
@"receipt": [receipt base64EncodedStringWithOptions:0]
};
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
/*中間在這個(gè)地方做二次驗(yàn)證,可以去服務(wù)器驗(yàn)證也可以在客戶端完成驗(yàn)證,建議在服務(wù)器驗(yàn)證(但是時(shí)間稍微慢一點(diǎn)) 根據(jù)個(gè)人需求吧 */
}
/**
交易失敗
@param transaction transaction
*/
- (void) failedTransaction: (SKPaymentTransaction *)transaction {
[self.loading stop];
if (transaction.error.code != SKErrorPaymentCancelled)
{
}
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
特別注意:
1成箫、 在提交審核的時(shí)候App內(nèi)購項(xiàng)目的產(chǎn)品名稱建議統(tǒng)一化,包括在購買界面的顯示問題展箱。否則被蘋果打回的可能性非常高??
2、 記得在內(nèi)購的地方上傳內(nèi)購的照片,有的app上傳的是購買列表的照片,有的app是上傳的購買成功的照片蹬昌。
3析藕、 具體是哪一張后續(xù)繼續(xù)更新??