Example #1
0
 /**
  * @param object invest instancia del aporte: id, usuario, proyecto, cuenta, cantidad
  *
  * Método para crear un preapproval para un aporte
  * va a mandar al usuario a paypal para que confirme
  *
  * @TODO poner límite máximo de dias a lo que falte para los 40/80 dias para evitar las cancelaciones
  */
 public static function preapproval($invest, &$errors = array())
 {
     try {
         $project = Project::getMini($invest->project);
         /* The returnURL is the location where buyers return when a
            payment has been succesfully authorized.
            The cancelURL is the location buyers are sent to when they hit the
            cancel button during authorization of payment during the PayPal flow                 */
         $URL = NODE_ID != GOTEO_NODE ? NODE_URL : SITE_URL;
         $returnURL = $URL . "/invest/confirmed/" . $invest->project . "/" . $invest->id;
         // a difundirlo @TODO mensaje gracias si llega desde un preapproval
         $cancelURL = $URL . "/invest/fail/" . $invest->project . "/" . $invest->id . "/?amount=" . $invest->amount;
         // a la página de aportar para intentarlo de nuevo
         date_default_timezone_set('UTC');
         $currDate = getdate();
         $hoy = $currDate['year'] . '-' . $currDate['mon'] . '-' . $currDate['mday'];
         $startDate = strtotime($hoy);
         $startDate = date('Y-m-d', mktime(date('h', $startDate), date('i', $startDate), 0, date('m', $startDate), date('d', $startDate), date('Y', $startDate)));
         $endDate = strtotime($hoy);
         $endDate = date('Y-m-d', mktime(0, 0, 0, date('m', $endDate) + 5, date('d', $endDate), date('Y', $endDate)));
         // sí, pongo la fecha de caducidad de los preapprovals a 5 meses para tratar incidencias
         /* Make the call to PayPal to get the preapproval token
            If the API call succeded, then redirect the buyer to PayPal
            to begin to authorize payment.  If an error occured, show the
            resulting errors
            */
         $preapprovalRequest = new \PreapprovalRequest();
         $preapprovalRequest->memo = "Aporte de {$invest->amount} EUR al proyecto: {$project->name}";
         $preapprovalRequest->cancelUrl = $cancelURL;
         $preapprovalRequest->returnUrl = $returnURL;
         $preapprovalRequest->clientDetails = new \ClientDetailsType();
         $preapprovalRequest->clientDetails->customerId = $invest->user->id;
         $preapprovalRequest->clientDetails->applicationId = PAYPAL_APPLICATION_ID;
         $preapprovalRequest->clientDetails->deviceId = PAYPAL_DEVICE_ID;
         $preapprovalRequest->clientDetails->ipAddress = $_SERVER['REMOTE_ADDR'];
         $preapprovalRequest->currencyCode = "EUR";
         $preapprovalRequest->startingDate = $startDate;
         $preapprovalRequest->endingDate = $endDate;
         $preapprovalRequest->maxNumberOfPayments = 1;
         $preapprovalRequest->displayMaxTotalAmount = true;
         $preapprovalRequest->feesPayer = 'EACHRECEIVER';
         $preapprovalRequest->maxTotalAmountOfAllPayments = $invest->amount;
         $preapprovalRequest->requestEnvelope = new \RequestEnvelope();
         $preapprovalRequest->requestEnvelope->errorLanguage = "es_ES";
         $ap = new \AdaptivePayments();
         $response = $ap->Preapproval($preapprovalRequest);
         if (strtoupper($ap->isSuccess) == 'FAILURE') {
             Invest::setDetail($invest->id, 'paypal-conection-fail', 'Ha fallado la comunicacion con paypal al iniciar el preapproval. Proceso libary/paypal::preapproval');
             $errors[] = 'No se ha podido iniciar la comunicación con paypal para procesar la preaprovación del cargo. ' . $ap->getLastError();
             @mail(\GOTEO_FAIL_MAIL, 'Error fatal en comunicacion Paypal API', 'ERROR en ' . __FUNCTION__ . ' ap->success = FAILURE.<br /><pre>' . print_r($ap, 1) . '</pre><pre>' . print_r($response, 1) . '</pre>' . $ap->getLastError());
             return false;
         }
         // Guardar el codigo de preaproval en el registro de aporte y mandarlo a paypal
         $token = $response->preapprovalKey;
         if (!empty($token)) {
             Invest::setDetail($invest->id, 'paypal-init', 'Se ha iniciado el preaproval y se redirije al usuario a paypal para aceptarlo. Proceso libary/paypal::preapproval');
             $invest->setPreapproval($token);
             $payPalURL = PAYPAL_REDIRECT_URL . '_ap-preapproval&preapprovalkey=' . $token;
             throw new \Goteo\Core\Redirection($payPalURL, Redirection::TEMPORARY);
             return true;
         } else {
             Invest::setDetail($invest->id, 'paypal-init-fail', 'Ha fallado al iniciar el preapproval y no se redirije al usuario a paypal. Proceso libary/paypal::preapproval');
             $errors[] = 'No preapproval key obtained. <pre>' . print_r($response, 1) . '</pre>';
             @mail(\GOTEO_FAIL_MAIL, 'Error fatal en comunicacion Paypal API', 'ERROR en ' . __FUNCTION__ . ' No preapproval key obtained.<br /><pre>' . print_r($response, 1) . '</pre>');
             return false;
         }
     } catch (Exception $ex) {
         $fault = new \FaultMessage();
         $errorData = new \ErrorData();
         $errorData->errorId = $ex->getFile();
         $errorData->message = $ex->getMessage();
         $fault->error = $errorData;
         Invest::setDetail($invest->id, 'paypal-init-fail', 'Ha fallado al iniciar el preapproval y no se redirije al usuario a paypal. Proceso libary/paypal::preapproval');
         $errors[] = 'Error fatal en la comunicación con Paypal, se ha reportado la incidencia. Disculpe las molestias.';
         @mail(\GOTEO_FAIL_MAIL, 'Error fatal en comunicacion Paypal API', 'ERROR en ' . __FUNCTION__ . '<br /><pre>' . print_r($fault, 1) . '</pre>');
         return false;
     }
 }
 /**
  * Gets PayPal preapproval needed for the challenge
  */
 function get_preapproval_key(Challenge $challenge)
 {
     $amount = "50.00";
     // FIXME: calculate maximum amount that challenger may need to pay out (donation + challenge)
     error_reporting(E_ALL & ~E_STRICT);
     $token = '';
     $startDate = date('Y-m-d');
     $endDate = date('Y-m-d', time() + 3600 * 24 * 30 * 6);
     // FIXME: use real months
     $preapprovalRequest = new PreapprovalRequest();
     $preapprovalRequest->memo = "To be paid to charity if challenge is met";
     $preapprovalRequest->cancelUrl = $this->abs_url('cancel') . '?preapprovalKey=${preapprovalKey}';
     $preapprovalRequest->returnUrl = $this->abs_url('ok') . '?preapprovalKey=${preapprovalKey}';
     $preapprovalRequest->clientDetails = $this->clientDetails();
     $preapprovalRequest->currencyCode = self::CURRENCY;
     $preapprovalRequest->startingDate = $startDate;
     $preapprovalRequest->endingDate = $endDate;
     //		$preapprovalRequest->maxNumberOfPayments = "10" ;
     $preapprovalRequest->maxTotalAmountOfAllPayments = $amount;
     $preapprovalRequest->requestEnvelope = new RequestEnvelope();
     $preapprovalRequest->requestEnvelope->errorLanguage = "en_US";
     //default it is en_US, which is the only language currently supported
     $ap = new AdaptivePayments();
     $response = $ap->Preapproval($preapprovalRequest);
     if (strtoupper($ap->isSuccess) == 'FAILURE') {
         $FaultMsg = $ap->getLastError();
         $error = is_array($FaultMsg->error) ? $FaultMsg->error[0] : $FaultMsg->error;
         throw new Exception("Transaction Preapproval Failed: error Id: " . $error->errorId . ", error message: " . $error->message);
     } else {
         error_reporting(E_ALL | E_STRICT);
         return $response->preapprovalKey;
     }
 }
