/** * @param $userId * @param $serviceProvider * @return array|bool * @throws Exception */ public function cancelSubscription($userId, $serviceProvider) { $activeSubscription = Subscription::getActiveSubscriptions($userId, $serviceProvider); if (!$activeSubscription) { PaypalSubscription::log(['message' => "Error. Can\\'t cancel subscription. User has no active subscriptions", 'level' => PaypalSubscription::LOG_LEVEL_ERROR, 'user_id' => $userId]); return false; } /* free subscription */ if ((int) $activeSubscription['price'] == 0) { $recordId = $activeSubscription['subId']; $subscription = new Subscription(); $subscription->load($recordId); $subscription->status = Subscription::STATUS_CANCELED; $subscription->save(); $result = ['error' => 0, 'message' => 'success. Subscription canceled.']; return $result; } else { if (!$activeSubscription['subscription_id']) { PaypalSubscription::log(['message' => "Error. Can\\'t cancel subscription. Wrong subscription id", 'level' => PaypalSubscription::LOG_LEVEL_ERROR, 'user_id' => $userId]); return false; } $config = Config::get(); $paypalService = new PaypalSubscription($config); $lastTransaction = $paypalService->getLastActiveTransactionBySubscription($activeSubscription['subId']); $transactionId = $lastTransaction['txn_id']; $subscriptionId = $activeSubscription['subscription_id']; $refundAmount = $paypalService->getTransactionRefundAmount($lastTransaction); $cancelSubscriptionResult = $paypalService->changeSubscriptionStatus($subscriptionId, 'Cancel'); $refundTransactionResult = $paypalService->refundTransaction($lastTransaction, $refundAmount); if ($cancelSubscriptionResult['ACK'] == "Success" && $refundTransactionResult['ACK'] == "Success") { $subscription = new Subscription(); $subscription->loadBySubscriptionId($subscriptionId); $subscription->status = Subscription::STATUS_CANCELING; $subscription->save(); $result = ['error' => 0, 'message' => 'success. Subscription canceling.']; PaypalSubscription::log(['txn_id' => $transactionId, 'subscr_id' => $subscriptionId, 'message' => "Subscription canceling", 'level' => PaypalSubscription::LOG_LEVEL_INFO, 'data' => '', 'user_id' => $userId]); return $result; } else { PaypalSubscription::log(['txn_id' => $transactionId, 'subscr_id' => $subscriptionId, 'message' => "Error. Can\\'t cancel subscription. Rejected by PayPal", 'level' => PaypalSubscription::LOG_LEVEL_ERROR, 'data' => json_encode(['cancelSubscriptionResult' => $cancelSubscriptionResult, 'refundTransactionResult' => $refundTransactionResult]), 'user_id' => $userId]); return false; } } }
<?php $config = Config::get(); $payPal = new PaypalSubscription($config); $userService = new UserService(); //get selected user $userId = $userService->getSelectedUserId(); $service_provider = 'getscorecard'; $activeSubscription = Subscription::getActiveSubscriptions($userId, $service_provider); $subscriptionsArchive = Subscription::getSubscriptionsArchive($userId, $service_provider); //$subscriptionPlan = new GetscorecardSubscriptionPlanPro(); $subscriptionPlan = new SubscriptionPlan(); //@TODO remake //$service_provider = 'getscorecard'; //$plans = SubscriptionPlan::getGetscorecardSubscriptionPlans($service_provider); $plans = SubscriptionPlan::getSubscriptionPlans($service_provider); //$subscriptionsTempStatus = Subscription::getSubscriptionTemporaryStatus(); $usersCountDefault = 2; $usersCount = $activeSubscription != null ? $activeSubscription['items_count'] : $usersCountDefault; ?> <script type="text/javascript"> var subscriptionPlans = <?php echo json_encode($plans); ?> ; var serviceProvider = '<?php echo $service_provider; ?> ';
public function getOptions() { $gsSubscriptions = Subscription::getActiveSubscriptions(); $sessionManager = new SessionManager(); $userInfo = $sessionManager->getUserInfo($_SESSION['user_id']); $subscriptionsTempStatus = Subscription::getSubscriptionTemporaryStatus(); $result = []; if (count($gsSubscriptions)) { $planId = $gsSubscriptions[0]['plan_id']; $subscriptionPlan = new SubscriptionPlan(); $subscriptionPlan->load($planId); $subscriptionPlanOptions = $subscriptionPlan->getSubscriptionPlanOptions(); $result['subscription_status'] = Subscription::STATUS_ACTIVE; $result['options'] = $subscriptionPlanOptions; } elseif ($subscriptionsTempStatus == Subscription::STATUS_PROCESSING) { $result['subscription_status'] = Subscription::STATUS_PROCESSING; $result['options'] = []; } elseif ($subscriptionsTempStatus == Subscription::STATUS_UPDATING) { $gsSubscriptions = Subscription::getGetScorecardSubscriptions(); if (isset($gsSubscriptions[0])) { $planId = $gsSubscriptions[0]['plan_id']; $subscriptionPlan = new SubscriptionPlan(); $subscriptionPlan->load($planId); $subscriptionPlanOptions = $subscriptionPlan->getSubscriptionPlanOptions(); $result['subscription_status'] = Subscription::STATUS_UPDATING; $result['options'] = $subscriptionPlanOptions; } else { $result['subscription_status'] = Subscription::STATUS_NOT_EXIST; $result['options'] = []; } } elseif ($userInfo['dummy_data_live']) { $result['subscription_status'] = Subscription::STATUS_TRIAL; $result['options'] = []; } else { $result['subscription_status'] = Subscription::STATUS_NOT_EXIST; $result['options'] = []; } return $result; }
/** * @param $myPost * @throws Exception */ public function processPayment($myPost) { $customData = $this->getCustomData($myPost); $userId = $customData['user_id']; $userService = new UserService(); $userInfo = $userService->getUserData($userId); $userEmail = $userInfo['email']; $subscriptionPlan = $this->getSubscriptionPlan($myPost); if ($this->validateSubscription($subscriptionPlan, $myPost)) { $subscription = new Subscription(); $subscription->loadBySubscriptionId($myPost['subscr_id']); $transactionService = new PaypalTransaction(); $transaction = $transactionService->getTransactionById($myPost['txn_id']); if ($subscription->id) { //subscription exists if ($myPost['txn_type'] == 'subscr_payment') { if (!$transaction) { $subscription->status = Subscription::STATUS_ACTIVE; $subscription->payment_date = $myPost['payment_date']; $subscription->updated_date = date('Y-m-d H:i:s'); $subscription->save(); self::log(['message' => self::INFO_SUBSCRIPTION_PAYMENT, 'data' => '', 'level' => self::LOG_LEVEL_INFO], $myPost); $myPost['relation_id'] = $subscription->id; //@TODO remake it $transactionService = new PaypalTransaction(); $myPost['relation_type'] = PaypalTransaction::TRANSACTION_RELATION_SUBSCRIPTION; $transactionService->createTransaction($myPost); self::log(['message' => self::INFO_TRANSACTION_CREATED, 'data' => '', 'level' => self::LOG_LEVEL_INFO], $myPost); } else { self::log(['message' => self::WARNING_DUPLICATE_TRANSACTION_IPN, 'data' => '', 'level' => self::LOG_LEVEL_WARNING], $myPost); } } if ($myPost['txn_type'] == 'subscr_cancel') { $subscription->status = Subscription::STATUS_CANCELED; $subscription->updated_date = date('Y-m-d H:i:s'); $subscription->save(); self::log(['message' => self::INFO_SUBSCRIPTION_CANCELED, 'data' => '', 'level' => self::LOG_LEVEL_INFO], $myPost); } if ($myPost['txn_type'] == 'subscr_eot') { $subscription->status = Subscription::STATUS_CANCELED; $subscription->updated_date = date('Y-m-d H:i:s'); $subscription->save(); self::log(['message' => self::INFO_SUBSCRIPTION_EXPIRED, 'level' => self::LOG_LEVEL_WARNING], $myPost); } if ($myPost['txn_type'] == 'subscr_signup') { self::log(['message' => self::INFO_SUBSCRIPTION_SIGNUP, 'data' => '', 'level' => self::LOG_LEVEL_INFO], $myPost); } if ($myPost['txn_type'] == 'subscr_modify') { $subscription->status = Subscription::STATUS_CANCELED; $subscription->updated_date = date('Y-m-d H:i:s'); $subscription->save(); self::log(['message' => self::INFO_SUBSCRIPTION_MODIFIED, 'level' => self::LOG_LEVEL_WARNING], $myPost); } if ($myPost['payment_status'] == 'Refunded' && $myPost['reason_code'] == 'refund') { //refund transaction $transactionService = new PaypalTransaction(); $transactionService->updateTransaction($myPost['parent_txn_id'], ['payment_status' => 'Refunded']); $myPost['txn_type'] = self::TXN_TYPE_SUBSCR_REFUND; $myPost['relation_id'] = $subscription->id; //@TODO refactor this $myPost['relation_type'] = PaypalTransaction::TRANSACTION_RELATION_SUBSCRIPTION; $transactionService = new PaypalTransaction(); $transactionService->createTransaction($myPost); self::log(['message' => self::INFO_PAYMENT_REFUND, 'level' => self::LOG_LEVEL_INFO], $myPost); } } else { if ($myPost['txn_type'] == 'subscr_payment') { //@TODO remake it $serviceProvider = $subscriptionPlan->service_provider; $activeSubscriptions = Subscription::getActiveSubscriptions($userId, $serviceProvider); /* check duplicate subscriptions*/ if (count($activeSubscriptions) > 0) { self::log(['message' => self::ERROR_ACTIVE_SUBSCRIPTION_DUPLICATE, 'level' => self::LOG_LEVEL_ERROR], $myPost); } elseif (!$transaction) { $subscription = new Subscription(); $subscription->user_id = $userId; $subscription->plan_id = $subscriptionPlan->id; $subscription->subscription_id = $myPost['subscr_id']; $subscription->created_date = date("Y-m-d H:i:s"); $subscription->updated_date = date('Y-m-d H:i:s'); $subscription->payment_date = $myPost['payment_date']; $subscription->items_count = $customData['items_count']; $subscription->status = Subscription::STATUS_ACTIVE; $subscriptionId = $subscription->save(); self::log(['message' => self::INFO_SUBSCRIPTION_CREATED, 'data' => '', 'level' => self::LOG_LEVEL_INFO], $myPost); $myPost['relation_id'] = $subscriptionId; //@TODO refactor this $myPost['relation_type'] = PaypalTransaction::TRANSACTION_RELATION_SUBSCRIPTION; $transactionService = new PaypalTransaction(); $transactionService->createTransaction($myPost); self::log(['message' => self::INFO_TRANSACTION_CREATED, 'data' => '', 'level' => self::LOG_LEVEL_INFO], $myPost); } else { self::log(['message' => self::WARNING_DUPLICATE_TRANSACTION_IPN, 'data' => '', 'level' => self::LOG_LEVEL_WARNING], $myPost); } } if ($myPost['txn_type'] == 'subscr_signup') { self::log(['message' => self::INFO_SUBSCRIPTION_SIGNUP, 'data' => '', 'level' => self::LOG_LEVEL_INFO], $myPost); } if ($myPost['txn_type'] == 'subscr_modify') { self::log(['message' => self::INFO_SUBSCRIPTION_MODIFIED, 'level' => self::LOG_LEVEL_WARNING], $myPost); } } } else { self::log(['message' => self::VALIDATION_FAILED, 'level' => self::LOG_LEVEL_ERROR], $myPost); echo self::VALIDATION_FAILED; die; } }