PayPal 结账写入数据库 onApprove

问题描述 投票:0回答:1

我希望一些知识渊博的灵魂能够解释我下面的代码哪里出了问题。

我正在尝试从 PayPal 加密支付设置 (EPS) 升级到更新的 PayPal 结账解决方案。我已经用 PHP 编写了我的购物车,并且基本上有一个结帐的最后一页,我已经准备好了一切,例如

$seid \\ session id to uniquely identify session / items in basket and used on the return call to write order to database, update stock levels etc
$txn_value_excl_tax
$shipping
$tax
$grand_total

后续PHP代码的相关部分如下所示:

<?php
include 'createClientToken.php';
?>

<script src="https://www.paypal.com/sdk/js?components=hosted-fields,buttons&client-id=MyClientID&currency=GBP&disable-funding=credit" data-client-token='<?=$clientToken?>'></script>

<DIV id="paypal-button-container" style="width:120px;"></DIV>

<SCRIPT>
paypal.Buttons({
    createOrder:function(data,actions) {
        return actions.order.create({
            purchase_units:[{
                custom_id:"<? echo $seid;?>",
                amount:{
                    ...
                },
            }]
        });
    },

    onApprove: function(data, actions) {
        return actions.order.capture().then(function(details) {
            // only invokes code below if order is successful?

            var txn_status  = details.status;
            var custom_id   = details.purchase_units[0].custom_id;
            var given_name  = details.payer.name.given_name;

alert("Status: "+txn_status);

                // need to write order to database & display order confirmation
            return fetch('completed.php', {
                method: 'post',
                headers: {
                    'content-type': 'application/json'
                },
                body: JSON.stringify({
                    orderID: data.orderID
                })
            });
        });
    },

    onCancel: function (data) {
        alert("USER CANCELLED");
    }

}).render('#paypal-button-container');

</SCRIPT>

我相信上面的代码一切都很好,因为它成功地提醒了交易状态(txn_status)并且据我所知在控制台日志中没有出现任何错误。

completed.php 看起来像这样:

<?php

$orderID = json_decode($_POST['orderID']);
$custom_ID = json_decode($_POST['custom_ID']);

    session_start();
    include_once("myroutines.php");  // connect to db within here and assign to $conn
    connect();

    $write_txn = "update transactions set checked_out='true' where custom_ID='$custom_ID';";
    mysql_query($write_txn, $conn) or die(mysql_error());

?>

但是completed.php中的代码向数据库写入了一个空白

custom_ID
。据我所知,
$orderID
也是空白的,因为我已经测试过用
$orderID
更新表中的现有行,所以看起来我在检索 JSON 信息的方式上失败了。有人有一个具体代码片段应该是什么样子的工作示例,而不是仅仅向我指出一个通用的“为 PHP 解析 JSON 的方法”吗?

我已经花了几天时间尝试通过 PP 文档来实现这一点,尽管看起来一个操作方法链接到另一个引用 PP 404 页面的同样抽象的操作方法。我还在 Stack 上查看了其他类似的问题,这对我有进一步的帮助,但我仍然缺少这个关键的拼图。 PP 极其复杂的集成 (imo) 和缺乏明确的操作方法促使我提供了 Square 的第二个结帐选项,我希望它会更直观,但我想把它弄好并先跑。

php paypal sdk integration checkout
1个回答
0
投票

2023 更新:actions.order.create 和 actions.order.capture 现在也已弃用,不应用于任何新的集成,period

--

如果要写入数据库,请不要使用 actions.order.create,也不要使用 actions.order.capture。那些用于客户端操作,并且在付款完成后从客户端与您的服务器通信是完全糟糕的设计。

相反,使用 v2/checkout/orders API 并在您的服务器上创建两条路由(url 路径),一条用于“创建订单”,另一条用于“捕获订单”。您可以将(最近弃用的)Checkout-PHP-SDK 用于路由对 PayPal 的 API 调用,或者您自己的 HTTPS 实现,首先获取访问令牌然后进行调用。这两个路由都应该返回/输出only JSON 数据(没有 HTML 或文本)。在第二条路线中,当捕获 API 成功时,您应该验证金额是否正确并将其生成的付款详细信息存储在您的数据库中(特别是

purchase_units[0].payments.captures[0].id
,这是 PayPal 交易 ID)并执行任何必要的业务逻辑(例如保留产品或发送电子邮件)立即before转发返回JSON给前端调用者。如果发生错误,也转发它的 JSON 详细信息,因为前端必须处理这种情况。

将这两条路线与此前端批准流程配对:https://developer.paypal.com/demo/checkout/#/pattern/server。 (如果您需要从客户端向服务器发送任何其他数据,例如项目数组或选定的选项,请将

body
参数添加到提取中,其值为 JSON 字符串或对象)


注意:你上面的代码应该被丢弃,因为你应该在写入数据库时始终在服务器上捕获,但它做错的另一件事是存储订单 ID 而不是捕获 ID。订单 ID 仅在批准期间使用,一旦被捕获就没有价值,因为它不是 将显示在 PayPal 帐户/报告中并用于会计的交易 ID。

© www.soinside.com 2019 - 2024. All rights reserved.