哈喽,大家好,么么哒!今天天气真是异常的热啊!出去走走都要热晕了,今天呢就开始我们的苹果支付啦,下面开始。
苹果支付分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];
}上面的代码呢就是整个支付的流程和逻辑也不难,但是需要你细心去理解和看一下。
                                                             我是大嫂,爱你们的大嫂!!!

海外SDK之----------苹果支付相关推荐

  1. 海外SDK之----------韩国支付onestore

    今天给大家来一个比较简单的韩国本土支付,难度一般般吧,主要是没有任何的中文文档啊,全英文啊,我英文又特别渣啊,结果我又让运营搞个简单的翻译过来,为什么写这个呢,就是因为支付流程曲折,没有任何官方中文文 ...

  2. 苹果支付和ios安全 - 你需要知道的

    2019独角兽企业重金招聘Python工程师标准>>> 移动支付看起来将成为2015年的定义技术之一,因为苹果公司的推出推动了无刷支付的繁荣 - 无论是苹果自己的系统还是对手都在追赶 ...

  3. 苹果支付:如何解决沙盒环境下获取可恢复购买项为空

    在传统手游开发中免不了和苹果支付打交道,而且苹果也会有各种奇奇怪怪的问题和BUG . 曾经有一次某一个游戏出现了调单问题,现象如下(我有点懒,不想画泳道图或者时序图): 客户端拉起支付付款成功,OC底 ...

  4. 苹果支付返回html,苹果应用内支付,服务器端的实现

    苹果支付的逻辑如下首先客户端先请求苹果支付中心,支付中心返回给客户端一堆加密的数据. 然后客户端把这段加密的数据 base64之后传给后端. 最后由后端再去请求苹果支付中心来验证这次购买是否成功.验证 ...

  5. 苹果支付成功后,JAVA服务端二次验证

    原理简述: 苹果客户端在完成应用购买,下单后支付,苹果后台会给客户端返回信息,用来验证支付结果: 客户端在拿到返回值后,将指定返回值,通过接口形式请求应用服务器,应用服务器根据这个值调用苹果服务器进行 ...

  6. 开源PHP微信通用sdk,支持微信支付及所有基础接口(强烈推荐)

    PHP微信通用sdk,支持微信支付及所有基础接口 WeChatDeveloper for PHP 功能描述 技术帮助 代码仓库 文件说明(后缀会根据官方文档增加文件) 安装使用 微信支付 支付宝支付 ...

  7. 苹果支付(内购项目)回调验证

    返回的加密参数-苹果支付返回的参数 $receipt_data="MIIbWQYJKoZIhvcNAQcCoIIbSjCCG0YCAQExCzAJBgUrDgMCGgUA......&quo ...

  8. 苹果支付验证回执单相关错误码

    苹果支付错误码 类型: status 可能值 21000: 未使用HTTP POST请求方法向App Store发送请求. 21001: 此状态代码不再由App Store发送. 21002: rec ...

  9. python苹果支付(服务端)自动订阅版

    苹果支付分为沙盒环境和生产环境 苹果验单逻辑 苹果支付过程中离不开一个东西--receipt(凭证) 服务端接收APP发送的凭证 服务端拿着凭证到苹果的服务器验单(沙盒.生产) 服务端解析苹果服务器返 ...

最新文章

  1. CF1B Spreadsheets
  2. php mvc单入口搭建,PHP实现MVC开发最简单方法是单点入口
  3. c++协程1 (boost::coroutine)
  4. Storm概念学习系列之storm的特性
  5. MacBook/MacOS/Mac OS 查看进程/端口信息的相关命令
  6. Java设计模式笔记(6)观察者模式
  7. Python刷题-4
  8. (38)FPGA面试题Verilog设计计数器
  9. css案例学习之并集选择器
  10. USB学习笔记--USB枚举过程
  11. 未来全世界油气的发展之路
  12. 各类数据库数字与文本转换
  13. mysql 创建 unique key_MySQL-创建表时一起使用时,“ PRIMARY KEY”,“ UNIQUE KEY”和“ KEY”的含义...
  14. windows下ping特定端口
  15. 走进GBase 8s之高可用功能(二)HAC灾备高可用
  16. AIO 模拟量采集 电路
  17. python怎么改字体大小_如何使用python在excel中更改字体大小
  18. canvas离线画板画图
  19. 三菱PLC曝出严重漏洞,面临黑客远程攻击
  20. 13、python网络编程之网络通信协议

热门文章

  1. Linux如何测试驱动性能,掌握 Linux PC 性能之基准测试
  2. 100年量子计算风云史,“量子比特”何时统治世界?| 技术特稿
  3. 计算机无法完成更新如何处理,Win10更新过程中碰到“无法完成更新”怎么办
  4. javaweb——jsp(jsp的本质是什么、jsp九大内置对象、四个域对象、jsp的主要作用)
  5. 音乐智能推荐 ALS算法
  6. Challenge Growth —— 从这里开始
  7. 直方图均衡化背后的数学
  8. linux网桥实现代码走读
  9. OPENGL ES 2.0 知识串讲(2)――EGL详解
  10. Unity根据文字内容自动滚动显示最新文字