我正在开发一个 Flutter 应用程序,该应用程序需要在通过 PayPal Webhooks 成功处理付款后将用户重定向到主页小部件。然而,支付成功后,应用程序显示空白,而不是导航到主页。我已经通过 PayPal webhook 验证了付款成功,并且正在尝试在我的 Flutter 应用程序中处理重定向。
main.dart
@override
void initState() {
super.initState();
getUserData();
_socketService = SocketService(onSubscriptionSuccess: (isPremium) {
final currentUser = ref.read(userProvider.notifier).state;
if (currentUser != null) {
final updatedUser = currentUser.copyWith(
isPremium: isPremium,
);
ref.read(userProvider.notifier).state = updatedUser;
Routemaster.of(context).replace(HOME_ROUTE);
}
});
_socketService.createSocketConnection();
}
socket_service.dart
import 'package:socket_io_client/socket_io_client.dart' as IO;
void createSocketConnection() {
socket = IO.io('http://localhost:3001', <String, dynamic>{
// Connection setup
});
socket.onConnect((_) => {
// Connection established
});
socket.on('subscription_success', (data) => onSubscriptionSuccessHandler(data));
}
void onSubscriptionSuccessHandler(data) {
if (data != null && data['isPremium'] != null) {
bool isPremium = data['isPremium'];
onSubscriptionSuccess(isPremium);
}
}
路由器.dart
routes: {
HOME_ROUTE: (route) => const MaterialPage<void>(child: HomePage()),
服务器端 Node.js
index.js
const { Server } = require("socket.io");
const server = http.createServer(app);
const io = new Server(server);
app.use((req, res, next) => {
req.io = io;
next();
});
redirectedToPremiunFeatures = true;
io.on("connection", (socket) => {
socket.emit("user", redirectedToPremiunFeatures);
socket.on("redirected", (reason) => {
redirectedToPremiunFeatures = true;
socket.emit("user", redirectedToPremiunFeatures);
socket.broadcast.emit("user", redirectedToPremiunFeatures);
});
socket.on("reconnect_attempt", () => {
});
});
server.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
paypal.js
paypalRouter.post("/subscriptions/webhook", webhookRateLimiter, async (req, res) => {
...
if (updatedUser) {
console.log("Subscription confirmed for user:", userId);
req.io.emit("subscription_success", {
userId: userId,
isPremium: true,
});
socket_service.dart
和 服务器端逻辑(带有 socket.io
的 Node.js)处理订阅成功事件,并应该触发 onSubscriptionSuccess
中的 main.dart
回调。
尽管回调被触发(通过调试日志确认),但应用程序并未按预期导航到
HomePage
小部件。值得注意的是,我的导航设置的其余部分在应用程序的其他部分运行良好。
如何确保应用程序在收到 PayPal webhook 的成功付款通知后导航到主页?
在不诊断此处的具体问题的情况下,作为设计问题,Webhooks 不应用于触发客户端事件。它们的目的是通过状态更改来更新您的后端,即在初始批准后和每个周期(PAYMENT.SALE.COMPLETED 事件)后将订阅标记为已付款。为此目的使用网络钩子。
在客户端,让它调用服务器来检查订阅当前是否处于活动状态。如果不是(即尚未收到并处理任何 Webhook 来将其标记为此类),请让服务器执行 GET 调用来检索订阅的状态。将结果返回给客户端,允许其继续(或停止)订阅启用的任何功能。