我得实现思路是:1,首先点击按钮,调用拉取商品信息,2,在苹果写好的接收响应函数里对应用户点击的购买类型发起购买操作。…
问题出在:
购买: 第一次购买,流程完全正确;第二次购买,则走了2次购买,第三次购买,则走了3次购买…
取消购买: 情况也是这样子。
调用日志:
不知具体哪步出错了,还望大神帮忙检查下,代码如下:
#import "SSBuyGoldCoinsViewController.h"
#include "PurchaseManager.h"
#include "cocos2d.h"
USING_NS_CC;
#define COMMODITY6 0
#define COMMODITY12 1
#define COMMODITY24 2
#define ProductID_IAP6 @"U170001" // 6元
#define ProductID_IAP12 @"U170002" // 12元
#define ProductID_IAP18 @"U170003" // 18元
@interface SSBuyGoldCoinsViewController ()
@end
@implementation SSBuyGoldCoinsViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = ;
if (self)
{
addTransactionObserver:self];
}
return self;
}
- (void)viewDidLoad
{
;
}
// 点击购买按钮后的回调判断点击到得是哪个购买按钮
// 在PurchaseManager类中被调用
- (void)SSGetProductInfo:(int)type
{
NSLog(@"<------- 开始购买判断购买类型 -------->");
NSArray *product = nil;
ssCommodityType = type;
switch (type) {
case COMMODITY6:
product = initWithObjects:ProductID_IAP6,nil];
break;
case COMMODITY12:
product = initWithObjects:ProductID_IAP12,nil];
break;
case COMMODITY24:
product = initWithObjects:ProductID_IAP18,nil];
break;
default:
break;
}
//使用我们的Product ID来初始化它
NSSet * set = ;
SKProductsRequest * request = initWithProductIdentifiers:set];
//设置本身为代理
request.delegate = self;
//启动
;
;
}
// 以上查询的回调函数
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
NSLog(@"<--------- 根据ID发起购买 ----------->");
NSArray * skProducts = response.products;
for (SKProduct * skProduct in skProducts) {
NSLog(@"Found product: %@ %@ %0.2f",
skProduct.productIdentifier,
skProduct.localizedTitle,
skProduct.price.floatValue);
}
NSArray *myProduct = response.products;
//NSLog(@"Product ID:%@\n",response.invalidProductIdentifiers);
//NSLog(@"Product count: %d\n", );
if (myProduct.count == 0)
{
CCMessageBox("无法获取产品信息,购买失败。","提 示!");
return;
}
SKPayment* payment = ];
addPayment:payment];
;
}
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
NSLog(@"<------------ 监听购买 -------------->");
for (SKPaymentTransaction *transaction in transactions)
{
switch (transaction.transactionState)
{
case SKPaymentTransactionStatePurchased://交易完成
NSLog(@"transactionIdentifier = %@", transaction.transactionIdentifier);
;
break;
case SKPaymentTransactionStateFailed://交易失败
;
break;
case SKPaymentTransactionStateRestored://已经购买过该商品
;
CCMessageBox("已经购买过该商品","提示");
break;
case SKPaymentTransactionStatePurchasing://商品添加进列表
NSLog(@"商品添加进列表");
break;
default:
break;
}
}
}
// 购买完后的回调
- (void)completeTransaction:(SKPaymentTransaction *)transaction
{
NSLog(@"<------------ 购买成功 ------------->");
NSString * productIdentifier = transaction.payment.productIdentifier;
// NSString * receipt = ;
if ( > 0)
{
PurchaseManager::sharedPurchaseManager()->addMoney(ssCommodityType);
}
// Remove the transaction from the payment queue.
finishTransaction: transaction];
}
// 购买失败的回调
- (void)failedTransaction:(SKPaymentTransaction *)transaction
{
NSLog(@"<------------ 购买失败 ------------->");
if(transaction.error.code != SKErrorPaymentCancelled)
{
CCMessageBox("交易失败","提示" );
} else
{
CCMessageBox("用户交易取消","提 示");
}
finishTransaction: transaction];
}
// 商品添加进列表的回调
- (void)restoreTransaction:(SKPaymentTransaction *)transaction {
NSLog(@"<------- 已经购买 -------->");
// 对于已购商品,处理恢复购买的逻辑
finishTransaction: transaction];
}
@end
```
代码格式不会调,附上代码截图:





