【发布时间】:2021-03-25 17:18:40
【问题描述】:
我正在尝试在服务器上监听我的 Google Play 应用的订阅更改(新的和现有的)。这是我正在使用的代码。这使用了google/cloud-pubsub composer 包:
$projectId = 'app-name';
$keyFile = file_get_contents(storage_path('app/app-name.json'));
$pubsub = new PubSubClient([
'projectId' => $projectId,
'keyFile' => json_decode($keyFile, true)
]);
$httpPostRequestBody = file_get_contents('php://input');
$requestData = json_decode($httpPostRequestBody, true);
info(json_encode($requestData));
$message = $pubsub->consume($requestData);
info(json_encode($message));
上面的代码有效,但问题是我获得的数据与我在应用程序端获得的数据不匹配。这是一个示例数据:
{
"message":{
"data":"eyJ2ZXJ...",
"messageId":"16797998xxxxxxxxx",
"message_id":"1679799xxxxxxxxx",
"publishTime":"2020-12-15T02:09:23.27Z",
"publish_time":"2020-12-15T02:09:23.27Z"
},
"subscription":"projects\/app-name\/subscriptions\/test-subs"
}
如果你base64_decode() 数据,你会得到这样的东西:
{
version: "1.0",
packageName: "com.dev.app",
eventTimeMillis: "1607997631636",
subscriptionNotification: {
version: "1.0",
notificationType: 4,
purchaseToken: "kmloa....",
subscriptionId: "app_subs1"
}
}
这是我希望purchaseToken 与我从客户端获得的相同的地方。
这是客户端的代码。我正在使用 Expo 应用内购买来实现订阅:
setPurchaseListener(async ({ responseCode, results, errorCode }) => {
if (responseCode === IAPResponseCode.OK) {
const { orderId, purchaseToken, acknowledged } = results[0];
if (!acknowledged) {
await instance.post("/subscribe", {
order_id: orderId,
order_token: purchaseToken,
data: JSON.stringify(results[0]),
});
finishTransactionAsync(results[0], true);
alert(
"You're now subscribed! You can now use the full functionality of the app."
);
}
}
});
我希望从results[0] 提取的purchaseToken 与Google 服务器在将通知推送到端点时返回的相同。但事实并非如此。
更新
我认为我的主要问题是我假设我需要的所有数据都来自 Google Pay,所以我只是依赖于用户在应用中订阅时 Google 发布的数据。
这实际上不是发布消息的人:
await instance.post("/subscribe")
它只是用购买令牌更新数据库。我可以用它来订阅用户,但不能保证请求是合法的。有人可以根据现有用户构建必要的凭据,他们几乎可以订阅而无需支付任何费用。另外,此方法不能用于保持用户订阅。所以数据确实必须来自谷歌。
根据下面的答案,我现在意识到您应该从自己的服务器触发发布?然后你听听吗?所以当我从客户端调用这个时:
await instance.post("/subscribe", {
purchaseToken
});
我实际上需要像这样发布包含购买令牌的消息:
$pubsub = new PubSubClient([
'projectId' => $projectId,
]);
$topic = $pubsub->topic($topicName);
$message = [
'purchaseToken' => request('purchaseToken')
];
$topic->publish(['data' => $message]);
这就是你的意思吗?但是这种方法唯一的问题是如何验证购买令牌是否合法,以及如何在服务器中续订订阅?我有一个需要每月更新的字段,以便用户在服务器眼中保持“订阅”状态。
也许,我只是使用 pub/sub 使事情变得过于复杂。如果实际上有一个 API,我可以定期(使用 cron)从中提取数据,这允许我保持用户订阅数据的更新,那么这也是可以接受的答案。
【问题讨论】:
-
你有什么进展吗?
标签: php laravel google-api google-play google-api-php-client