使用flutter在ios中购买应用程序时如何知道应用程序环境是沙箱

Posted

技术标签:

【中文标题】使用flutter在ios中购买应用程序时如何知道应用程序环境是沙箱【英文标题】:how to known the app env is a sandbox when developing in app purchase in ios using flutter 【发布时间】:2021-09-08 23:29:18 【问题描述】:

现在我正在使用 Flutter 开发 ios 应用内购买。这是客户购买成功时我的验证码截图:

void _listenToPurchaseUpdated(List<PurchaseDetails> purchaseDetailsList, Context<PayState> ctx) 
  purchaseDetailsList.forEach((PurchaseDetails purchaseDetails) async 
    if (purchaseDetails.status == PurchaseStatus.pending) 
      RestLog.logger("PurchaseStatus pending..." + ctx.state.payModel.isAvailable.toString());
      _showPendingUI(ctx);
     else 
      if (purchaseDetails.status == PurchaseStatus.error) 
        RestLog.logger("PurchaseStatus error");
        _handleError(purchaseDetails.error!, ctx);
       else if (purchaseDetails.status == PurchaseStatus.purchased || purchaseDetails.status == PurchaseStatus.restored) 
        RestLog.logger("purchase successful trigger verify");
        PayVerifyModel payVerifyModel =
            PayVerifyModel(orderId: purchaseDetails.purchaseID, receipt: purchaseDetails.verificationData.serverVerificationData, isSandBox: true);
        Pay.verifyUserPay(payVerifyModel);
      
      if (purchaseDetails.pendingCompletePurchase) 
        await InAppPurchase.instance.completePurchase(purchaseDetails);
      
    
  );

问题是我不知道支付环境是哪个环境,现在我正在测试所以我通过了 isSandBox 是真的。如何从当前运行的上下文中知道 isSandBox?我应该怎么做才能让它充满活力?

【问题讨论】:

***.com/questions/49707028/… 解决了您的问题吗? 不,我想知道 isSandBox 的状态。 @Muhtar 为什么不使用发布模式和调试模式?我看不到重点抱歉 这是苹果沙盒状态探测,有时在沙盒付费模式下也有发布模式。 @Muhtar 【参考方案1】:

其实你不需要关心环境是沙箱还是生产环境,你总是可以先使用生产URL,如果在沙箱中生成recipt,服务器将返回21007,在收到21007代码后,你可以再次尝试验证在沙盒中:

private static JSONObject validateApplePay(BuySuccessRequest request, String url) 
        try 
            HttpsURLConnection connection = (HttpsURLConnection) new URL(url).openConnection();
            connection.setRequestMethod("POST");
            connection.setDoOutput(true);
            connection.setAllowUserInteraction(false);
            PrintStream ps = new PrintStream(connection.getOutputStream());
            // Base64.Encoder encoder = Base64.getEncoder();
            // String base64String = encoder.encodeToString(request.getReceipt().getBytes(StandardCharsets.UTF_8));
            ps.print("\"receipt-data\": \"" + request.getReceipt() + "\"");
            ps.close();
            BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String str;
            StringBuffer sb = new StringBuffer();
            while ((str = br.readLine()) != null) 
                sb.append(str);
            
            // String encodeToString = Base64.getEncoder().encodeToString("Test".getBytes());
            br.close();
            String resultStr = sb.toString();
            JSONObject result = JSONObject.parseObject(resultStr);
            if (result != null && result.getInteger("status").intValue() == ApplePayVerifyResponseType.SANDBOX_SEND_TO_PRODUCTION.getKey().intValue()) 
                return validateApplePay(request, SAND_BOX_VERIFY_URL);
            
            return result;
         catch (Exception e) 
            log.error("Validate pay failed", e);
        
        return null;
    

这是苹果的advice。

【讨论】:

以上是关于使用flutter在ios中购买应用程序时如何知道应用程序环境是沙箱的主要内容,如果未能解决你的问题,请参考以下文章

如何从付费应用转换为应用内购买? iOS 和 Android + Flutter

如何在 Flutter 中实现应用内购买订阅?

如何在Flutter中实现应用程序内购买订阅?

使用 Flutters 应用内购买插件检查订阅有效性?

如何在 Android 上使用 Flutter 成功完成应用内购买?

如何在开发过程中同时使用 Android 和 IOS 模拟器来测试我的 Flutter 应用程序?