首页 > 解决方案 > 为什么在Apple App购买中找不到服务器端的交易记录?

问题描述

我正在我的 Flutter 项目中开发应用购买,我现在要验证我的购买。在客户端,我传递了这个参数:

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 来匹配任何订单。为什么会发生这种情况?难道我做错了什么?我正在遵循 Apple 手册的指南。我应该怎么做才能修复它?什么可能导致这种情况?顺便说一句,客户端的交易id是从购买的id中获取的,我阅读了flutter插件的应用内购买源代码,购买的id是从交易id中提取的,我认为交易id是交易id。

现在我在沙盒中,我的订阅产品是 30 天。在沙盒中,它是 3 分钟,然后服务器每 3 分钟自动更新订阅。很长一段时间,最新生成的收据超过了 latest_receipt_info 大小的最大值。所以找不到交易ID。这逻辑对吗?

那么最大尺寸是latest_receipt_info多少?但他的问题是:我所有的验证交易都无法在服务器 latest_receipt_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都会改变。

标签: in-app-purchase

解决方案


交易标识符用于确保单个收据不会被黑客入侵、复制、安装在许多设备中以及用于获取多个 IAP。当 Apple 使用相同的交易 ID 进行原始购买、免费回购和 restoreCompletedTransaction 时,这个保护系统就崩溃了。

这是一个很好的句子放在文档中。将为一些开发人员节省很多时间。从这里开始。</p>


推荐阅读