/** * @see wcf\system\payment\type\IPaymentType::processTransaction() */ public function processTransaction($paymentMethodObjectTypeID, $token, $amount, $currency, $transactionID, $status, $transactionDetails) { $userSubscription = $user = $subscription = null; try { $tokenParts = explode(':', $token); if (count($tokenParts) != 2) { throw new SystemException('invalid token'); } list($userID, $subscriptionID) = $tokenParts; // get user object $user = new User(intval($userID)); if (!$user->userID) { throw new SystemException('invalid user'); } // get subscription object $subscription = new PaidSubscription(intval($subscriptionID)); if (!$subscription->subscriptionID) { throw new SystemException('invalid subscription'); } // search for existing subscription $userSubscription = PaidSubscriptionUser::getSubscriptionUser($subscription->subscriptionID, $user->userID); // search log for transaction id $logEntry = PaidSubscriptionTransactionLog::getLogByTransactionID($paymentMethodObjectTypeID, $transactionID); if ($logEntry !== null) { throw new SystemException('transaction already processed'); } $logMessage = ''; if ($status == 'completed') { // validate payment amout if ($amount != $subscription->cost || $currency != $subscription->currency) { throw new SystemException('invalid payment amount'); } // active/extend subscription if ($userSubscription === null) { // create new subscription $action = new PaidSubscriptionUserAction(array(), 'create', array('user' => $user, 'subscription' => $subscription)); $returnValues = $action->executeAction(); $userSubscription = $returnValues['returnValues']; } else { // extend existing subscription $action = new PaidSubscriptionUserAction(array($userSubscription), 'extend'); $action->executeAction(); } $logMessage = 'payment completed'; } if ($status == 'reversed') { if ($userSubscription !== null) { // revoke subscription $action = new PaidSubscriptionUserAction(array($userSubscription), 'revoke'); $action->executeAction(); } $logMessage = 'payment reversed'; } if ($status == 'canceled_reversal') { if ($userSubscription !== null) { // restore subscription $action = new PaidSubscriptionUserAction(array($userSubscription), 'restore'); $action->executeAction(); } $logMessage = 'reversal canceled'; } // log success $action = new PaidSubscriptionTransactionLogAction(array(), 'create', array('data' => array('subscriptionUserID' => $userSubscription->subscriptionUserID, 'userID' => $user->userID, 'subscriptionID' => $subscription->subscriptionID, 'paymentMethodObjectTypeID' => $paymentMethodObjectTypeID, 'logTime' => TIME_NOW, 'transactionID' => $transactionID, 'logMessage' => $logMessage, 'transactionDetails' => serialize($transactionDetails)))); $action->executeAction(); } catch (SystemException $e) { // log failure $action = new PaidSubscriptionTransactionLogAction(array(), 'create', array('data' => array('subscriptionUserID' => $userSubscription !== null ? $userSubscription->subscriptionUserID : null, 'userID' => $user !== null ? $user->userID : null, 'subscriptionID' => $subscription !== null ? $subscription->subscriptionID : null, 'paymentMethodObjectTypeID' => $paymentMethodObjectTypeID, 'logTime' => TIME_NOW, 'transactionID' => $transactionID, 'logMessage' => $e->getMessage(), 'transactionDetails' => serialize($transactionDetails)))); $action->executeAction(); throw $e; } }
/** * @see \wcf\form\IForm::save() */ public function save() { parent::save(); $userSubscription = PaidSubscriptionUser::getSubscriptionUser($this->subscriptionID, $this->user->userID); $data = array(); if ($this->subscription->subscriptionLength) { $data['endDate'] = $this->endDateTime->getTimestamp(); } if ($userSubscription === null) { // create new subscription $action = new PaidSubscriptionUserAction(array(), 'create', array('user' => $this->user, 'subscription' => $this->subscription, 'data' => $data)); $returnValues = $action->executeAction(); $userSubscription = $returnValues['returnValues']; } else { // extend existing subscription $action = new PaidSubscriptionUserAction(array($userSubscription), 'extend', array('data' => $data)); $action->executeAction(); } $this->saved(); // reset values $this->username = $this->endDate = ''; // show success WCF::getTPL()->assign(array('success' => true)); }