我正在我的网站上实施 PayPal,一切正常,我收到了所有 webhooks,它将向用户添加令牌
CHECKOUT.ORDER.APPROVED
但是,我的问题是,用户不会等待付款实际完成(最终会完成),而是立即重定向到我的网站
我不知道我是否错过了 PayPal webhook 端的状态调用?
我所说的页面仅供参考
这是我的控制器代码
exports.createPayment = async (req, res) => {
const { userId, amountCNY, selectedTokens } = req.body;
// Convert amount from RMB to USD based on the current exchange rate
const amountInUsd = convertRmbToUsd(amountCNY);
// Concatenate userId and selectedTokens to use as custom_id
const customId = `${userId}:${selectedTokens}`;
const request = new paypal.orders.OrdersCreateRequest();
request.prefer('return=representation');
request.requestBody({
intent: 'CAPTURE',
purchase_units: [
{
amount: {
currency_code: 'USD',
value: amountInUsd.toFixed(2).toString(),
},
custom_id: customId,
},
],
application_context: {
return_url: 'example.com',
cancel_url: 'example.com',
},
});
try {
const response = await client().execute(request);
if (response.statusCode === 201) {
const approvalUrl = response.result.links.find((link) => link.rel === 'approve').href;
res.json({ id: response.result.id, approvalUrl: approvalUrl });
}
} catch (error) {
res.status(500).send('Error creating PayPal payment');
}
};
exports.executePayment = async (req, res) => {
const { orderId } = req.body;
const request = new paypal.orders.OrdersCaptureRequest(orderId);
request.requestBody({});
try {
const capture = await client().execute(request);
res.status(200).json(capture.result);
} catch (error) {
res.status(500).send('Error capturing PayPal payment');
}
};
exports.handleWebhook = async (req, res) => {
const event = req.body;
if (event.event_type === 'CHECKOUT.ORDER.APPROVED') {
const orderId = event.resource.id;
try {
const request = new paypal.orders.OrdersCaptureRequest(orderId);
request.requestBody({});
const capture = await client().execute(request);
const purchaseUnit = capture.result.purchase_units[0];
const customId = purchaseUnit.custom_id;
const [userId, selectedTokens] = customId.split(':');
const newBalance = await addTokensByUserId(userId, parseInt(selectedTokens, 10));
res.status(200).send('Success! Tokens added.');
} catch (error) {
res.status(500).send({ error: `Error processing payment: ${error.message}` });
}
} else if (event.event_type === 'PAYMENT.CAPTURE.COMPLETED') {
res.status(200).send('Payment capture completed.');
} else {
res.status(200).send('Event received, but not handled.');
}
};
已批准是指付款人在 PayPal 登录并批准结账。这并不意味着任何付款被捕获;该阶段订单尚未完成。
Webhooks 不需要处理正常的 v2/结帐/订单付款。如果您实施它们,请稍后再实施;您的 Orders v2 集成应该首先在没有它们的情况下工作。
付款人可以通过两种方式批准 PayPal 订单,将其从您的网站重定向到 PayPal 并返回,或者使用 JS SDK。出于多种原因,JS SDK 提供了更好的付款人体验,您应该对此进行更改,请参阅 https://developer.paypal.com/docs/checkout/standard/integrate/ 了解与订单后端配对的 JS 示例。
如果使用旧的从站点重定向模式,您圈出的按钮将(默认情况下)显示“继续查看订单”,并且您应该向用户显示您自己的确认页面。当他们通过点击您最后一页上的某些操作确认订单后,您需要执行最终订单“cature”API 调用来提交交易。根据该捕获 API 调用的响应,您应该向付款人显示成功或失败的明确消息。
使用 JS SDK,该按钮将(默认情况下)显示“立即付款”。使用该默认设置,不需要审核步骤,您可以通过 API 调用立即继续捕获订单。根据您的响应预计会向付款人显示成功或失败的消息。
可以使用 API 参数 user_action 覆盖 PayPal 最后操作的默认措辞。这仅改变了措辞,并没有改变 PayPal 所做的任何事情。如果您要更改任何批准方法的默认设置,则您的集成在批准后执行的行为必须进行相应更改。
如果由于某种原因您不熟悉 JS SDK 提供的更好的无重定向体验,请参阅前端代码演示:https://developer.paypal.com/demo/checkout/#/pattern/server