* @author Julian van de Groep */ class Payments { /** * Container for the PayPal API * @var \PayPal\Rest\ApiContext */ private static $paypal; /** * Initialise the wrapper. */ public static function init(): void { // Set PayPal object self::$paypal = new \PayPal\Rest\ApiContext( new \PayPal\Auth\OAuthTokenCredential( config("paypal.client_id"), config("paypal.secret_id") ) ); // Set the configuration self::$paypal->setConfig([ 'mode' => config("paypal.mode"), ]); } /** * Create a new transaction. * @param float $total * @param string $itemName * @param string $transDescription * @param string $returnUrl * @return string */ public static function createTransaction(float $total, string $itemName, string $transDescription, string $returnUrl): string { // Create the payer object $payer = new Payer(); // Set the method $payer->setPaymentMethod('paypal'); // Create the item $item = new Item(); // Set the item details $item->setName($itemName) ->setCurrency('EUR') ->setQuantity(1) ->setPrice($total); // Create itemlist $list = new ItemList(); // Add the items $list->setItems([$item]); // Create details $details = new Details(); // Set details $details->setSubtotal($total); // Create amount $amount = new Amount(); // Set amount data $amount->setCurrency('EUR') ->setTotal($total) ->setDetails($details); // Create transaction $trans = new Transaction(); // Set transaction data $trans->setAmount($amount) ->setItemList($list) ->setDescription($transDescription) ->setInvoiceNumber(uniqid()); // Create redirect url object $redir = new RedirectUrls(); // Set redirect url data $redir->setReturnUrl($returnUrl . '?mode=finish&success=true') ->setCancelUrl($returnUrl . '?mode=finish&success=false'); // Create payment object $payment = new Payment(); // Set payment data (finally) $payment->setIntent('sale') ->setPayer($payer) ->setRedirectUrls($redir) ->setTransactions([$trans]); // Try to create payment try { $payment->create(self::$paypal); } catch (\Exception $ex) { return route('premium.error'); } // Return the approval link if everything is gucci return $payment->getApprovalLink(); } /** * Complete the PayPal transaction. * @param string $paymentId * @param string $payerId * @return bool */ public static function completeTransaction(string $paymentId, string $payerId): bool { // Attempt to get the payment $payment = Payment::get($paymentId, self::$paypal); // Create payment execution object $execute = new PaymentExecution(); // Set the payer ID $execute->setPayerId($payerId); // Attempt to charge the fucker try { $payment->execute($execute, self::$paypal); } catch (\Exception $ex) { return false; } // If everything was cute return true return true; } }