php PayPal结帐写入数据库onApprove

bvuwiixz  于 2023-05-21  发布在  PHP
关注(0)|答案(1)|浏览(142)

我希望一些知识渊博的人能够解释我在下面的代码中出错的地方。
我正在尝试从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文档来实现这一点,尽管看起来一个how-to链接到另一个同样抽象的how-to,它引用了一个PP 404页面。我也在Stack上看了其他类似的问题,这对我有很大的帮助,但我仍然错过了拼图中的这一关键部分。PP的可怕的过度复杂的集成(imo)和缺乏明确的操作方法激励我提供第二个与Square的结账选项,我希望这将是更直观的,但我想让这个启动和运行第一。

xwbd5t1u

xwbd5t1u1#

2023年更新:actions.order.create和actions.order.capture现在也不推荐使用,不应该用于任何新的集成,句号
当前的standard integration guide只有一个在服务器上创建和捕获订单的示例。该示例中给出的index.js位于node.js中,但它的两个后端路由当然可以用任何语言实现,包括PHP
(2022答案如下)
如果要写入数据库,请不要使用actions.order.create,也不要使用actions. order. capture。这些是客户端操作,在付款完成后从客户端与服务器通信是完全糟糕的设计。
相反,使用v2/checkout/orders API并在服务器上创建两个路由(url路径),一个用于“创建订单”,另一个用于“捕获订单”。您可以使用(最近已弃用的)Checkout-PHP-SDK来调用PayPal的路由API,或者使用您自己的HTTPS实现,首先获取访问令牌,然后进行调用。这两个路由都应该返回/输出onlyJSON数据(没有HTML或文本)。在第二个路由中,当捕获API成功时,您应该验证金额是否正确,并将其产生的付款详细信息存储在数据库中(特别是purchase_units[0].payments.captures[0].id,这是PayPal交易ID),并立即执行任何必要的业务逻辑(例如预订产品或发送电子邮件),然后将返回的JSON转发给前端调用者。如果发生错误,也要转发它的JSON细节,因为前端必须处理这种情况。
将这两条路由与此前端审批流程配对:https://developer.paypal.com/demo/checkout/#/pattern/server。(如果您需要从客户端向服务器发送任何其他数据,例如项目数组或选定的选项,请将body参数添加到fetch,其值为JSON字符串或对象)
注意:你上面的代码应该被丢弃,因为你应该在写入数据库时总是在服务器上捕获,但是它做错的另一件事是存储订单ID而不是捕获ID。订单ID仅在审批期间使用,一旦捕获就没有价值,因为它 * 不是 * 将显示在PayPal帐户/报告中并用于记账的交易ID。

相关问题