为什么在购买苹果APP时找不到服务器端的交易记录? [英] Why could not find transaction record on the server side in Apple app purchase?

查看:15
本文介绍了为什么在购买苹果APP时找不到服务器端的交易记录?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在我的Ffltter项目中开发一个APP购买,现在我要验证我的购买。在客户端,我传递此参数:

public class ReceiptVerifyRequest implements Serializable {


    @ApiModelProperty(value = "product ID")
    @NonNull
    private String productId;

    @ApiModelProperty(value = "receipt")
    @NonNull
    private String receipt;

  
    @ApiModelProperty(value = "transaction ID")
    @NonNull
    private String transactionId;
}

因为我现在是订阅产品和自动续费(订阅产品),所以我从服务器端的latest_receipt_info列表字段中选择记录,如下所示:

private void savePayTransactionRecord(JSONArray latestReceiptInfo, IapProduct iapProduct, ReceiptVerifyRequest request) {
        if (ApplePayProductType.SUBSCRIPTION.getKey().equals(iapProduct.getProductType())) {
            if (latestReceiptInfo == null || latestReceiptInfo.size() == 0) {
                return;
            }
            for (Object item : latestReceiptInfo) {
                if (item instanceof JSONObject) {
                    JSONObject jsonObjectItem = (JSONObject) item;
                    if (request.getTransactionId().equals(jsonObjectItem.getString("transaction_id"))) {
                        mapFieldAndSave(jsonObjectItem);
                    }
                }
            }
        }
    }

令我惊讶的是,通过使用事务ID进行匹配,我找不到任何订单。为什么会发生这种事?我做错什么了吗?我在按照苹果说明书的指南操作。我应该怎么做才能把它修好呢?造成这种情况的原因可能是什么?顺便说一下,客户端的交易标识是从购买的标识中获取的,我读了Ffltter插件的应用内购买源代码,购买的标识是从交易标识中提取的,我想交易标识就是交易标识。

现在我在沙盒里,我的订阅产品是30天。在沙盒中,是3分钟,然后服务器每3分钟自动续订一次。很长时间以来,最新生成的回执超过了LATEST_RECEIVE_INFO大小的最大值。因此找不到交易ID。这逻辑对吗?

那么latest_receipt_info的最大大小是多少?但问题是:我所有的验证事务都在服务器LATEST_RECEIVE_INFO中找不到,这很奇怪。我已尝试使用web_order_line_item_id

private void savePayTransactionRecord(JSONArray latestReceiptInfo, IapProduct iapProduct, ReceiptVerifyRequest request) {
        if (ApplePayProductType.SUBSCRIPTION.getKey().equals(iapProduct.getProductType())) {
            
            if (latestReceiptInfo == null || latestReceiptInfo.size() == 0) {
                return;
            }
            for (Object item : latestReceiptInfo) {
                if (item instanceof JSONObject) {
                    JSONObject jsonObjectItem = (JSONObject) item;
                    if (request.getTransactionId().equals(jsonObjectItem.getString("web_order_line_item_id"))) {
                        mapFieldAndSave(jsonObjectItem);
                    }
                }
            }
        }
    }

也不匹配。

实际上,每次客户端向服务器请求时,事务ID都会更改。

推荐答案

事务标识符过去很有用,可以确保单个收据不会被黑客攻击、复制、安装在许多设备上并用于获取多个IAP。当苹果对原始购买、免费回购和RestoreCompletedTransaction使用相同的交易ID时,这个保护系统就崩溃了。

这句话很适合放在文档中。将为一些开发人员节省很多时间。发件人here

这篇关于为什么在购买苹果APP时找不到服务器端的交易记录?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