00001 <?php
00002
00016 import('classes.plugins.PaymethodPlugin');
00017
00018 class PayPalPlugin extends PaymethodPlugin {
00019
00024 function getName() {
00025 return 'Paypal';
00026 }
00027
00032 function getDisplayName() {
00033 return Locale::translate('plugins.paymethod.paypal.displayName');
00034 }
00035
00040 function getDescription() {
00041 return Locale::translate('plugins.paymethod.paypal.description');
00042 }
00043
00048 function register($category, $path) {
00049 if (parent::register($category, $path)) {
00050 if (!Config::getVar('general', 'installed') || defined('RUNNING_UPGRADE')) return null;
00051 $this->addLocaleData();
00052 $this->import('PayPalDAO');
00053 $payPalDao =& new PayPalDAO();
00054 DAORegistry::registerDAO('PayPalDAO', $payPalDao);
00055 return true;
00056 }
00057 return false;
00058 }
00059
00064 function getSettingsFormFieldNames() {
00065 return array('paypalurl', 'selleraccount');
00066 }
00067
00072 function isCurlInstalled() {
00073 return (function_exists('curl_init'));
00074 }
00075
00080 function isConfigured() {
00081 $journal =& Request::getJournal();
00082 if (!$journal) return false;
00083
00084
00085 if (!$this->isCurlInstalled()) return false;
00086
00087
00088 foreach ($this->getSettingsFormFieldNames() as $settingName) {
00089 $setting = $this->getSetting($journal->getJournalId(), $settingName);
00090 if (empty($setting)) return false;
00091 }
00092 return true;
00093 }
00094
00100 function displayPaymentSettingsForm(&$params, &$smarty) {
00101 $smarty->assign('isCurlInstalled', $this->isCurlInstalled());
00102 return parent::displayPaymentSettingsForm($params, $smarty);
00103 }
00104
00110 function displayPaymentForm($queuedPaymentId, &$queuedPayment) {
00111 if (!$this->isConfigured()) return false;
00112 $journal =& Request::getJournal();
00113 $user =& Request::getUser();
00114
00115 $params = array(
00116 'business' => $this->getSetting($journal->getJournalId(), 'selleraccount'),
00117 'item_name' => $queuedPayment->getName(),
00118 'item_description' => $queuedPayment->getDescription(),
00119 'amount' => $queuedPayment->getAmount(),
00120 'quantity' => 1,
00121 'no_note' => 1,
00122 'no_shipping' => 1,
00123 'currency_code' => $queuedPayment->getCurrencyCode(),
00124 'lc' => String::substr(Locale::getLocale(), 3),
00125 'custom' => $queuedPaymentId,
00126 'notify_url' => Request::url(null, 'payment', 'plugin', array($this->getName(), 'ipn')),
00127 'return' => $queuedPayment->getRequestUrl(),
00128 'cancel_return' => Request::url(null, 'payment', 'plugin', array($this->getName(), 'cancel')),
00129 'first_name' => ($user)?$user->getFirstName():'',
00130 'last_name' => ($user)?$user->getLastname():'',
00131 'item_number' => $queuedPayment->getAssocId(),
00132 'cmd' => '_xclick'
00133 );
00134
00135 $templateMgr =& TemplateManager::getManager();
00136 $templateMgr->assign('params', $params);
00137 $templateMgr->assign('paypalFormUrl', $this->getSetting($journal->getJournalId(), 'paypalurl'));
00138 $templateMgr->display($this->getTemplatePath() . 'paymentForm.tpl');
00139 }
00140
00144 function handle($args) {
00145 $templateMgr =& TemplateManager::getManager();
00146 $journal =& Request::getJournal();
00147 if (!$journal) return parent::handle($args);
00148
00149
00150 import('mail.MailTemplate');
00151 $contactName = $journal->getSetting('contactName');
00152 $contactEmail = $journal->getSetting('contactEmail');
00153 $mail = &new MailTemplate('PAYPAL_INVESTIGATE_PAYMENT');
00154 $mail->setFrom($contactEmail, $contactName);
00155 $mail->addRecipient($contactEmail, $contactName);
00156
00157 $paymentStatus = Request::getUserVar('payment_status');
00158
00159 switch (array_shift($args)) {
00160 case 'ipn':
00161
00162 $req = 'cmd=_notify-validate';
00163 foreach ($_POST as $key => $value) $req .= '&' . urlencode($key) . '=' . urlencode($value);
00164
00165 $ch = curl_init();
00166 curl_setopt($ch, CURLOPT_URL, $this->getSetting($journal->getJournalId(), 'paypalurl'));
00167 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
00168 curl_setopt($ch, CURLOPT_POST, 1);
00169 curl_setopt($ch, CURLOPT_HTTPHEADER, Array('Content-Type: application/x-www-form-urlencoded', 'Content-Length: ' . strlen($req)));
00170 curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
00171 $ret = curl_exec ($ch);
00172 curl_close ($ch);
00173
00174
00175 if (strcmp($ret, 'VERIFIED') == 0) switch ($paymentStatus) {
00176 case 'Completed':
00177 $payPalDao =& DAORegistry::getDAO('PayPalDAO');
00178 $transactionId = Request::getUserVar('txn_id');
00179 if ($payPalDao->transactionExists($transactionId)) {
00180
00181 $mail->assignParams(array(
00182 'journalName' => $journal->getJournalTitle(),
00183 'postInfo' => print_r($_POST, true),
00184 'additionalInfo' => "Duplicate transaction ID: $transactionId",
00185 'serverVars' => print_r($_SERVER, true)
00186 ));
00187 $mail->send();
00188 exit();
00189 } else {
00190
00191 $payPalDao->insertTransaction(
00192 $transactionId,
00193 Request::getUserVar('txn_type'),
00194 Request::getUserVar('payer_email'),
00195 Request::getUserVar('receiver_email'),
00196 Request::getUserVar('item_number'),
00197 Request::getUserVar('payment_date'),
00198 Request::getUserVar('payer_id'),
00199 Request::getUserVar('receiver_id')
00200 );
00201 $queuedPaymentId = Request::getUserVar('custom');
00202
00203 import('payment.ojs.OJSPaymentManager');
00204 $ojsPaymentManager =& OJSPaymentManager::getManager();
00205
00206
00207 $queuedPayment =& $ojsPaymentManager->getQueuedPayment($queuedPaymentId);
00208 if (!$queuedPayment) {
00209
00210 $mail->assignParams(array(
00211 'journalName' => $journal->getJournalTitle(),
00212 'postInfo' => print_r($_POST, true),
00213 'additionalInfo' => "Missing queued payment ID: $queuedPaymentId",
00214 'serverVars' => print_r($_SERVER, true)
00215 ));
00216 $mail->send();
00217 exit();
00218 }
00219
00220
00221
00222 if (
00223 (($queuedAmount = $queuedPayment->getAmount()) != ($grantedAmount = Request::getUserVar('mc_gross')) && $queuedAmount > 0) ||
00224 ($queuedCurrency = $queuedPayment->getCurrencyCode()) != ($grantedCurrency = Request::getUserVar('mc_currency')) ||
00225 ($grantedEmail = Request::getUserVar('receiver_email')) != ($queuedEmail = $this->getSetting($journal->getJournalId(), 'selleraccount'))
00226 ) {
00227
00228 $mail->assignParams(array(
00229 'journalName' => $journal->getJournalTitle(),
00230 'postInfo' => print_r($_POST, true),
00231 'additionalInfo' =>
00232 "Granted amount: $grantedAmount\n" .
00233 "Queued amount: $queuedAmount\n" .
00234 "Granted currency: $grantedCurrency\n" .
00235 "Queued currency: $queuedCurrency\n" .
00236 "Granted to PayPal account: $grantedEmail\n" .
00237 "Configured PayPal account: $queuedEmail",
00238 'serverVars' => print_r($_SERVER, true)
00239 ));
00240 $mail->send();
00241 exit();
00242 }
00243
00244
00245 if ($ojsPaymentManager->fulfillQueuedPayment($queuedPayment, $this->getName())) exit();
00246
00247
00248 $mail->assignParams(array(
00249 'journalName' => $journal->getJournalTitle(),
00250 'postInfo' => print_r($_POST, true),
00251 'additionalInfo' => "Queued payment ID $queuedPaymentId could not be fulfilled.",
00252 'serverVars' => print_r($_SERVER, true)
00253 ));
00254 $mail->send();
00255 }
00256 exit();
00257 case 'Pending':
00258
00259 exit();
00260 default:
00261
00262 $mail->assignParams(array(
00263 'journalName' => $journal->getJournalTitle(),
00264 'postInfo' => print_r($_POST, true),
00265 'additionalInfo' => "Payment status: $paymentStatus",
00266 'serverVars' => print_r($_SERVER, true)
00267 ));
00268 $mail->send();
00269 exit();
00270 } else {
00271
00272 $mail->assignParams(array(
00273 'journalName' => $journal->getJournalTitle(),
00274 'postInfo' => print_r($_POST, true),
00275 'additionalInfo' => "Confirmation return: $ret",
00276 'serverVars' => print_r($_SERVER, true)
00277 ));
00278 $mail->send();
00279 exit();
00280 }
00281
00282 break;
00283 case 'cancel':
00284 $templateMgr->assign(array(
00285 'currentUrl' => Request::url(null, null, 'index'),
00286 'pageTitle' => 'plugins.paymethod.paypal.purchase.cancelled.title',
00287 'message' => 'plugins.paymethod.paypal.purchase.cancelled',
00288 'backLink' => Request::getUserVar('ojsReturnUrl'),
00289 'backLinkLabel' => 'common.continue'
00290 ));
00291 $templateMgr->display('common/message.tpl');
00292 exit();
00293 break;
00294 }
00295 parent::handle($args);
00296 }
00297
00298 function getInstallSchemaFile() {
00299 return ($this->getPluginPath() . DIRECTORY_SEPARATOR . 'schema.xml');
00300 }
00301
00302 function getInstallDataFile() {
00303 return ($this->getPluginPath() . DIRECTORY_SEPARATOR . 'data.xml');
00304 }
00305 }
00306
00307 ?>