访问https://api.sandbox.paypal.com

时间:2017-03-06 15:57:30

标签: php laravel paypal

我正在使用Paypal-SDK沙箱开发Laravel 5.2

我在调用主要是paypal类

时遇到此错误
  

例外:访问https://api.sandbox.paypal.com/v1/payments/payment时获得了Http响应代码400。

这是我的代码:

$payer = new Payer();
    $payer->setPaymentMethod('paypal');

    $inputs = (object) $request->all();
    $items = [];

    for ($i = 1; $i <= $request->input('items_number'); $i++) 
    { 
        $item_name = $request->input("item_name_$i");
        $item_quantity = $request->input("item_quantity_$i");
        $item_price = $request->input("item_price_$i");

        if(empty($item_price) || $item_price == 0){
            return redirect('/');
        }

        $item = new Item();
        $item->setName($item_name)
             ->setQuantity($item_quantity)
             ->setPrice($item_price)
             ->setCurrency('USD');

        $items[] = $item;
    }

    // add item to list
    $item_list = new ItemList();
    $item_list->setItems($items);


    // price of all items together
    $amount = new Amount();
    $amount->setCurrency('USD')
           ->setTotal($request->input('total_price'));

    // transaction
    $transaction = new Transaction();
    $transaction->setAmount($amount)
                ->setItemList($item_list)
                ->setDescription('This is just a demo transaction.');

    $redirect_urls = new RedirectUrls();
    $redirect_urls->setReturnUrl(URL::to('/paypal-payment/done'))
                  ->setCancelUrl(URL::to('/paypal-payment/cancel'));

    $payment = new Payment();
    $payment->setIntent('sale')
            ->setPayer($payer)
            ->setRedirectUrls($redirect_urls)
            ->setTransactions(array($transaction));

    try {
        $payment->create($this->_api_context);
    } catch (\PayPal\Exception\PayPalConnectionException $ex) {
        if (config('app.debug')) {
            echo "Exception: " . $ex->getMessage() . PHP_EOL;
            $err_data = json_decode($ex->getData(), true);
            exit;
        } else {
            die('Some error occur, Sorry for inconvenient');
        }
    }

    foreach($payment->getLinks() as $link) 
    {
        if($link->getRel() == 'approval_url') {
            $redirect_url = $link->getHref();
            break;
        }
    }

    /* here you could already add a database entry that a person started buying stuff (not finished of course) */
    Session::put('paypal_payment_id', $payment->getId());

    if(isset($redirect_url)) {
        // redirect to paypal
        return redirect()->away($redirect_url);
    }

    return 'This is some error';

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

在paypal上出现此类问题可能有两个主要原因请查看以下内容: -

1)检查您的子项目,税项,运费以及单项和多项,其总和应等于总数,即总计+税+运费=总计

2)检查你的returnUrl和cancelUrl应该没有空格和特殊字符使用urlencode。

下面的代码对我来说可以帮助你,我也浪费了很多时间: -

use PayPal\Api\Amount;
use PayPal\Api\Details;
use PayPal\Api\Item;
use PayPal\Api\ItemList;
use PayPal\Api\Payer;
use PayPal\Api\Payment;
use PayPal\Api\RedirectUrls;
use PayPal\Api\Transaction;
use PayPal\Rest\ApiContext;
use PayPal\Auth\OAuthTokenCredential;
// use these at the top of the class 


/**
     * Function     : paypalPay()
     * Description  : Used to pay the payment using paypal
     * Author       : kantsverma
     * Parameters   :
     */
    public function paypalPay()
    {       
        require_once(ROOT . DS . 'vendor' . DS . "autoload.php");       

        // integrate paypal 
        $apiContext = new \PayPal\Rest\ApiContext(
          new \PayPal\Auth\OAuthTokenCredential(
            'YOUR APPLICATION CLIENT ID',
            'YOUR APPLICATION CLIENT SECRET'
            )
        );

        $payer = new Payer();
        $payer->setPaymentMethod("paypal");
        //Itemized information (Optional) Lets you specify item wise information

        $item1 = new Item();
        $item1->setName('Ground Coffee 40 oz')
            ->setCurrency('USD')
            ->setQuantity(1)
            ->setPrice(17);

        $itemList = new ItemList();
        $itemList->setItems(array($item1));

        $details = new Details();
        $details->setShipping(1)
            ->setTax(2)
            ->setSubtotal(17);

        $amount = new Amount();
        $amount->setCurrency("USD")
            ->setTotal(20)
            ->setDetails($details);

        $transaction = new Transaction();
        $transaction->setAmount($amount)
            ->setItemList($itemList)
            ->setDescription("Payment description")
            ->setInvoiceNumber(uniqid());

        $baseUrl = $this->getBaseUrl();

        $redirectUrls = new RedirectUrls();
        $redirectUrls->setReturnUrl("$baseUrl")
            ->setCancelUrl("$baseUrl");

        $payment = new Payment();


        $payment->setIntent("order")
            ->setPayer($payer)
            ->setRedirectUrls($redirectUrls)
            ->setTransactions(array($transaction));
        //For Sample Purposes Only.

        $request = clone $payment;

        try {
            $paymentdetail = $payment->create($apiContext);
            echo '<pre>';
            print_r($paymentdetail);
            echo '</pre>';

            die('inside try ');
        } catch (Exception $ex) {
            //NOTE: PLEASE DO NOT USE RESULTPRINTER CLASS IN YOUR ORIGINAL CODE. FOR SAMPLE ONLY

            ResultPrinter::printError("Created Payment Order Using PayPal. Please visit the URL to Approve.", "Payment", null, $request, $ex);
            die('Inside catch');
        }
        //Get redirect url
        //The API response provides the url that you must redirect the buyer to. Retrieve the url from the $payment->getApprovalLink() method

        $approvalUrl = $payment->getApprovalLink();
        //NOTE: PLEASE DO NOT USE RESULTPRINTER CLASS IN YOUR ORIGINAL CODE. FOR SAMPLE ONLY

         ResultPrinter::printResult("Created Payment Order Using PayPal. Please visit the URL to Approve.", "Payment", "<a href='$approvalUrl' >$approvalUrl</a>", $request, $payment);

        return $payment;    
    }

我已经创建了上面的函数并调用了函数,你可以删除die和print_r()在try中它对我有效。