项目里面要接苹果支付,结果我研究了一个小时的apple pay,结果经理说是苹果内购,当时就感觉被耍了!好了,那就说说In-App Purchase这个吧,前面所有的准备工作经理做完了,我只是码代码,结果购买的回调都执行,就是界面啥反应都没有,不知道是前期的工作没做好,还是我的代码有问题?上代码:
第一步,导入头文件签协议
#import <StoreKit/StoreKit.h>
@interface VIPViewController ()<SKPaymentTransactionObserver,SKProductsRequestDelegate>
{
NSInteger _index;
}
第二步,选择需要购买的商品,并请求商品信息
- (void)pushApplePay:(NSInteger)index{
_index = index;
VipDataHandle *handle = [VipDataHandle sharedInstence];
if([SKPaymentQueue canMakePayments]){
[self requestProductData:handle.products[index]];
}else{
NSLog(@"不允许程序内付费");
}
}
- (void)requestProductData:(NSString *)type{
NSLog(@"-------------请求对应的产品信息----------------");
NSArray *product = [[NSArray alloc] initWithObjects:type,nil];
NSSet *nsset = [NSSet setWithArray:product];
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset];
request.delegate = self;
[request start];
}
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
NSLog(@"--------------收到产品反馈消息---------------------");
NSArray *product = response.products;
if([product count] == 0){
NSLog(@"--------------没有商品------------------");
return;
}
NSLog(@"productID:%@", response.invalidProductIdentifiers);
NSLog(@"产品付费数量:%ld",[product count]);
SKProduct *p = nil;
for (SKProduct *pro in product) {
NSLog(@"description:%@", [pro description]);
NSLog(@"localizedTitle:%@", [pro localizedTitle]);
NSLog(@"localizedDescription:%@", [pro localizedDescription]);
NSLog(@"price:%@", [pro price]);
NSLog(@"productIdentifier:%@", [pro productIdentifier]);
if([pro.productIdentifier isEqualToString:[VipDataHandle sharedInstence].products[_index]]){
p = pro;
}
}
SKPayment *payment = [SKPayment paymentWithProduct:p];
NSLog(@"发送购买请求");
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error{
NSLog(@"------------------错误-----------------:%@", error);
}
- (void)requestDidFinish:(SKRequest *)request{
NSLog(@"------------反馈信息结束-----------------");
}
-(void) PurchasedTransaction: (SKPaymentTransaction *)transaction{
NSLog(@"-----PurchasedTransaction----");
NSArray *transactions =[[NSArray alloc] initWithObjects:transaction, nil];
[self paymentQueue:[SKPaymentQueue defaultQueue] updatedTransactions:transactions];
}
第三步,监听购买状态
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
for (SKPaymentTransaction *transaction in transactions){
switch (transaction.transactionState){
case SKPaymentTransactionStatePurchased:
NSLog(@"transactionIdentifier = %@", transaction.transactionIdentifier);
[self completeTransaction:transaction];
break;
case SKPaymentTransactionStateFailed:
[self failedTransaction:transaction];
break;
case SKPaymentTransactionStateRestored:
[self restoreTransaction:transaction];
break;
case SKPaymentTransactionStatePurchasing:
NSLog(@"商品添加进列表");
break;
default:
break;
}
}
}
- (void)completeTransaction:(SKPaymentTransaction *)transaction {
NSString * productIdentifier = transaction.payment.productIdentifier;
if ([productIdentifier length] > 0) {
NSLog(@"验证购买");
}
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
- (void)failedTransaction:(SKPaymentTransaction *)transaction {
if(transaction.error.code != SKErrorPaymentCancelled) {
NSLog(@"购买失败");
} else {
NSLog(@"用户取消交易");
}
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
- (void)restoreTransaction:(SKPaymentTransaction *)transaction {
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
第四步,拿到苹果返回来的票据去请求自己的服务器,校验是否正确
- (void)checkPay:(NSNotification *)note{
[self appRequest:note.userInfo[@"appleData"]];
}
- (void)appRequest:(NSString *)appleData{
InAppPayStore *store = [[InAppPayStore alloc]init];
store.delegate = self;
store.uid = userId;
store.appleData = appleData;
[store request];
}
- (void)success{
NSLog(@"支付成功");
}
- (void)failure:(NSString *)error{
NSLog(@"支付失败");
}
代码就是按照上面做的,请求返回的商品id也有,添加购买后,状态就是添加购买,始终在界面上啥都不显示,我也是醉了!当然了后面的票据校验还没做,前面的还没通后面没法做的,换了部手机就可以跳出支付界面,现在还在找原因
大神路过看看哈,请教