apple store appstore游戏内购退款款怎么添加多个收据

iOS开发(26)
1、内购流程
1、在 AppStore 中创建相应的物品,创建内购沙盒测试账号2、客户端从后台获取相应的物品 ID (当然也可以再客户端写死,但后期扩展性就受限制了)3、依据相应的物品 ID 请求商品的相关信息4、依据商品信息创建订单请求交易5、依据返回的订单状态处理交易结果6、请求后台再次验证订单状态7、依据后台返回结果处理相关逻辑
2、创建内购物品以及沙盒测试账号
已经有朋友写出了完善的教程,请参考如下链接,一步一步来就可以
3、客户端编写相关代码
再这里我把和支付相关的逻辑都抽取到了一个单例中,在最后贴上个人梳理的相关代码大家一起学习
4、做内购过程中遇到的坑
1、内购沙盒测试账号在支付成功后,再次购买相同 ID 的物品,会提示如下内容的弹窗。
您已购买此 App 内购买项目。此项目将免费恢复。
解决方法:在使用
[[SKPaymentQueue defaultQueue] addPayment:payment];
将支付信息添加进苹果的支付队列后,苹果会自动完成后续的购买请求,在用户购买成功或者点击取消购买的选项后回调
&- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)
方法返回响应的结果信息,在该方法内除了得到响应的支付信息编写自身的业务的代码外还要记得调用
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
方法通知苹果的支付队列该交易已经完成,否者就会已发起相同 ID 的商品购买就会有此项目将免费恢复的提示。
2、每次启动一个新的内购支付流程,刚发起的时候系统就会调用- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)这个方法,结果扰乱一部分的支付业务逻辑
在 SKPaymentQueue 被启动并且添加了 addObserver之后,如果其判断到有未完成的交易,会主动调用paymentQueue updatedTransactions 这个方法来继续完成相关的交易流程,所以如果在上面那种情况下得到结果后不去调用 finish 接口,下次重新开启支付流程就会检查未完成的支付并调用该接口。
解决方法:
1.在得到支付结果后及时调用 finish 方法
2.添加一个是否是新发起的支付流程的条件,在条件符合的情况下才触发应用的相关逻辑的代码
(PS:在拿到苹果的支付结果凭据的时候最好在客户端做一份持久化的数据备份,等待后台验证完成后再清除掉,避免出现验证中间出现问题导致用户支付成功但后台相关的增值处理没有完成导致用户金钱损失的问题)
3、如何区分购买物品的是 沙盒测试账号 还是 真实账号&
后台再验证支付凭据的时候要区分是沙盒测试账号购买的还是用户真实账号购买的,所以在传凭据的时候还需要告诉后台当前购买的账号性质。
解决方法:通过在配置文件中定义相关的宏定义并结合 Debug 与 Release 的编译环境确定相关的参数
// 苹果内购是否为沙盒测试账号,打开就代表为沙盒测试账号,注意上线时注释掉
#define APPSTORE_ASK_TO_BUY_IN_SANDBOX 1
// 生成订单参数,注意沙盒测试账号与线上正式苹果账号的验证途径不一样,要给后台标明
NSNumber *
#if (defined(APPSTORE_ASK_TO_BUY_IN_SANDBOX) && defined(DEBUG))
sandbox = @(0);
sandbox = @(1);
个人没有找到相关的方法可以打完包后动态的检测购买物品的账号性质,希望知道的朋友分享一下,感谢 ^_^
5、iOS7 客户端验证的订单状态
苹果在iOS7提升了购买凭据的安全性,可以直接单独在客户端完成订单正确性的验证,但是处于金钱考虑,购买完成后,建议还是要做凭据的后台验证工作。
#pragma mark 客户端验证购买凭据
- (void)verifyTransactionResult
// 验证凭据,获取到苹果返回的交易凭据
// appStoreReceiptURL iOS7.0增加的,购买交易完成后,会将凭据存放在该地址
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
// 从沙盒中获取到购买凭据
NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];
// 传输的是BASE64编码的字符串
BASE64 常用的编码方案,通常用于数据传输,以及加密算法的基础算法,传输过程中能够保证数据传输的稳定性
BASE64是可以编码和解码的
NSDictionary *requestContents = @{
@&receipt-data&: [receipt base64EncodedStringWithOptions:0]
// 转换为 JSON 格式
NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents
error:&error];
if (!requestData) { /* ... Handle error ... */ }
// 发送网络POST请求,对购买凭据进行验证
NSString *verifyUrlS
#if (defined(APPSTORE_ASK_TO_BUY_IN_SANDBOX) && defined(DEBUG))
verifyUrlString = @&https://sandbox./verifyReceipt&;
verifyUrlString = @&https://buy./verifyReceipt&;
// 国内访问苹果服务器比较慢,timeoutInterval 需要长一点
NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:[[NSURL alloc] initWithString:verifyUrlString] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0f];
[storeRequest setHTTPMethod:@&POST&];
[storeRequest setHTTPBody:requestData];
// 在后台对列中提交验证请求,并获得官方的验证JSON结果
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:storeRequest queue:queue
completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
if (connectionError) {
NSLog(@&链接失败&);
NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
if (!jsonResponse) {
NSLog(@&验证失败&);
// 比对 jsonResponse 中以下信息基本上可以保证数据安全
application_version
product_id
transaction_id
NSLog(@&验证成功&);
6、内购验证凭据返回结果状态码说明
苹果反馈的状态码:
21000 App Store无法读取你提供的JSON数据
21002 收据数据不符合格式
21003 收据无法被验证
21004 你提供的共享密钥和账户的共享密钥不一致
21005 收据服务器当前不可用
21006 收据是有效的,但订阅服务已经过期。当收到这个信息时,解码后的收据信息也包含在返回内容中
21007 收据信息是测试用(sandbox),但却被发送到产品环境中验证
21008 收据信息是产品环境中使用,但却被发送到测试环境中验证
更为详细的信息请参考
7、如何恢复购买
注:此部分内容后期再详细添加 ^_^
相关代码:
XYPayManager.h
XYPayManager.h
Created by 郑亚恒 on 15/11/2.
Copyright © 2015年 郑亚恒. All rights reserved.
#import &Foundation/Foundation.h&
// 苹果内购是否为沙盒测试账号,打开就代表为沙盒测试账号,注意上线时注释掉!!
#define APPSTORE_ASK_TO_BUY_IN_SANDBOX 1
typedef void(^payCompleteBlock)(NSDictionary *resultDic, BOOL isSuccess);
@interface XYPayManager : NSObject
+ (instancetype)sharedPayM
/// 苹果内购
- (void)requestAppleStoreProductDataWithString:(NSString *)productIdentifier payComplete:(payCompleteBlock)payCompletionB
/// 验证苹果支付订单凭证
- (void)checkAppStorePayResultWithBase64String:(NSString *)base64S
XYPayManager.m
XYPayManager.m
Created by 郑亚恒 on 15/11/2.
Copyright © 2015年 郑亚恒. All rights reserved.
#import &XYPayManager.h&
#import &StoreKit/StoreKit.h&
@interface XYPayManager() &SKPaymentTransactionObserver, SKProductsRequestDelegate&
// 苹果内购
@property (nonatomic, copy) NSString *appleProductI
@property (nonatomic, copy) payCompleteBlock payC
@property (nonatomic, assign) BOOL startBuyAppleP
@implementation XYPayManager
+ (instancetype)sharedPayManager {
static XYPayManager *payM
static dispatch_once_t once = 0;
dispatch_once(&once, ^{
payManager = [[XYPayManager alloc] init];
// 注册苹果内购
[[SKPaymentQueue defaultQueue] addTransactionObserver:payManager];
return payM
- (void)dealloc {
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
#pragma mark - 苹果支付充值
//请求商品
- (void)requestAppleStoreProductDataWithString:(NSString *)productIdentifier payComplete:(payCompleteBlock)payCompletionBlock {
if(![SKPaymentQueue canMakePayments]) {
NSLog(@&不允许程序内付费&);
[APPCONTEXT.hudHelper showHudOnWindow:@&不允许程序内付费& image:nil acitivity:NO autoHideTime:DEFAULTTIME];
NSLog(@&-------------请求对应的产品信息----------------&);
self.startBuyAppleProduct = YES;
self.payComplete = payCompletionB
self.appleProductIdentifier = productI
NSLog(@&生成产品信息&);
NSArray *product = [[NSArray alloc] initWithObjects:productIdentifier, nil];
NSSet *nsset = [NSSet setWithArray:product];
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset];
request.delegate =
[request start];
//收到产品返回信息
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
NSLog(@&--------------收到产品反馈消息---------------------&);
NSArray *productArray = response.
if([productArray count] == 0){
NSLog(@&--------------没有商品------------------&);
NSLog(@&productID:%@&, response.invalidProductIdentifiers);
NSLog(@&产品付费数量:%lu&,(unsigned long)[productArray count]);
SKProduct *product =
for (SKProduct *pro in productArray) {
NSLog(@&%@&, [pro description]);
NSLog(@&%@&, [pro localizedTitle]);
NSLog(@&%@&, [pro localizedDescription]);
NSLog(@&%@&, [pro price]);
NSLog(@&%@&, [pro productIdentifier]);
if([pro.productIdentifier isEqualToString:self.appleProductIdentifier]){
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 *paymentTransactionp in transaction){
switch (paymentTransactionp.transactionState) {
case SKPaymentTransactionStatePurchased:
NSLog(@&交易完成-restoreCompletedTransactions&);
/* your code */
if (self.startBuyAppleProduct) {
[self buyAppleStoreProductSucceedWithPaymentTransactionp:paymentTransactionp];
[self completeTransaction:paymentTransactionp];
case SKPaymentTransactionStatePurchasing:
NSLog(@&商品添加进列表&);
case SKPaymentTransactionStateRestored:
NSLog(@&已经购买过商品&);
case SKPaymentTransactionStateFailed:
NSLog(@&交易失败&);
/* your code */
[self completeTransaction:paymentTransactionp];
// 苹果内购支付成功
- (void)buyAppleStoreProductSucceedWithPaymentTransactionp:(SKPaymentTransaction *)paymentTransactionp {
/* 获取相应的凭据,并做 base64 编码处理 */
NSString *base64Str = [paymentTransactionp.transactionReceipt base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
NSLog(@&苹果内购凭据号\n\n\n\n\n\n%@\n\n\n\n\n\n&,base64Str);
[self checkAppStorePayResultWithBase64String:base64Str];
- (void)checkAppStorePayResultWithBase64String:(NSString *)base64String {
/* 生成订单参数,注意沙盒测试账号与线上正式苹果账号的验证途径不一样,要给后台标明 */
NSNumber *
#if (defined(APPSTORE_ASK_TO_BUY_IN_SANDBOX) && defined(DEBUG))
sandbox = @(0);
sandbox = @(1);
NSMutableDictionary *prgam = [[NSMutableDictionary alloc] init];;
[prgam setValue:sandbox forKey:@&sandbox&];
[prgam setValue:base64String forKey:@&reciept&];
请求后台接口,服务器处验证是否支付成功,依据返回结果做相应逻辑处理
//交易结束
- (void)completeTransaction:(SKPaymentTransaction *)transaction{
NSLog(@&交易结束&);
self.startBuyAppleProduct = NO;
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:7691次
排名:千里之外
原创:31篇
(1)(1)(1)(3)(4)(6)(4)(3)(1)(5)(2)热门搜索:
当前位置:
&&苹果App Store怎么退款?苹果App Store退款教程
苹果App Store怎么退款?苹果App Store退款教程
日 10:09&&&&&来源:游戏堡&&&&&编辑:ace&&&&&
苹果App Store怎么退款?苹果App Store退款教程。购买了App Store应用觉得不好怎么办呢?碰到这样的事情也不用担心,在苹果购入的虚拟产品和购入iPhone、iPad、MacBook一样,支持退款服务。最重要的是,退款过程一点都不复杂,分分钟搞定,而且,不仅app可以退款,电影、图书、等也可以。现在,来看看如何请求退款吧。
步骤如下:
1,打开,登陆Apple ID。苹果在此处提示到,“使用您的Apple ID登录,以报告最近90天购买的iTunes Store、App Store、iBooks Store或Mac App Store项目相关问题。”也就是说,App购买超过90天便不能申请退款了。
2,进入“报告问题”界面,可以看到已购入的app按时间顺序排列。
3,在项目比较多时,可以用“搜索”功能找到自己想退款的app。
4,找到app之后,点击“报告问题”,选择需要报告的问题。有“我没有授权此项购买”、“并不像购买此项目”、“原本打算购买另一个项目”、“未下载项目或者无法找到项目”、“项目无法安装或下载太慢”、“项目可打开,但是未起到预期的作用”、“没有列出我的问题”等多个选项各选。由这些选项我们可以看出,苹果对退款原因的接受度还是挺广的,这些选项几乎包含了所有的原因,尤其是“并不想购买此项目”显得格外任性。
5,接下来,“描述问题”,“提交”。
6,提交问题之后,点击“请求退款”。
7,退款完成。退款会按照购买时所用的付款方式原路返回,如果是信用卡购买的,返回到信用卡;如果是iTunes余额,则会返回到余额里。
整个退款过程就是那么简单,不过有几点需要注意一下:
1,虽然整个退款申请过程十分简单,但也不要恶意申请退款。如果苹果系统检测到恶意退款的话,很有可能封掉账户,甚至在法律上追究责任。游戏确实好玩,书也确实好看的话,为此买单有何不可呢?
2,由于退款系统采用了自动审核模式,因此整个过程相当迅速,退款也相当迅速。不过,我也碰到过退款已发放,但在iPhone上的App Store上余额未发生变化,MacBook上余额正常的情况。同时,苹果工作人员偶尔也会发邮件来核实情况。
说到最后,我必须吐槽一下,和苹果产品相比,苹果官网、iTunes和App Store不知道难用到哪里去了。账户相关操作真是不方便,尤其是有些功能和服务根本发现不了,入口也不好找。如果苹果能将官网、iTunes和App Store的一些账户功能整合在一起就好了,比如在App Store直接申请退款等。同时,为了追求安全,Apple ID的设置也相当复杂,不仅有主邮箱,还有备用邮箱,救援邮箱。
不过,话说回来,苹果很壕,让你想退款就退款,但它也很精,让你退起来没那么容易,甚至,都不让你知道可以退款。说不定,隐藏的那么好,它就是故意的呢。
以上就是小编为大家介绍的苹果App Store退款教程,更多精彩内容,请继续关注游戏堡频道。
相关阅读:
阅读(52)01-25
阅读(99)11-14
阅读(687)11-02
阅读(112)07-13
阅读(87)05-23
阅读(41)05-11
阅读(64)05-06
阅读(47)02-25
阅读(55)11-27
阅读(95)11-03
站内推荐:
一周热点资讯
爱奇艺日最新会员账号是什么?相信小伙伴都 ......
作品版权归作者所有,如果侵犯了您的版权,请联系我们,本站将在3个工作日内删除。
中国知名的门户,坚守单机游戏阵地!游戏堡提供游戏资讯,下载,攻略,补丁,是你单机游戏下载的最好选择。
All Rights Reserved 湘ICP备号-2
游戏堡温馨提示:抵制不良游戏,拒绝盗版游戏,注意自我保护,谨防受骗上当,适度游戏益脑,沉迷游戏伤身,合理安排时间,享受单机游戏!这周科技界最热门的话题就是谷歌AlphaGo和世界围棋高手李在石的“人机对决”,自1998...
在一次独家采访过程中,苹果 CEO 蒂姆·库克分享了他对个人隐私和国家安全的意见。同...
近两年优秀的国产好游戏也不断地在 iOS 平台涌现,不如大家稍微将目光转向这些国内团...
智能相簿功能,其实是非常实用的。
缩小 DPI,为了让用户能够在屏幕中浏览到更多内容,和单手操作模式不同。
年,我们多次听到这个词——“去谷歌化”。当许多人认为谷歌和苹果对立的...
“我从未想到会出现这种情况,政府本应该始终捍卫公民自由,但是现在他们的角色发生了...
总共发现了4个漏洞,其中包括1个Safari漏洞以及3个OS X漏洞。
《第九黎明(9th Dawn)》是游戏开发商 Valorware 所制作的一款像素风格的 RPG游戏作...
一边是手握《变形金刚》这款经典IP的全球性娱乐公司孩之宝,一边是曾经开发过《宿敌王...
近日,游戏开发商 PlayRaven 在苹果商店当中推出了其新作《美国寒冬(Winterstate)》...
近日,迪士尼联合著名游戏开发商 Gameloft 制作的新作《迪士尼梦幻乐园(Disney Magic...
作为一个热门的游戏类型,跑酷游戏一直都是兵家必争之地,信每一个厂商都有各自的想法...
近日,游戏开发商 Pinkapp 在苹果商店当中推出了其制作的新作《障碍X(BARRIER X)》。
《跳跃伙伴(Jump Buddies)》是Crimson Pine Games 推出的一款反应类游戏,在游戏中...
高品质的音乐的确是生活中非常令人愉悦的一种体验。
从音质到外观、材质都有了进步,如果能在无线模式续航能力,即插即用和降噪功能的自主...
这个 Blockhead 充电器并没有采用传统的设计,而是让插头部分跟墙壁保持水平、充电线...
今天我们就一起来看看 Beats 推出的这款 Powerbeats2 wireless运动蓝牙耳机。
难道,iPhone SE真的和iPhone 5s一模一样吗?
这两款iPad Pro的重要配件,现在的发货时间都正常了。
重回4英寸屏幕的iPhone,不知道能够再创当时的辉煌吗?
看来,传闻中的4英寸iPhone新机,设计还无法 100%确定。
【最新AppStore退款流程】2014年最详细的App Store退款流程,图文详解,送给有需要的人!
注册时间 最后登录
在线时间170 小时 UID
主题帖子人气
白苹果, 积分 867, 距离下一级还需 633 积分
今天刚好买错了,太有用了
注册时间 最后登录
在线时间595 小时 UID
主题帖子人气
注册时间 最后登录
在线时间6 小时 UID
主题帖子人气
请问我赠送给别人app但是他没收到怎么申请退款呢
注册时间 最后登录
在线时间5 小时 UID
主题帖子人气
点赞啊!!!!!!!!!
注册时间 最后登录
在线时间25 小时 UID
主题帖子人气
提示: 作者被禁止或删除 内容自动屏蔽
注册时间 最后登录
在线时间294 小时 UID
主题帖子人气
这个要收藏了
注册时间 最后登录
在线时间173 小时 UID
主题帖子人气
我申请了,itunes store 给我发个收据编号邮件。。。没说明给我退还是不退啊
注册时间 最后登录
在线时间695 小时 UID
主题帖子人气
我想请问LZ .APPLE IOS游戏内购 退款后 能否退到信用卡&?
我充值过程都是信用卡先冲到APPLE ID .然后游戏里内购.
退款后&&能否退到卡里?
注册时间 最后登录
在线时间25 小时 UID
主题帖子人气
注册时间 最后登录
在线时间25 小时 UID
主题帖子人气
APP内购的能退吗
威锋旗下产品
Hi~我是威威!
沪公网安备 29号 丨 沪ICP备号-1 丨 深公安网监备案号 5
增值电信业务经营许可证:
Powered by Discuz!iOS版Apple Store软件应用商店添加两步验证-软件直销网-软件厂商直接面向终端用户在线综合服务门户-软件资讯
  添加到收藏夹
&热门关键字:&&&&&&&&&
iOS版Apple Store软件应用商店添加两步验证
发布时间: 12:00:52
来源:厂商在线-软件直销网-软件厂商直接面向终端用户在线综合服务门户信息中心
责任编辑:冰封王座
利用软件选型智能Robot 选购软件更科学、更高效、更简单。
软件直销网消息,就在昨天凌晨,苹果对外发布了iOS版Apple Store商店的更新,其版本号为3.3。据了解,在此次更新升级之后,iOS版Apple Store商店主要增加了更多账号Touch ID支持,以及两步验证等安全保障功能:
  当前,用户已经能够选择为账户开启Touch ID验证,在浏览订单、访问EasyPay收据,以及实体店预约过程中可取代之前的密码验证。
  在进行Apple ID账户操作时可以开启两步验证,提供更多信息安全保障,进一步加强Touch ID安全指数。
  在完成更新后,首次启动Apple Store商店查看受保护部分的信息时,就会接到输入密码的提示。完成后就能够使用Touch ID来追踪订单状态、查看EasyPay收据以及进行店内预订。利用软件选型智能Robot 选购软件更科学、更高效、更简单。版权声明:此文章为厂商在线&软件直销网()原创,如需转载请保留此链接,并勿随意改动文章内容! &▲&关于
的新闻没有相关数据
昵称:&&&&
?()?()?()?()?()?()?()?()?()?()?()?()?()?()?()?()?()?()?()?()
??????????
软件直销网消息,&移动微视频应用&是近年来新近流行的基于移动智能终端的全..&
&&&&& 2月14日,酷我音乐官方正式发布了酷我听听语音搜索版手机音乐播..&
版权所有 上海晋财企业投资咨询有限公司
Copyright?2008-
All Rights Reservedapple ID游戏内购一直购买失败 急-中国学网-中国IT综合门户网站
> 信息中心 >
apple ID游戏内购一直购买失败 急
来源:互联网 发表时间: 1:48:58 责任编辑:王亮字体:
为了帮助网友解决“apple ID游戏内购一直购买失败 急”相关的问题,中国学网通过互联网对“apple ID游戏内购一直购买失败 急”相关的解决方案进行了整理,用户详细问题包括:RT,我想知道:apple ID游戏内购一直购买失败 急死我了,具体解决方案如下:解决方案1:充值了么,余额够么?解决方案2:银行卡是别人的可以吗解决方案3:你要先充值到appstore上才能在游戏里买东西啊,银行卡是不是自己的名字没关系,只要验证资料齐全就行
1个回答3个回答1个回答2个回答1个回答1个回答2个回答2个回答2个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答
相关文章:
最新添加资讯
24小时热门资讯
Copyright © 2004- All Rights Reserved. 中国学网 版权所有
京ICP备号-1 京公网安备02号

我要回帖

更多关于 apple store内购退款 的文章

 

随机推荐