4
votes

I'm using eCommerce. Once done payment it should be captured & after few days it should be processed or deducted from customers account.

Example: If the customer pays using Paypal initial it would be "Authorize" & after (Max 21 days) that particular transaction is converted in to "Sale" means processed.

Customers can pay using Credit Card. Can we achieve using Paypal or need to use another Payment Method?

As per my knowledge: In Paypal SDK API you have to create that Payment Again & then Process. But I already have Transaction Id. So need to create payment again right?

Paypal: How to Capture Authorized Payment?

http://paypal.github.io/PayPal-PHP-SDK/sample/doc/payments/AuthorizationCapture.html

1
If anyone can guide in detail or one who have achieved this. Can share their views. Thanks - Jackson

1 Answers

1
votes

Add in composer.json

"require": {
        "paypal/rest-api-sdk-php": "*"
    }

Look code example in yii

use Yii;
use yii\base\ErrorException;
use yii\helpers\ArrayHelper;
use yii\base\Component;
use yii\helpers\Url;

use PayPal\Api\Address;
use PayPal\Api\CreditCard;
use PayPal\Api\Amount;
use PayPal\Api\Payer;
use PayPal\Api\Payment;
use PayPal\Api\Transaction;
use PayPal\Api\FundingInstrument;
use PayPal\Auth\OAuthTokenCredential;
use PayPal\Api\Details;
use PayPal\Api\Item;
use PayPal\Api\ItemList;
use PayPal\Api\RedirectUrls;
use PayPal\Rest\ApiContext;


class Paypal extends Component
{
    public $clientId;
    public $clientSecret;
    public $currency;
    public $returnUrl;
    public $cancelUrl;
    public $intentType;
    public $config;

    public function pay($total, $shipping, $tax, $productName, $transactionDescription)
    {

        $apiContext = new ApiContext(
            new OAuthTokenCredential(
                $this->getClientId(),     // ClientID
                $this->getClientSecret()      // ClientSecret
            )
        );

        $apiContext->setConfig(ArrayHelper::merge(
            [
                'mode'                      => 'sandbox', // development (sandbox) or production (live) mode
                'http.ConnectionTimeOut'    => 30,
                'http.Retry'                => 1,
                'log.LogEnabled'            => YII_DEBUG ? 1 : 0,
                'log.FileName'              => Yii::getAlias('@runtime/logs/paypal.log'),
                'log.LogLevel'              => 'FINE',
                'validation.level'          => 'log',
                'cache.enabled'             => 'true'
            ], $this->getConfig())
        );

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

        if(($subtotal = $total - $shipping - $tax) < 0) {
          throw new ErrorException('Subtotal is negative');
        }

        $item = new Item();
        $item->setName($productName)
            ->setCurrency($this->getCurrency())
            ->setQuantity(1)
            ->setPrice($subtotal);

        $itemList = new ItemList();
        $itemList->addItem($item);

        $details = new Details();
        $details->setShipping($shipping)
            ->setTax($tax)
            ->setSubtotal($subtotal);

        $amount = new Amount();
        $amount->setCurrency($this->getCurrency())
            ->setTotal($total)
            ->setDetails($details);

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

        $redirectUrls = new RedirectUrls();
        $redirectUrls->setReturnUrl(Url::home(true) . Url::to([$this->getReturnUrl()]))
            ->setCancelUrl(Url::home(true) . Url::to([$this->getCancelUrl()]));

        $payment = new Payment();
        $payment->setIntent($this->getIntentType())
            ->setPayer($payer)
            ->setRedirectUrls($redirectUrls)
            ->setTransactions(array($transaction));

        try {
            $payment->create($apiContext);
        } catch (Exception $ex) {

        }

        return $payment;
    }

    /**
     * @return mixed
     */
    public function getClientId()
    {
        return $this->clientId;
    }

    /**
     * @return mixed
     */
    public function getClientSecret()
    {
        return $this->clientSecret;
    }

    /**
     * @return mixed
     */
    public function getCurrency()
    {
        return $this->currency;
    }

    /**
     * @return mixed
     */
    public function getReturnUrl()
    {
        return $this->returnUrl;
    }

    /**
     * @return mixed
     */
    public function getCancelUrl()
    {
        return $this->cancelUrl;
    }

    /**
     * @return mixed
     */
    public function getIntentType()
    {
        return $this->intentType;
    }

    /**
     * @return mixed
     */
    public function getConfig()
    {
        return $this->config;
    }



}