导入头文件#import

遵循协议

[[SKPaymentQueue defaultQueue] addTransactionObserver:self];// 4.设置支付服务

-(void)starBuyToAppStore:(NSString *)goodsID{    if ([SKPaymentQueue canMakePayments]) {//5.判断app是否允许apple支付              [self getRequestAppleProduct:goodsID];// 6.请求苹果后台商品            } else {//        NSLog(@"not");    }}

#pragma mark ------ 请求苹果商品- (void)getRequestAppleProduct:(NSString *)goodsID{    self.goodsId = goodsID;//把前面传过来的商品id记录一下,下面要用    // 7.这里的com.czchat.CZChat01就对应着苹果后台的商品ID,他们是通过这个ID进行联系的。    NSArray *product = [[NSArray alloc] initWithObjects:goodsID,nil];    NSSet *nsset = [NSSet setWithArray:product];        //SKProductsRequest参考链接:https://developer.apple.com/documentation/storekit/skproductsrequest    //SKProductsRequest 一个对象,可以从App Store检索有关指定产品列表的本地化信息。    SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset];// 8.初始化请求    request.delegate = self;    [request start];// 9.开始请求}

// 10.接收到产品的返回信息,然后用返回的商品信息进行发起购买请求- (void) productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{    NSArray *product = response.products;        if([product count] == 0){//如果服务器没有产品        return;    }        SKProduct *requestProduct = nil;    for (SKProduct *pro in product) {//        NSLog(@"%@", [pro description]);//        NSLog(@"%@", [pro localizedTitle]);//        NSLog(@"%@", [pro localizedDescription]);//        NSLog(@"%@", [pro price]);//        NSLog(@"%@", [pro productIdentifier]);        // 11.如果后台消费条目的ID与我这里需要请求的一样(用于确保订单的正确性)        if([pro.productIdentifier isEqualToString:self.goodsId]){            requestProduct = pro;        }    }    // 12.发送购买请求,创建票据  这个时候就会有弹框了    SKPayment *payment = [SKPayment paymentWithProduct:requestProduct];    [[SKPaymentQueue defaultQueue] addPayment:payment];//将票据加入到交易队列    }

// 13.监听购买结果- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction{    if (self.delegate && [self.delegate respondsToSelector:@selector(EMAppStorePay:responseAppStorePayStatusshow:error:)]) {        [self.delegate EMAppStorePay:self responseAppStorePayStatusshow:@{@"value":transaction} error:nil];    }    for(SKPaymentTransaction *tran in transaction){//        NSLog(@"%@",tran.payment.applicationUsername);        switch (tran.transactionState) {            case SKPaymentTransactionStatePurchased:{//                NSLog(@"交易完成");                // 购买后告诉交易队列,把这个成功的交易移除掉。                //走到这就说明这单交易走完了,无论成功失败,所以要给它移出。finishTransaction                [self completeTransaction:tran];//这儿出了问题抛异常,导致下面一句代码没执行                [[SKPaymentQueue defaultQueue] finishTransaction:tran];                            }                break;                            case SKPaymentTransactionStatePurchasing://                NSLog(@"商品添加进列表");                break;                            case SKPaymentTransactionStateRestored://                NSLog(@"已经购买过商品");                [[SKPaymentQueue defaultQueue] finishTransaction:tran];                break;                            case SKPaymentTransactionStateFailed://                NSLog(@"交易失败");                [[SKPaymentQueue defaultQueue] finishTransaction:tran];                break;                            case SKPaymentTransactionStateDeferred://                NSLog(@"交易还在队列里面,但最终状态还没有决定");                break;                            default:                break;        }            }    }

#pragma mark ------ 支付完成,得到交易凭证- (void)completeTransaction:(SKPaymentTransaction *)transaction{        //此时告诉后台交易成功,并把receipt传给后台验证    NSString *transactionReceiptString= nil;    //系统IOS7.0以上获取支付验证凭证的方式应该改变,切验证返回的数据结构也不一样了。    // 验证凭据,获取到苹果返回的交易凭据    // appStoreReceiptURL iOS7.0增加的,购买交易完成后,会将凭据存放在该地址    NSURLRequest *appstoreRequest = [NSURLRequest requestWithURL:[[NSBundle mainBundle] appStoreReceiptURL]];    NSError *error = nil;    // 从沙盒中获取到购买凭据        NSData * receiptData = [NSURLConnection sendSynchronousRequest:appstoreRequest returningResponse:nil error:&error];    // 20 BASE64 常用的编码方案,通常用于数据传输,以及加密算法的基础算法,传输过程中能够保证数据传输的稳定性 21 BASE64是可以编码和解码的 22    transactionReceiptString = [receiptData base64EncodedStringWithOptions:0];//[receiptData base64EncodedStringWithOptions:0];    //    NSLog(@"requestContentstr:%@",[receiptData base64EncodedStringWithOptions:0]);        //    NSDictionary *dic = @{@"orderCode":self.dataOrder.orderCode,    //                          @"receipt":transactionReceiptString,    //                          @"category":@"1"    //                          };    //    NSLog(@"diczhi:%@",dic);    //    //    self.tran = transaction;    //    [self.bizEBeanBuy requestAppStorePaySuccessCallBack:dic];//苹果支付成功,传receipt-data给后台验证             [[SKPaymentQueue defaultQueue] finishTransaction:transaction];    }

java ios内购凭证_iOS内购看我就够了(含代码)相关推荐

  1. java ios des加密解密_IOS、java支持DES加密

    转载请注明博客地址:http://blog.csdn.net/mengxiangyue/article/details/40015727 近期在考虑数据加密方面的需求,所以对数据加密简单的看了一下,当 ...

  2. java ios中无法播放_iOS - 无法在后台播放声音

    我正在尝试实现一个类似闹钟的系统,以便在事件发生时提醒手机(在我的情况下是蓝牙事件) . 即使手机处于静音和后台,我也希望发出此警报 . 我创建了一个本地通知,但如果手机处于静音模式,我就无法播放声音 ...

  3. [Java 并发编程实战] 设计线程安全的类的三个方式(含代码)

    发奋忘食,乐以忘优,不知老之将至.---<论语> 前面几篇已经介绍了关于线程安全和同步的相关知识,那么有了这些概念,我们就可以开始着手设计线程安全的类.本文将介绍构建线程安全类的几个方法, ...

  4. Java项目校园兼职平台(三层架构+设计模式重构版)(含代码)

    一.与上一版的区别 使用了单例模式.外观模式.模板方法模式 和 druid连接池 相较于项目二,提供了又一个新的角色,发布兼职人员.他的角色就相当于公司的招聘人员,可以根据公司需求,去这个平台上发布自 ...

  5. ios 内购正式环境_iOS 内购最新讲解

    本文为CocoaChina网友IIronMan投稿 一.总说内购的内容协议.税务和银行业务 信息填写 内购商品的添加 添加沙盒测试账号 内购代码的具体实现 内购的注意事项 二.协议.税务和银行业务 信 ...

  6. ios 内购正式环境_iOS内购-部分玩家无法恢复购买

    起因是这样,自去年12月份,就陆续有玩家反馈以下问题购买了商品,却无法获得,也无法恢复购买 兑换码无法兑换到商品 重现:在设备1上兑换了A商品,恢复购买和再次免费购买,是无效的,而在设备2上用同一个账 ...

  7. ios内购二次验证安全性问题_iOS 内购遇到的坑

    一.内购沙盒测试账号在支付成功后,再次购买相同 ID 的物品,会提示如下内容的弹窗.您以购买过此APP内购项目,此项目将免费恢复 您以购买过此APP内购项目,此项目将免费恢复.PNG 原因: 当使用内 ...

  8. iOS In-App Purchase 内购之创建内购产品

    Creating In-App Purchase Products 在应用程序内购买,您可以直接在你的免费或付费的应用程序出售各种虚拟物品.本章介绍了应用程序内购买的产品类型,并告诉您如何将其配置在i ...

  9. java遇上html,JAVA遇见HTML——JSP篇:JSP内置对象(上)

    JSP九大内置对象 JSP内置对象是Web容器创建的一组对象,不使用new关键就可以使用的内置对象. int[] value={60,70,80}; for(int i:value){ out.pri ...

最新文章

  1. java常用的集合对象_java常用实体类、集合类
  2. python保存模型与参数_如何导出python中的模型参数
  3. 《LeetCode力扣练习》剑指 Offer 05. 替换空格 Java
  4. AspNet MVC与T4,我定制的视图模板
  5. 陕西中小企业促进局 e-mail_重点注意2020陕西工程师职称评审破格指南
  6. 漫说中介者模式--创业公司成长记
  7. oracle的SCN和Checkpoint_Change#的关系
  8. Node的异步与java的异步_node.js和异步编程回文
  9. linux安全与优化
  10. vue高拍仪拍照后上传服务器回显到Upload(记录)
  11. kernal tch 下载 天正_tch_kernal.arx
  12. TCP协议——SYN/ACK的使用以及滑动窗口机制
  13. 2012年的Android之旅:梦想、学习、坚持、自信、淡定
  14. 2011年计算机类会议汇总
  15. (4)Artemis支持的协议
  16. php使用grpc简单教程
  17. 傅里叶变化(一)—— 复数
  18. 写作经典中的经典——《文心》的读后感作文3600字
  19. Zookeeper+Dubbox 环境搭建日记
  20. 牛客刷题篇:客似云来 和 剪花布条(Java)

热门文章

  1. java归一化方法_Java之Normalizer(归一化)
  2. 调度算法——先来先服务(FCFS)、短作业优先(SJF)、高响应比优先(HRRN) 例题详细!!!
  3. iptables详解及实例
  4. 【Unity入门】资源包导入和导出
  5. django 进行国际化及在后台进行中英文切换
  6. 张小龙谈移动互联网产品设计原则
  7. 数字化、智能化将成为未来经济发展的主流
  8. 灰度GBTC自2015年来首次出现负溢价,如何解读?
  9. 零基础入门数据挖掘——二手车交易价格预测:baseline
  10. HU5913芯片资料