首页 > 解决方案 > Laravel + Paypal + cUrl + 离子

问题描述

我希望你能帮助我解决我在 Laravel 中尝试将 curl 与 Paypal 一起使用时遇到的问题。我正在将它与 Ionic 集成。当我按下按钮购买时它会中断,并且应用程序会出现以下错误:

无法获取/未定义。

我正在学习教程,结果应该是通过按下按钮购买,应用程序会将用户重定向到 Paypal。请注意,在我按下按钮时出现错误后,控制台在开发人员工具上变为空白(可能是因为它试图将用户重定向到应用程序外部的贝宝?),所以我无法真正进一步调查错误,但是在它变空白之前我可以在一瞬间看到的是我提到的那些!

下面的代码与我正在关注的教程完全相同,我知道它可能不会说太多,因为其他地方可能存在问题,但就是这样。我将代码粘贴到 Laravel api.php 文件中,我得到的错误显示了输出:“error purchase!- 1”,这是我在 Laravel 的倒数第二个“else”块中打印的消息代码,这可能是我无法捕捉到的问题的暗示。我还将该函数粘贴到调用 api 的 ionic 应用程序中。

我知道我可能会提供有限的信息,所以让我知道您需要什么其他信息,或者甚至帮助我如何进一步调试,将不胜感激!

Route::middleware('auth:api')->post('/paypal', function (Request $request) {
    $user = $request->user();
    $data = $request->all();
    $list_products_id = $data;

    $products = [];
    $total = 0;

    $titles = '';

    foreach($list_products_id as $key => $value) {
        $product = Product::find($value);
        if($product){
            $products[$key] = $product;
            $total += $product->price;
            $titles .= $product->title." ";
        } 
    }

    if($total){

        $paypal = config('app.paypal', "sandbox");

       if($paypal == "sandbox"){
            $userProvider = '';
            $pwdProvider = '';
            $signProvider = '';
            $url = 'https://api-3t.sandbox.paypal.com/nvp';
            $url2 = 'https://www.sandbox.paypal.com/cgi-bin/webscr?%s';

       } else {
            $userProvider = '';
            $pwdProvider = '';
            $signProvider = '';   
            $url = 'https://api-3t.paypal.com/nvp';
            $url2 = 'https://www.paypal.com/cgi-bin/webscr?%s';
       }

       $data = [];
       $data['USER'] = $userProvider;
       $data['PWD'] = $pwdProvider;
       $data['SIGNATURE'] = $signProvider;
       $data['METHOD'] = 'SetExpressCheckout';
       $data['VERSION'] = '108';
       $data['LOCALECODE'] = 'en_US';

       $data['L_PAYMENTREQUEST_0_NAME0'] = "Products Orders";
       $data['L_PAYMENTREQUEST_0_DESC0'] = $titles;

       $data['PAYMENTREQUEST_0_AMT'] = number_format($total, 2).'';

       $data['PAYMENTREQUEST_0_CURRENCYCODE'] = 'EUR';
       $data['PAYMENTREQUEST_0_PAYMENTACTION'] = 'Sale';

       $data['L_PAYMENTREQUEST_0_QTY0'] = '100'; //number of the same product the user is ordering
       $data['L_PAYMENTREQUEST_0_AMT0'] = number_format($total, 2).'';

       $data['L_BILLINGAGREEMENTDESCRIPTION0'] = $titles;

       $data['CANCELURL'] = url('/');
       $data['RETURNURL'] = url('/');

      // curl

      $data = http_build_query($data);

      $curl = curl_init();
      curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
      curl_setopt($curl, CURLOPT_POST, true);
      curl_setopt($curl, CURLOPT_URL, $url);
      curl_setopt($curl, CURLOPT_POSTFIELDS, $data);

      $response =  curl_exec($curl);
      curl_close($curl);

      $nvp = array();

      if (preg_match_all('/(?<name>[^\=]+)\=(?<value>[^&]+)&?/', $response, $matches)) {
          foreach ($matches['name'] as $offset => $name) {
              $nvp[$name] = urldecode($matches['value'][$offset]);
          }
      }

      if(isset($nvp['ACK']) && $nvp['ACK'] == "Success" ){
        $query = array(
                'cmd'    => '_express-checkout',
                'token'  => $nvp['TOKEN']
            );

            $redirectURL = sprintf($url2, http_build_query($query));

            return ['date'=>$redirectURL];
      }else{
        return ['status'=>'error purchasing! - 1'];

      }

    }

    echo "total: " . $total;
    return ['status'=>'error purchasing! - 2'];
});

下面是离子代码:

purchase() {
    console.log("Order");
    if (!this.user) {
      this.navCtrl.push(LoginPage);
      return;
    }
    this.cartProvider.purchase(this.cart, this.user).subscribe(
      res => {
        if (res) {
          console.log(res);
          // this.showToast("top", "Checkout completed successfully!");
          window.location.href = res.date;
          this.removeAll();
        }
      },
      error => {
        console.log("Error: " + error);
        this.showToast("top", "Error checking out");
      }
    );
  }

标签: phplaravelionic-frameworkpaypal

解决方案


@BizzyBob 感谢您的建议,最后发现我为参数添加了错误的值:

$data['L_PAYMENTREQUEST_0_QTY0'] = '1';

以前我有:

$data['L_PAYMENTREQUEST_0_QTY0'] = '100';

将其更改为“1”解决了该问题。在我看来真的很难发现,因为我们一直在其他地方寻找解决方案......所以,只是快速提醒任何人总是仔细检查参数值等等,因为它们可能会导致您可能正在尝试的错误在完全不同的地方调试!


推荐阅读