function Preapproval()
{
    $token = '';
    $currDate = getdate();
    $startDate = $currDate['year'] . '-' . $currDate['mon'] . '-' . $currDate['mday'];
    $startDate = strtotime($startDate);
    $startDate = date('Y-m-d', mktime(0, 0, 0, date('m', $startDate), date('d', $startDate), date('Y', $startDate)));
    $endDate = add_date($startDate, 1);
    $returnURL = 'http://www.paypal.com';
    $cancelURL = 'http://www.paypal.com';
    $preapprovalRequest = new PreapprovalRequest();
    $preapprovalRequest->cancelUrl = $cancelURL;
    $preapprovalRequest->returnUrl = $returnURL;
    $preapprovalRequest->clientDetails = new ClientDetailsType();
    $preapprovalRequest->clientDetails->applicationId = "APP-80W284485P519543T";
    $preapprovalRequest->clientDetails->deviceId = "PayPal_PHP_SDK";
    $preapprovalRequest->clientDetails->ipAddress = "127.0.0.1";
    $preapprovalRequest->currencyCode = "USD";
    $preapprovalRequest->startingDate = $startDate;
    $preapprovalRequest->endingDate = $endDate;
    $preapprovalRequest->maxNumberOfPayments = "10";
    $preapprovalRequest->maxTotalAmountOfAllPayments = "50.00";
    $preapprovalRequest->requestEnvelope = new RequestEnvelope();
    $preapprovalRequest->requestEnvelope->errorLanguage = "en_US";
    $preapprovalRequest->senderEmail = "*****@*****.**";
    $ap = new AdaptivePayments();
    $response = $ap->Preapproval($preapprovalRequest);
    if (strtoupper($ap->isSuccess) == 'FAILURE') {
        $FaultMsg = $ap->getLastError();
        echo "Transaction Preapproval Failed: error Id: ";
        if (is_array($FaultMsg->error)) {
            echo $FaultMsg->error[0]->errorId . ", error message: " . $FaultMsg->error[0]->message;
        } else {
            echo $FaultMsg->error->errorId . ", error message: " . $FaultMsg->error->message;
        }
    } else {
        $token = $response->preapprovalKey;
        echo "Preapproval Transaction Successful! Key is {$token} \n";
    }
    return $token;
}
function adaptivePreapproval()
{
    if (isset($_POST['btnSubmitPreapproval'])) {
        global $wpdb;
        $tz = get_option('timezone_string');
        if (empty($tz)) {
            $tz = 'UTC';
        }
        date_default_timezone_set($tz);
        //print_r($_POST);
        session_start();
        $payment_variables = array("fname" => $_POST['first_name'], "lname" => $_POST['last_name'], "email" => $_POST['email'], "address" => $_POST['address'], "country" => $_POST['country'], "state" => $_POST['state'], "city" => $_POST['city'], "zip" => $_POST['zip'], "product_id" => absint($_POST['project_id']), "level" => absint($_POST['level']), "prod_price" => str_replace(',', '', $_POST['price']));
        $preapproval_key = "";
        $project = new ID_Project($variables['product_id']);
        $post_id = $project->get_project_postid();
        $product_name = get_the_title($post_id);
        $_SESSION['ig_payment_variables'] = http_build_query($payment_variables);
        // Getting the Adaptive payment settings
        $adaptive_pay_settings = getAdaptivePayPalSettings();
        require_once 'paypal/lib/AdaptivePayments.php';
        // GETTING product default settings
        $default_prod_settings = getProductDefaultSettings();
        // Getting product settings and if they are not present, set the default settings as product settings
        $prod_settings = getProductSettings(absint(esc_attr($_POST['project_id'])));
        if (empty($prod_settings)) {
            $prod_settings = $default_prod_settings;
        }
        # Endpoint: this is the server URL which you have to connect for submitting your API request.
        //Chanege to https://svcs.paypal.com/  to go live */
        if ($adaptive_pay_settings->paypal_mode == "sandbox") {
            define('API_BASE_ENDPOINT', 'https://svcs.sandbox.paypal.com/AdaptivePayments/Preapproval/');
            define('PAYPAL_REDIRECT_URL', 'https://www.sandbox.paypal.com/webscr&cmd=_ap-preapproval&preapprovalkey=' . $preapproval_key);
            $app_id = "APP-80W284485P519543T";
        } else {
            define('API_BASE_ENDPOINT', 'https://svcs.paypal.com/AdaptivePayments/Preapproval/');
            define('PAYPAL_REDIRECT_URL', 'https://www.paypal.com/webscr&cmd=_ap-preapproval&preapprovalkey=' . $preapproval_key);
            $app_id = $adaptive_pay_settings->app_id;
        }
        /***** 3token API credentials *****************/
        define('API_AUTHENTICATION_MODE', '3token');
        define('API_USERNAME', $adaptive_pay_settings->api_username);
        define('API_PASSWORD', $adaptive_pay_settings->api_password);
        define('API_SIGNATURE', $adaptive_pay_settings->api_signature);
        define('X_PAYPAL_APPLICATION_ID', $app_id);
        require_once 'paypal/lib/Config/paypal_sdk_clientproperties.php';
        $returnURL = site_url() . "/?payment_success=1&product_id=" . absint(esc_attr($_POST['project_id']));
        $cancelURL = site_url() . "/?payment_cancel=1";
        $notifyURL = esc_url(site_url()) . "/?ipn_handler=1&type=paypal_preauth&" . $_SESSION['ig_payment_variables'];
        $currencyCode = $prod_settings->currency_code;
        $senderEmail = esc_attr($_POST['email']);
        $preauth = new PreapprovalRequest();
        $preauth->cancelUrl = $cancelURL;
        $preauth->ipnNotificationUrl = $notifyURL;
        $preauth->returnUrl = $returnURL;
        $preauth->currencyCode = $currencyCode;
        $preauth->maxNumberOfPayments = "1";
        $preauth->maxNumberofPaymentsPerPeriod = 1;
        $preauth->endingDate = date("Y-m-d\\Z", strtotime("+ 364 day"));
        $preauth->startingDate = date('Y-m-d\\Z');
        $preauth->maxTotalAmountOfAllPayments = esc_attr(str_replace(',', '', $_POST['price']));
        $preauth->memo = $product_name . ' pledge of ' . number_format($_POST['price'], 2, '.', ',') . ' ' . $currencyCode;
        $preauth->clientDetails = new ClientDetailsType();
        $preauth->clientDetails->applicationId = $app_id;
        //$preauth->clientDetails->deviceId = DEVICE_ID;
        //$preauth->clientDetails->ipAddress = "127.0.0.1";
        //$preapprovalRequest->maxNumberOfPayments = $maxNumberOfPayments;
        //$preapprovalRequest->maxTotalAmountOfAllPayments = $maxTotalAmountOfAllPayments;
        $preauth->requestEnvelope = new RequestEnvelope();
        $preauth->requestEnvelope->errorLanguage = "en_US";
        $preauth->senderEmail = $senderEmail;
        $ap = new AdaptivePayments();
        $response = $ap->Preapproval($preauth);
        //print_r($preauth);
        //print_r($response);
        //print_r($ap);
        if (strtoupper($ap->isSuccess) == 'FAILURE') {
            $fault = $ap->getLastError();
            // For error handling
            if (is_array($fault->error)) {
                $errors_content = '<table width =\\"450px\\" align=\\"center\\">';
                foreach ($fault->error as $err) {
                    $errors_content .= '<tr>';
                    $errors_content .= '<td>';
                    $errors_content .= 'Error ID: ' . $err->errorId . '<br />';
                    $errors_content .= 'Domain: ' . $err->domain . '<br />';
                    $errors_content .= 'Severity: ' . $err->severity . '<br />';
                    $errors_content .= 'Category: ' . $err->category . '<br />';
                    $errors_content .= 'Message: ' . $err->message . '<br />';
                    if (empty($err->parameter)) {
                        $errors_content .= '<br />';
                    } else {
                        $errors_content .= 'Parameter: ' . $err->parameter . '<br /><br />';
                    }
                    $errors_content .= '</td>';
                    $errors_content .= '</tr>';
                }
                $errors_content .= '</table>';
            } else {
                $errors_content = 'Error ID: ' . $fault->error->errorId . '<br />';
                $errors_content .= 'Domain: ' . $fault->error->domain . '<br />';
                $errors_content .= 'Severity: ' . $fault->error->severity . '<br />';
                $errors_content .= 'Category: ' . $fault->error->category . '<br />';
                $errors_content .= 'Message: ' . $fault->error->message . '<br />';
                if (empty($fault->error->parameter)) {
                    $errors_content .= '</br>';
                } else {
                    $errors_content .= 'Parameter: ' . $fault->error->parameter . '<br /><br />';
                }
            }
            $_SESSION['paypal_errors_content'] = $errors_content;
        } else {
            // Redirect to paypal.com here
            $_SESSION['preapprovalKey'] = $response->preapprovalKey;
            $token = $response->preapprovalKey;
            $payPalURL = PAYPAL_REDIRECT_URL . '_ap-preapproval&preapprovalkey=' . $token;
            echo '<script type="text/javascript">window.location="' . $payPalURL . '";</script>';
        }
    }
}
    $preapprovalRequest->cancelUrl = $cancelURL;
    $preapprovalRequest->returnUrl = $returnURL;
    $preapprovalRequest->clientDetails = new ClientDetailsType();
    $preapprovalRequest->clientDetails->applicationId = APPLICATION_ID;
    $preapprovalRequest->clientDetails->deviceId = DEVICE_ID;
    $preapprovalRequest->clientDetails->ipAddress = "127.0.0.1";
    $preapprovalRequest->currencyCode = $currencyCode;
    $preapprovalRequest->startingDate = $startingDate;
    $preapprovalRequest->endingDate = $endingDate;
    $preapprovalRequest->maxNumberOfPayments = $maxNumberOfPayments;
    $preapprovalRequest->maxTotalAmountOfAllPayments = $maxTotalAmountOfAllPayments;
    $preapprovalRequest->requestEnvelope = new RequestEnvelope();
    $preapprovalRequest->requestEnvelope->errorLanguage = "en_US";
    $preapprovalRequest->senderEmail = $senderEmail;
    $ap = new AdaptivePayments();
    $response = $ap->Preapproval($preapprovalRequest);
    if (strtoupper($ap->isSuccess) == 'FAILURE') {
        //Redirecting to APIError.php to display errors.
        $_SESSION['FAULTMSG'] = $ap->getLastError();
        $location = "APIError.php";
        header("Location: {$location}");
    } else {
        // Redirect to paypal.com here
        $_SESSION['preapprovalKey'] = $response->preapprovalKey;
        $token = $response->preapprovalKey;
        $payPalURL = PAYPAL_REDIRECT_URL . '_ap-preapproval&preapprovalkey=' . $token;
        header("Location: " . $payPalURL);
    }
} catch (Exception $ex) {
    $fault = new FaultMessage();
    $errorData = new ErrorData();