哈喽,大家好,么么哒!今天天气真是异常的热啊!出去走走都要热晕了,今天呢就开始我们的苹果支付啦,下面开始。
苹果支付分2种,1是什么银联类型的支付 2是应用内支付( In-Aopp Purchase 支付)。今天给大家讲的是第二种,因为我们是游戏哟。首先你还是要去 在iTunes Connect后台添加应用,并配置你的应用和商品,其中也是老一套也是有消耗商品和非消耗商品,当然商品ID不能重复,目前这个我还没有亲自去申请过哈,我也是在网上在找的一些资料,这里呢转载一个网址 http://www.jianshu.com/p/53016c66dfbb 。等到你一切都配置好了以后,额,恩,啊,我们就开始写代码了。
=============支付账户须知============
在支付前呢,你需要把你的账户添加到后台的沙盒测试账户里面,
不然会无法支付 无法支付 无法支付 !!!
============导入支付的FrameWorks=========
现在的支付都集成在这个包里面了。支付的代码都在里面。
比如这个一眼就能看出来全是支付所需要的东西,什么类啊之类的。
下面呢我就以我项目已经在appstore上线的代码给大家讲解这个ios 支付
======IOS Pay支付初始化=====
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
这个呢就是游戏初始化呢,你要给支付添加一个观察者的类似代理的东西
=======以下是代码逻辑解析======
=========全局变量======
NSString *productID; //商品ID
float price; //价格
productID 也就是你从iTunes Connect 后台申请的商品ID
// 自己从写的支付函数
- (void) Pay:(NSDictionary *)params
{
// 这里有一段 从params取出正确的商品ID赋值给 productID
//需要你自己去处理逻辑
// 开始购买
[self purchaseFunc:productID];
}
/*购买逻辑 判断你有没有未完成的交易有的话呢处理 直接去
请求当前的商品ID信息*/
- (IBAction)purchaseFunc:(id)sender {
if([SKPaymentQueue canMakePayments]){
NSArray* transactions = [SKPaymentQueue defaultQueue].transactions;
//检测是否有未完成的交易
NSLog(@"有未完成交易 %i 笔",transactions.count);
if (transactions.count > 0) {
for(SKPaymentTransaction *tran in transactions){
switch (tran.transactionState) {
case SKPaymentTransactionStatePurchased:
NSLog(@"结束未完成的交易,购买完成");
[[SKPaymentQueue defaultQueue] finishTransaction:tran];
break;
case SKPaymentTransactionStatePurchasing:
NSLog(@"结束未完成的交易,购买中");
break;
case SKPaymentTransactionStateRestored:
NSLog(@"结束未完成的交易,购买恢复");
// [[SKPaymentQueue defaultQueue] finishTransaction:tran];
break;
case SKPaymentTransactionStateFailed:
if (tran.error.code != SKErrorPaymentCancelled) {
NSLog(@"结束未完成的交易,购买失败");
// [[SKPaymentQueue defaultQueue] finishTransaction:tran];
}else {
NSLog(@"结束未完成的交易,购买取消");
[[SKPaymentQueue defaultQueue] finishTransaction:tran];
}
break;
default:
break;
}
}
}
[self requestProductData:productID];
}else{
NSLog(@"不允许程序内付费");
}
}
/*请求商品*/
/* 这里呢添加了一个我们收到信息的回调
request.delegate = self;
到时候就会收到回调信息
*/
- (void)requestProductData:(NSString *)type{
NSLog(@"-------------请求对应的产品信息 %@----------------",type);
NSArray *product = [[NSArray alloc] initWithObjects:type, nil];
NSSet *nsset = [NSSet setWithArray:product];
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset];
request.delegate = self;
[request start];
}
SKProduct *product;
//收到产品返回信息后 这里会发送请求购买
/*
这里需要注意的是 product 是一个结构体指针 里面包含了
NSLog(@"%@", [pro description]);
NSLog(@"%@", [pro localizedTitle]);
NSLog(@"%@", [pro localizedDescription]);
NSLog(@"%@", [pro price]);
NSLog(@"%@", [pro priceLocale]);
NSLog(@"%@", [pro productIdentifier]);
这一系列东西 不是一个单纯的订单ID
[[SKPaymentQueue defaultQueue] addPayment:payment];
*/
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
NSLog(@"--------------收到产品反馈消息---------------------");
NSArray *products = response.products;
if([products count] == 0){
NSLog(@"--------------没有商品------------------");
return;
}
NSLog(@"productID:%@", response.invalidProductIdentifiers);
NSLog(@"产品付费数量:%d",[products count]);
for (SKProduct *pro in products) {
NSLog(@"%@", [pro description]);
NSLog(@"%@", [pro localizedTitle]);
NSLog(@"%@", [pro localizedDescription]);
NSLog(@"%@", [pro price]);
NSLog(@"%@", [pro priceLocale]);
NSLog(@"%@", [pro productIdentifier]);
if([pro.productIdentifier isEqualToString:productID]){
product = pro;
}
}
SKPayment *payment = [SKPayment paymentWithProduct:product];
NSLog(@"发送购买请求");
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
//请求失败
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error{
NSLog(@"------------------错误-----------------:%@", error);
}
- (void)requestDidFinish:(SKRequest *)request{
NSLog(@"------------反馈信息结束-----------------");
}
//监听购买结果
/*
这里面呢包括支付失败成功的逻辑处理
*/
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction{
for(SKPaymentTransaction *tran in transaction){
switch (tran.transactionState) {
case SKPaymentTransactionStatePurchased:{
[self completeTransaction:tran]; // 购买成功
break;}
case SKPaymentTransactionStatePurchasing:
NSLog(@"purchasing...");
break;
case SKPaymentTransactionStateRestored:
[self restoreTransaction:tran];
break;
case SKPaymentTransactionStateFailed:
if (tran.error.code != SKErrorPaymentCancelled) {
NSLog(@"An error encounterd");
[self failedTransaction:tran];
}
else {
NSLog(@"Cancelled!");
[[SKPaymentQueue defaultQueue] finishTransaction: tran];
}
break;
default:
break;
}
}
}
// 完成交易即购买成功
/* 这里呢是完成交易也就是支付成功
你可以在这个函数里面去你的服务器验证
*/
- (void)completeTransaction:(SKPaymentTransaction *)transaction {
NSLog(@"completeTransaction...");
[self provideContent: transaction.payment.productIdentifier];
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
// 服务器验证的地方 写在这里
}
// 恢复交易
- (void)restoreTransaction:(SKPaymentTransaction *)transaction {
NSLog(@"restoreTransaction...");
[self provideContent: transaction.originalTransaction.payment.productIdentifier];
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
// 交易失败
- (void)failedTransaction:(SKPaymentTransaction *)transaction {
if (transaction.error.code != SKErrorPaymentCancelled)
{
NSLog(@"Transaction error: %@", transaction.error.localizedDescription);
}
[[NSNotificationCenter defaultCenter] removeObserver:self name:kProductPurchaseFailedNotification object:transaction];
[[NSNotificationCenter defaultCenter] postNotificationName:kProductPurchaseFailedNotification object:transaction];
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
// 提供支付内容信息
- (void)provideContent:(NSString *)productIdentifier {
NSLog(@"Toggling flag for: %@", productIdentifier);
[[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:productIdentifier];
[[NSUserDefaults standardUserDefaults] synchronize];
[[NSNotificationCenter defaultCenter] postNotificationName:kProductPurchasedNotification object:productIdentifier];
}
// 移除支付观察者
- (void)dealloc{
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}
上面的代码呢就是整个支付的流程和逻辑也不难,但是需要你细心去理解和看一下。
我是大嫂,爱你们的大嫂!!!