Braintree付款 - 检查交易状态

时间:2018-04-11 11:34:19

标签: php sql payment-gateway braintree

我正在创建我的第一个电子商务网站,并使用Braintree Payments作为网关。

我已将其设置为https://www.youtube.com/watch?v=dUAk5kwKfjs,以便现在接受付款,然后在DB中更新我的订单表,如下所示:

$result = Braintree_Transaction::sale([
    'amount' => $total,
    'orderId' => $order_id,
    'merchantAccountId' => $active_country_braintree,
    'paymentMethodNonce' => $nonce,
    'customer' => [
        'firstName' => $first_name,
        'lastName' => $last_name,
        'email' => $email
    ], 
    'options' => [
        'submitForSettlement' => true
    ]
]);

if ($result->success === true) {
    $transaction_id = $result->transaction->id;
    $params = [$transaction_id,$order_id];
    $sql = "UPDATE orders SET transaction_id=?, status='processing payment', date_last_status_change=now() WHERE id=?";
    $stmt = DB::run($sql,$params);
}else{
    $error = serialize($result->errors);
    $params = [$error,$order_id];
    $sql = "UPDATE orders SET errors=? WHERE id=?";
    $stmt = DB::run($sql,$params);
}

这项工作正常,所有付款都会发送到Braintree进行结算。但是,我希望能够向Braintree发送另一个请求(可能每天通过cron作业一次)以查看此事务是否已经解决或拒绝并正确更新我的数据库。

我一直试图通过查看Braintrees文档(https://developers.braintreepayments.com/reference/response/transaction/php#result-object)来解决这个问题,但我并没有真正理解它。

我想要的是能够将我存储的交易ID传递回Braintree并获取其状态。

$params = ['processing payment'];
$sql = "SELECT * FROM orders WHERE status=?";
$stmt = DB::run($sql,$params);
$orderCount = $stmt->rowCount();
if ($orderCount > 0) {
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){
        $id = $row["id"];
        $transaction_id = $row["transaction_id"];
        $order_id = $row["order_id"];

        // Pass transaction ID back to Braintree and get status
        // $result = Braintree_Transaction::sale($transaction_id);
        // var_dump($result);
    }
}

如果有人能给我任何帮助或帮助,我们将不胜感激。

2 个答案:

答案 0 :(得分:3)

完全披露:我在Braintree工作。如果您有任何其他问题,请与support

联系

如果您有事务ID,则可以通过将id传递到Transaction Find API Call并返回事务对象{和} querying the status来访问事务的状态:

$transaction = Braintree_Transaction::find("the_transaction_id");
$transaction->status;
// "settled"

话虽如此,通常不需要在交易销售电话中提交结算后查询交易的最终状态。

Settlement declined状态仅适用于PayPal销售,Paypal退款和信用卡退款。如果信用卡交易销售被授权并提交结算,它也将达到已解决的状态。即使对于PayPal交易,交易也会立即达到 Settlement Declined 状态,因此您也可以使用$transaction->status在交易销售电话后立即查询状态。

Settlement pending交易也只适用于PayPal交易,并且会在售后电话后立即达到该状态。它们可用于信用卡交易,但仅当您要求我们启用它时才会这样做。

答案 1 :(得分:0)

如果您的交易失败,您可以使用以下

获取错误报告
$result->errors->shallowAll(); 

它将返回错误详细信息和BraintreeErrorValidationcode。