PayPal 单笔付款到电子邮件

Posted

技术标签:

【中文标题】PayPal 单笔付款到电子邮件【英文标题】:PayPal Single Payout to an Email 【发布时间】:2018-07-27 18:54:35 【问题描述】:

我正在尝试集成 PayPal 的付款选项,以便能够通过提供电子邮件直接向用户付款。

我正在通过带有 POST 方法的表单调用控制器函数,在调用 simplePay 函数后,我得到的只是一个空白页,我想知道我所做的是否正确、不完整(以及它的缺乏)或错误(我做错了什么)。

我的研究基于 Paypal 文档提供的代码示例。 https://github.com/paypal/PayPal-php-SDK/blob/master/sample/payouts/CreateBatchPayout.php

路线:

Route::post('/simplePay', 'PaypalController@simplePay');

控制器:

    <?php
    namespace App\Http\Controllers;

    use Illuminate\Http\Request;
    use PayPal\Rest\ApiContext;
    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\Transaction;
    use PayPal\Api\RedirectUrls;
    use PayPal\Api\ExecutePayment;
    use PayPal\Api\PaymentExecution;
    use PayPal\Auth\OAuthTokenCredential;

    class PaypalController extends Controller
    

      private $_api_context;
        public function __construct()
        
            // setup PayPal api context
            $paypal_conf = \Config::get('paypal');
            $this->_api_context = new ApiContext(new OAuthTokenCredential($paypal_conf['client_id'], $paypal_conf['secret']));
            $this->_api_context->setConfig($paypal_conf['settings']);
        
        public function simplePay()
        
            $payouts = new \PayPal\Api\Payout();
            $senderBatchHeader = new \PayPal\Api\PayoutSenderBatchHeader();
            $senderBatchHeader->setSenderBatchId(uniqid())->setEmailSubject("You have a Payout!");
            $senderItem = new \PayPal\Api\PayoutItem();
            $senderItem->setRecipientType('Email')->setNote('Thanks for your patronage!')->setReceiver('email@gmail.com')->setSenderItemId("001")->setAmount(new \PayPal\Api\Currency('
                                    "value":"1.00",
                                    "currency":"MXN"
                                '));
            $payouts->setSenderBatchHeader($senderBatchHeader)->addItem($senderItem);
            $request = clone $payouts;
            try 
                $output = $payouts->createSynchronous($this->_api_context);
             catch (\Exception $ex) 
                //  \ResultPrinter::printError("Created Single Synchronous Payout", "Payout", null, $request, $ex);
                exit(1);
            
            // \ResultPrinter::printResult("Created Single Synchronous Payout", "Payout", $output->getBatchHeader()->getPayoutBatchId(), $request, $output);
            return $output;
        
    

调用控制器:

                    <div class="row">
                        <form class="form-horizontal" role="form" enctype="multipart/form-data" method="POST" action=" url('/simplePay') ">
                        csrf_field()

                        <input type="submit" name="submit" value="Pay">
                        </form>

                    </div>

paypal.php - 应用程序/配置文件 - 以防万一:

<?php
return array(
    // set your paypal credential
    'client_id' => 'AXs...',
    'secret' => 'AHE...',

    /**
     * SDK configuration
     */
    'settings' => array(
        /**
         * Available option 'sandbox' or 'live'
         */
        'mode' => 'sandbox',

        /**
         * Specify the max request time in seconds
         */
        'http.ConnectionTimeOut' => 12000,

        /**
         * Whether want to log to a file
         */
        'log.LogEnabled' => true,

        /**
         * Specify the file that want to write on
         */
        'log.FileName' => storage_path() . '/logs/paypal.log',

        /**
         * Available option 'FINE', 'INFO', 'WARN' or 'ERROR'
         *
         * Logging is most verbose in the 'FINE' level and decreases as you
         * proceed towards ERROR
         */
        'log.LogLevel' => 'FINE'
    ),
);

【问题讨论】:

您的代码在抛出错误时终止执行,这就是您看到空白页的原因,您应该将exit(1); 替换为dd($ex); 之类的内容,然后从那里进行调试。对于这样一个一般性问题,我们无法为您提供帮助,您需要自己进行基本调试,然后根据具体问题更新您的问题。 okidoki 让我尝试调试,如有任何疑问,我会发布!谢谢你的建议。 这是错误:SYNC_MODE_NOT_APPLICABLE - "message":"同步模式将很快被弃用,并且不再可用于新的集成。您可以通过在请求中指定 sync_mode= false 来使用异步模式。 " "developer.paypal.com/docs/api/payments.payouts-batch/#errors" 通过在 /vendor/paypal/rest-api-sdk-php/lib/PayPal/Api/Payout.php 上编辑同步模式解决 :) 谢谢 SAM! @ChristianPérezCadavid 感谢您的跟进,您帮助了我! 【参考方案1】:

PayPal 同步模式不适用于新的集成。如果您通过 "sync_mode = true",现有集成将继续运行。

要解决这个问题,你需要传递"sync_mode = false"所以而不是

$output = $payouts->createSynchronous($this->_api_context);

使用以下内容:

$output = $payouts->create(array('sync_mode' => 'false'), $this->_api_context);

【讨论】:

以上是关于PayPal 单笔付款到电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

PayPal 直接支付 PHP 代码

Paypal 一次性购买和定期付款,通过 rest api 使用快速结帐在单笔交易中进行

贝宝:快速结帐。在单笔交易中设置一次性付款和定期付款

使用 Paypal 网站付款标准购买后显示用户的电子邮件

付款后发送邮件 paypal 联系表 7

在 PayPal 的 REST API 中执行付款后,有时我没有收到电子邮件