flutter in_app_purchase中如何通过applicationusername查询服务端订单

在Flutter的in_app_purchase插件中,如何通过applicationUserName参数查询服务端订单?我在客户端支付时传入了applicationUserName,但在服务端验证订单时找不到这个字段。苹果的收据和谷歌的Purchase对象里似乎都没有直接包含这个信息。请问正确的做法是什么?是否需要通过其他方式将客户端参数传递到服务端?

2 回复

在Flutter的in_app_purchase中,可通过queryPastPurchases()获取历史购买记录,然后使用applicationUsername与服务端订单进行匹配验证。建议在购买时将此参数设为唯一用户标识,便于后续查询。

更多关于flutter in_app_purchase中如何通过applicationusername查询服务端订单的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter的in_app_purchase插件中,可以通过applicationUsername参数来关联和查询服务端订单。以下是具体实现方法:

1. 设置applicationUsername

在发起购买时设置applicationUsername

final PurchaseParam purchaseParam = PurchaseParam(
  productDetails: productDetails,
  applicationUserName: 'your_user_id_123', // 用户唯一标识
);

// 发起购买
await InAppPurchase.instance.buyConsumable(
  purchaseParam: purchaseParam,
);

2. 验证购买时获取applicationUsername

在验证购买收据时,可以从购买详情中获取:

// 监听购买流
final Stream purchaseUpdated = InAppPurchase.instance.purchaseStream;

purchaseUpdated.listen((List<PurchaseDetails> purchaseDetailsList) {
  for (PurchaseDetails purchaseDetails in purchaseDetailsList) {
    if (purchaseDetails.status == PurchaseStatus.purchased) {
      // 获取applicationUsername
      String? applicationUsername = purchaseDetails.applicationUsername;
      String transactionId = purchaseDetails.purchaseID ?? '';
      
      // 发送到服务端验证
      await verifyPurchaseWithServer(
        purchaseDetails,
        applicationUsername,
      );
    }
  }
});

3. 服务端查询实现

服务端可以根据applicationUsername查询订单:

// 服务端验证函数示例
Future<bool> verifyPurchaseWithServer(
  PurchaseDetails purchaseDetails,
  String? applicationUsername,
) async {
  try {
    final response = await http.post(
      Uri.parse('https://your-server.com/verify-purchase'),
      headers: {'Content-Type': 'application/json'},
      body: jsonEncode({
        'receipt': purchaseDetails.verificationData.localVerificationData,
        'applicationUsername': applicationUsername,
        'transactionId': purchaseDetails.purchaseID,
        'productId': purchaseDetails.productID,
      }),
    );
    
    if (response.statusCode == 200) {
      final result = jsonDecode(response.body);
      return result['isValid'] == true;
    }
    return false;
  } catch (e) {
    return false;
  }
}

4. 服务端订单查询API

服务端可以设计这样的查询接口:

// Node.js示例
app.get('/orders/:applicationUsername', async (req, res) => {
  const { applicationUsername } = req.params;
  
  const orders = await Order.find({ 
    applicationUsername: applicationUsername 
  });
  
  res.json(orders);
});

关键点说明

  • applicationUsername应该是用户的唯一标识符
  • 建议使用用户ID、UUID或其他不会重复的标识
  • 确保在购买流程中保持一致性
  • 服务端验证时同时校验收据数据和applicationUsername

这样就能通过applicationUsername准确关联和查询服务端订单了。

回到顶部