【问题标题】:Passing both user ID and product ID to Paypal Button将用户 ID 和产品 ID 都传递给 Paypal 按钮
【发布时间】:2021-12-07 17:44:49
【问题描述】:

我正在使用@paypal/react-paypal-js 显示 PayPal 按钮并创建订单。我对处理信用卡付款特别感兴趣。一旦我的 Django 后端从 PayPal 接收到付款捕获完成事件,它就需要存储有关拥有特定产品的特定用户的信息。因此,通知必须同时包含用户 ID(即电子邮件)和产品 ID。

这就是我尝试在前端传递这两条信息的方式:

createOrder={(data, actions) => {
    return actions.order.create({
        purchase_units: [
            {
                amount: {
                    value: course.price,
                    currency_code: course.currency,
                },
                custom_id: course.title,
            },
        ],
        payer: {
            email_address: userEmail,
        }
    });
}}

这是我的onApprove

onApprove={(data, actions) => onSuccess(data, actions)}

其中onSuccess的实现方式如下:

const onSuccess= (data, actions) => {
    return actions.order.capture().then(
        function (details) {
            toast.success('Payment completed. Thank you, ' + 
                          details.payer.name.given_name,
                          {duration: 6000})
        }
    );
}

用户电子邮件地址会自动填写到表单中。但是,服务器中的webhook_event 事件不包含此信息。也就是说,webhook_event 中的resource 内部没有payer 字段。

我也尝试将payee: {email_address: userEmail} 添加到purchase_units,但是在按下 PayPal 按钮后没有使用信用卡支付的选项。该选项已被创建 PayPal 帐户的选项所取代。

如何传递这两条信息以便在webhook_event 中获取它们? (我想避免将两部分连接成custom_id的丑陋解决方案)

【问题讨论】:

    标签: reactjs django paypal


    【解决方案1】:

    我也尝试将 payee: {email_address: userEmail} 添加到 purchase_units 中,但是在按下 PayPal 按钮后没有使用信用卡支付的选项。该选项已被创建 PayPal 帐户的选项所取代。

    payee 设置接收 PayPal 付款的帐户。如果收款人的 PayPal 帐户存在并得到确认,客人通常可以使用黑色借记卡或信用卡按钮付款。

    如何传递这两条信息以便在 webhook_event 中获取它们?

    如果您绝对必须将两部分信息存储为自定义值的一部分(通常仅对订阅有用,尽管即使对于订阅也有更好的解决方案涉及使用您自己的数据库),您可以使用json.dumps({'email': somevalue, 'product': somevalue} 对 JSON 对象进行编码并将该 json 字符串值存储在 custom_id 中——然后在收到后使用json.loads 对其进行解码。

    但是,需要执行此类操作并不常见,尤其是对于一次性订单付款。您应该从您自己的服务器路由实现订单创建和捕获,并在成功捕获后立即将必要的信息存储在您自己的数据库中,然后再将捕获结果返回到按钮 JavaScript。查看Set up standard payments.中的服务器集成信息

    在这种情况下,根本不需要 Webhook,更不用说从 Webhook 中检索项目信息了。但是,您可以并且应该通过items 数组将商品信息包含在 PayPal 交易中,以供参考。这也将在结账时在右上角的购物车下拉菜单中显示给付款人,并在已完成的 paypal.com 交易详情中可见。

    【讨论】:

    • 感谢您消除关于 payee 的困惑。在处理onApprove 时,我确实调用了actions.order.capture()(如问题所示)。你的意思是我应该从那里发送购买的详细信息,而不是依靠 webhook 发送这些详细信息?但这不是打开了一个安全漏洞,恶意用户可以伪造我的客户端,让我的服务器认为他购买了一些东西,而他没有购买?另外,我怎么知道 this 订单的付款捕获已完成?
    • 上面详细说明了你应该做什么,从第三段开始,“你应该从你自己的服务器路由实现订单创建和捕获..”,所以我会向你介绍那里的内容。
    • 您写道,您在第二段中的建议仅对订阅是必需的。我不明白您在第三段中所说的“从您自己的服务器路由执行订单创建和捕获,并在成功捕获后立即将必要的信息存储在您自己的数据库中”的意思。我的评论是为了确保我正确理解您,并且从安全的角度来看您的建议是有意义的,特别是因为您在最后一段中写道,webhook 是不必要的。
    • 如果您实现从服务器创建和捕获订单,则不需要 Webhook。这不适用于订阅。在“设置标准付款”developer.paypal.com/docs/business/checkout/… 中查找服务器集成指南和演示代码链接。
    猜你喜欢
    • 2016-07-29
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多