我希望一些知识渊博的人能够解释我在下面的代码中出错的地方。
我正在尝试从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¤cy=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的结账选项,我希望这将是更直观的,但我想让这个启动和运行第一。
1条答案
按热度按时间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。