iOS IAP支付防丢单问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS IAP支付防丢单问题相关的知识,希望对你有一定的参考价值。

参考技术A

我们先来看看有哪些请况会发生掉单:

-(void)restoreCompletedTransactions;

Use this method to restore finished transactions—that is, transactions for which you have already called finishTransaction: . You call this method in one of the following situations:

也就是说这个方法无法恢复非续订订阅 . 我必须自己存储购买并实现自己的恢复功能 .
然而我在测试的过程中发现上诉第一种异常情况的订单可以通过这个方法触发这个回调

是不是很很诡异,,此处有待大神们的再次验证!

国内连接苹果服务器的稳定性
开发之初,苹果方就很负责的告知:我们的服务器不稳定。真正开发之后,发现苹果方果然是很负责的,不仅是不稳定,而且足够慢。app store server验证一个收据需要3-6s时间

1、程序加入支付队列使用SKMutablePayment和SKPayment的区别
两者拥有的属性一样,唯一区别是属性读写权限不同,SKMutablePayment属性具有读写权限,SKPayment属性只读,如果你要使用applicationUsername透传字段,那么就一定要使用SKMutablePayment加入支付队列

2、透传字段applicationUsername可能返回的是nil
在支付完成后,每笔订单都不调用finishTransaction,如此测试四五笔订单后,重新启动该应用,苹果自动补单会进行,在有些时候该字段就会为空,需要开发者注意

3、updatedTransactions:在App整个生命周期只会走一次,所以只要不把订单finishTransaction掉,重启App就会重新走苹果的补单流程(自动调用updatedTransactions:注意需要[[SKPaymentQueue defaultQueue] addTransactionObserver:instance];添加观察者才可以),逻辑需要自己根据项目实现

4、SKPaymentTransaction *transaction属性官方说明

5、 transaction.transactionDate
将订单交易添加到服务器队列的日期,仅当状态为SKPaymentTransactionStatePurchased或SKPaymentTransactionStateRestored时有效

6、 transaction.transactionIdentifier
transactionIdentifier是唯一标识交易支付成功的字符串,此值的格式与收据中的事务transaction_id相同,但是值可能不相同,仅当状态为SKPaymentTransactionStatePurchased或SKPaymentTransactionStateRestored时有效

7、transaction.originalTransaction
原始交易id,仅当状态为SKPaymentTransactionStateRestored时有效有值

8、 transaction.payment.applicationUsername
获取之前设置的applicationUsername

9、 transactionReceiptData可以无限验证通过,也就是说一个凭证可以被校验多次,这是刷单方法之一,需要开发者注意,有开发者说苹果的补单流程返回的transactionReceiptData即使同一笔订单也会变,测试下来并不会变化

10、transactionReceiptData验证解析后,in_app字段出现为空或者多个购买项目,按照网上部分开发者说法,只要不finishTransaction掉订单,下次再支付成功后,返回的transactionReceiptData凭证,就是包含之前的购买记录,测试多次无法复现

付款 - IAP 或第三方

【中文标题】付款 - IAP 或第三方【英文标题】:Payments - IAP or Third Party 【发布时间】:2015-05-16 18:09:28 【问题描述】:

我们正在开发一个 iOS 应用程序,该应用程序提供一些可在应用程序内使用的积分(付费)。我们对此很少有疑问 -

    我们是否可以使用第三方支付网关,例如 paypal 或类似的,或者我们需要为此实施 IAP? 如果我们需要实施 IAP,那么共享比例是多少? 如果我们为此使用第三方支付网关而不是 IAP,那么 Apple 是否有可能拒绝该应用?

我们查看了 Apple 的付款指南,但并未发现所有虚拟购买开发者都必须使用 IAP。此外,我们没有发现任何关于我们无法使用第三方支付服务的虚拟服务支付的具体细节。

谢谢

【问题讨论】:

【参考方案1】:

请仔细阅读苹果审查指南,您的疑虑将得到解决。

您可以使用第三方支付网关,如果您提供实物商品,应用程序之外的服务。如果您在应用内销售内容或服务,则必须使用 inapp-purchase。

根据purchasing currencies guideline,

    使用应用内购买 API (IAP) 以外的系统购买应用中的内容、功能或服务的应用将被拒绝。 使用 IAP 购买积分或其他货币的应用必须在应用内消耗这些积分

关于你的问题,答案如下

    您不能使用第三方支付网关来提供正在应用中使用的积分。 您可以在此处查看price matrix。 是的,如果您实施第三方支付网关而不是 IAP 来为应用程序提供信用,则很有可能被拒绝。

您可以阅读Apple review guidelines 了解更多信息。

【讨论】:

谢谢,还有一个问题,像paypal这样的应用内购买是否有任何额外的佣金? @iphonedev23 : 不,伙计,您可能会从苹果那里获得额外的税收减免。 :p 好的,如果需要支付额外费用或用户想兑换积分,我可以退回付款吗? @iphonedev23 我不知道。 更清楚一点 - 1. 如果用户在网上购买了一些商品以赚取一些积分。这些积分将在应用程序中使用。那么该用户可以访问应用程序中的这些点吗?请注意,用户已在同一应用程序的网络版本上付款,现在在应用程序中使用这些积分。希望苹果在这种情况下不会拒绝该应用程序。

以上是关于iOS IAP支付防丢单问题的主要内容,如果未能解决你的问题,请参考以下文章

IOS IAP APP内支付 Java服务端代码

iOS开发支付篇-内购(IAP)

苹果内支付(iOS IAP)的流程与常用攻击方式

iOS应用内支付(IAP)服务端端校验详解

Cocos2dx使用ios内支付IAP具体流程-白白

iOS内购丢单的解决方案