交易更新期间的 Paypal PHP SDK HTTP 错误

Posted

技术标签:

【中文标题】交易更新期间的 Paypal PHP SDK HTTP 错误【英文标题】:Paypal PHP SDK HTTP Error during a transaction update 【发布时间】:2015-06-26 13:25:48 【问题描述】:

我正在为一位朋友开发一个电子商务网站,并在执行付款之前使用运费更新 Paypal 的过程中,我收到以下错误。当我调用 Patch、PatchRequest,然后尝试执行付款时,会发生此错误。以下是全部代码:

if (Input::get('action', 'get') === "getDetails")  //Check to see if the action parameter is set to getDetails

      $payment = \PayPal\Api\Payment::get(Input::get('paymentId', 'get'), $paypalAPI);

      $payerInfo = $payment->getPayer()->payer_info;
      if (!empty($payment))
        $quantity = 0;
        foreach ($payment->transactions[0]->item_list->items as $item) 
          $quantity += $item->quantity;
        
        if ($quantity <= 20) 
          $parcelType = "MediumFlatRateBox";
         else if ($quantity > 20) 
          $parcelType = "LargeFlatRateBox";
        
        $shipment = \EasyPost\Shipment::create([
          'from_address' => \EasyPost\Address::retrieve(Config::get('easypost/addressObjectID')),
          'to_address' => [
            'name' => $payerInfo->shipping_address->recipient_name,
            'street1'=> $payerInfo->shipping_address->line1,
            'street2' => (isset($payerInfo->shipping_address->line2)) ? $payerInfo->shipping_address->line2 : null,
            'city' =>$payerInfo->shipping_address->city,
            'state' => $payerInfo->shipping_address->state,
            'country' => $payerInfo->shipping_address->country_code,
            'zip' => $payerInfo->shipping_address->postal_code,
            'email' => $payerInfo->email
          ],
          'parcel' => [
            'predefined_package' => $parcelType,
            'weight' => 520
          ]
        ]);
        //Grab the lowest shipping rate
        $shippingRate = $shipment->lowest_rate()->rate;
        //Make a call to PayPal updating our transaction with the tax and shipping rate
        $amount = $payment->transactions[0]->amount;
        $transactionUpdate = new \PayPal\Api\Patch();
        $transactionUpdate    ->setOp('replace')
                              ->setPath('transactions/0/amount')
                              ->setValue(json_decode('
                                "total": "'.$amount->total.'",
                                "currency":"USD",
                                "detail": 
                                  "subtotal": "'.$amount->details->subtotal.'",
                                  "shipping":"'.$shippingRate.'"
                                
                              '));


        //Instantiate a new instance of PayPal's Patch Request Class and Update the Transaction with the tax and shipping rate
        $updateRequest = new \PayPal\Api\PatchRequest();
        $updateRequest->setPatches(
          [$transactionUpdate]
        );
        //Attempt Update

        $result = $payment->update($updateRequest, $paypalAPI);

        if ($result) 
          $transID = generateTransactionID();
          $fields = [
            'dateCreated' => strtotime($payment->create_time),
            'transID' => $transID,
            'paymentID' => $payment->id,
            'shipmentID' => $shipment->id
          ];
          $db->insert('transactionLog', $fields);
          Redirect::to('shoppingCartFinalize.php?transID='.$transID);
          exit();
         else 
          Alert::set([
            'header' => "Uh Oh....Something Went Wrong",
            'message' => "Unable to update transaction. Transaction Cancelled. Please try again.",
            'type' => 'danger',
            'close' => 1
          ]);
          Redirect::to('shoppingCartView.php');
          exit();
        
      

以下是我在通话过程中遇到的错误:

致命错误:未捕获的异常 'PayPal\Exception\PayPalConnectionException' 带有消息'Got Http 访问时响应码 400 https://api.sandbox.paypal.com/v1/payments/payment/PAY-77N347011V970714EKU2D24Q.' 在 /var/www/html/myla-dev/vendor/paypal/rest-api-sdk-php/lib/PayPal/Core/PayPalHttpConnection.php:177 堆栈跟踪:#0 /var/www/html/myla-dev/vendor/paypal/rest-api-sdk-php/lib/PayPal/Transport/PayPalRestCall.php(74): PayPal\Core\PayPalHttpConnection->execute('["op":"replace...') #1 /var/www/html/myla-dev/vendor/paypal/rest-api-sdk-php/lib/PayPal/Common/PayPalResourceModel.php(103): PayPal\Transport\PayPalRestCall->execute(Array, '/v1/payments/pa...', 'PATCH', '["op":"replace...', NULL) #2 /var/www/html/myla-dev/vendor/paypal/rest-api-sdk-php/lib/PayPal/Api/Payment.php(474): PayPal\Common\PayPalResourceModel::executeCall('/v1/payments/pa...', 'PATCH', '["op":"replace...', NULL, Object(PayPal\Rest\ApiContext), NULL) #3 /var/www/html/myla-dev/apiProcessing.php(146): PayPal\Api\Payment->更新(对象(PayPal\Api\ in /var/www/html/myla-dev/vendor/paypal/rest-api-sdk-php/lib/PayPal/Core/PayPalHttpConnection.php 在第 177 行

更新:感谢 Thaer 的帮助。它有帮助。现在我得到一个单独的错误。当我尝试更新付款时,它现在显示以下内容:

数组 ( [名称] => PAYMENT_STATE_INVALID [message] => 由于当前付款状态,此请求无效 [信息链接] => https://developer.paypal.com/webapps/developer/docs/api/#PAYMENT_STATE_INVALID [debug_id] => 1b1b9b71e91d8)

如果你知道如何解决这个问题,请。我不知道如何更改状态以便更新付款。

如果您发现错误,请告诉我。我被卡住了,这不好笑。

戴夫·道格拉斯

【问题讨论】:

【参考方案1】:

请参考这个Answer 我认为您必须尝试 - 捕获您的代码以确定错误 ,问候。

【讨论】:

非常感谢。我用一些新信息更新了我的答案。你能帮忙吗?【参考方案2】:

首先,您能否确认付款是否已经执行?

请注意,它只能在执行完成之前更新。一旦执行付款,就无法更新。文档:https://developer.paypal.com/webapps/developer/docs/api/#update-a-payment-resource

您可以按照此处显示的代码在此处更新付款:http://paypal.github.io/PayPal-PHP-SDK/sample/doc/payments/UpdatePayment.html

而且我认为您的付款已经执行,因此 state 将是 complete 而不是 created,这导致了无效状态的 400 异常。

让我知道这是否有意义。

要更改付款,您可以创建退款以退还剩余金额。

或者,您也可以使用授权或订单,先持有资金,然后再实际收取费用。就像你在餐馆等地方看到的那样,他们持有你的总资金,但最终会在稍后添加小费,并在稍后完成交易。

更多信息请阅读:https://developer.paypal.com/webapps/developer/docs/integration/direct/create-process-order/

【讨论】:

如果没有在执行方法上调用我,如何执行付款。如果我得到付款的详细信息,付款的状态仍然是创建的,否则它将完成并且你的假设是正确的 因为您的代码直接显示 Payment:get,所以我假设您可能正在查看已执行的付款。如果不是这种情况,您可以在paypal-php-sdk.herokuapp.com/#payments 中尝试Update payment details 下显示的代码 这就是我遇到问题的地方。当我打电话更新它时,我得到了那个错误。我选择只更改电子结帐流程,并要求用户在致电 PayPal 之前输入运输信息,然后只需致电 PayPal 提供所有信息,而不必担心通过更新召回它们。 我们鼓励提前询问。这有助于用户了解他们究竟被收取了什么费用,但是,所有用例都不适合该模型。如果出于任何原因,您希望在捕获付款后延迟付款,那么提到的 Order 或 Capture 将非常适合。 感谢杰的帮助。

以上是关于交易更新期间的 Paypal PHP SDK HTTP 错误的主要内容,如果未能解决你的问题,请参考以下文章

PayPal REST API (PHP SDK) 成功交易未在沙盒模式下显示,在实时模式下显示

使用 Paypal php rest SDK 汇款

如何在贝宝结帐期间验证交易 ID (TXN)

Authorize.Net Paypal Express PHP API:交易未在 Authorize.Net 中更新,也未捕获正确金额的问题

获取 paypal 交易 ID - iOS SDK

通过 PayPal iOS SDK 进行的 PayPal 实时交易中的问题