Google Billing API:订阅购买后不久,会触发订阅过期,然后立即续订订阅

2023-12-21

我正在使用 Firebase Cloud Functions 来处理应用内购买的后端流程。如果我购买订阅(在 Flutter/Android 客户端上),购买流程将毫无问题。但是,当第一次续订发生时,我首先收到订阅已过期的实时开发人员通知,大约 50 秒后,我收到订阅已续订的新通知。

详细流程如下:


1.在客户端购买订阅(目前处于内部测试模式)

--- Google Cloud 日志记录事件开始 (hh:mm:ss):

2. 00:00:00- 已触发通知订阅购买 (空函数,仅打印到控制台)

3. 在客户端,InAppPurchaseConnection buyUpdatedStream(Flutter)被触发,Client 向后端发送数据,并触发 Cloud Function verifyPurchase。

4. 00:00:03- verifyPurchase 函数执行开始

5. 00:00:05- 收到状态 200 响应

6. 00:00:06- 确认已收到响应(状态 204)

7. 直到这里一切都很好,我可以在 Firestore DB 中看到正确的数据

8. 00:04:08- 订阅过期触发通知 (后端撤销订阅,使用户无法购买任何附加服务)
订阅状态响应:

{ "startTimeMillis":"1616129098091",
"expiryTimeMillis":"1616130591517",
“自动更新”:假,
"priceCurrencyCode":"KRW",
"priceAmountMicros":"2900000000",
"国家代码":"KR",
“开发者有效负载”:“”,
"取消原因":0,
"userCancellationTimeMillis":"1616130398607",
"orderId":"GPA.3391-[...].3",
“购买类型”:0,
“确认状态”:1,
"kind":"androidpublisher#subscriptionPurchase",
"obfuscatedExternalAccountId":"q[..]3"
}

-> 此处的取消​​原因指出:0. 用户取消了订阅(事实并非如此)

-> AcknowledgementState 为 1:已确认

请参见:REST API REF 资源:订阅购买 https://developers.google.com/android-publisher/api-ref/rest/v3/purchases.subscriptions

9. 00:05:01- 触发通知订阅续订 从这里开始,一切都按预期进行,用户收到她/他付费的服务。

10. ~ 16. 00:10:01 ~ 00:35:20- 通知订阅续订触发 4 次,然后取消并过期(预期行为)

--- Google Cloud 日志记录事件结束。


export const verifyPurchase = functions.region("asia-northeast3").https.onCall(async (data, context) => {
  const {sku, purchaseToken, packageName, purchaseType} = data;
  const userId: string = context.auth?.uid ?? "";
  functions.logger.log(`USER ID: ${userId}`);

  let result = 0;

  try {
    await authClient.authorize();
    functions.logger.log("START TO CHECK SUBSCRIPTION OR ONE TIME PURCHASE");
    if (purchaseType === PurchaseType.subscription) {
      const subscription = await playDeveloperApiClient.purchases.subscriptions.get({
        packageName: packageName,
        subscriptionId: sku,
        token: purchaseToken,
      });
      functions.logger.log("SUBSCRIPTION BEING PROCESSED");
      if (subscription.status === 200 && subscription?.data?.paymentState === 1 || subscription?.data?.paymentState === 2) {
        functions.logger.log(`SUBSCRIPTION STATUS: ${subscription.status}`);

        if (!subscription.data.linkedPurchaseToken) {
          const subscriptionData: any = {
            "transactionId": purchaseToken,
            "userId": userId,
            "expirationDateMs": subscription.data.expiryTimeMillis,
            "disabled": false,
            "platform": "android",
            "receipt": data,
            "rawData": subscription.data,
          };

          await admin.firestore().collection("subscriptions").add(subscriptionData).then(
              async (value) => {
               [...user Data being updated on DB...]
          );

          const acknowdlegeResponse = await playDeveloperApiClient.purchases.subscriptions.acknowledge({
            packageName: packageName,
            subscriptionId: sku,
            token: purchaseToken,
            requestBody: {
            },
          });
          functions.logger.info(`ACKNOWLEDGE RESPONSE SUBSCRIPTION: ${JSON.stringify(acknowdlegeResponse)}`);**
        } else {
          await subscriptionChange(purchaseToken, userId, data, subscription);
        }

        result = subscription.status;
      }
    } else {
      const oneTimePurchase = await playDeveloperApiClient.purchases.products.get({
      [...part for one time purchases...]
  } catch (e) {
    // handle error
    functions.logger.error("verifyPurchase ERROR");
    functions.logger.error(e);
  }
  functions.logger.log(`RETURN RESULT: ${result}`);

  return result;
});

所以我不太明白为什么会发生第8步(过期)。 我将不胜感激任何帮助。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google Billing API:订阅购买后不久,会触发订阅过期,然后立即续订订阅 的相关文章

随机推荐