public function cancelSubscription($userId, $validateUsersCount = true) { $result = ['error' => 1, 'message' => "Error canceling subscription. Please contact support about this issue"]; $ipn = new SubscriptionsIPN(); $ipn->configureDatabase($userId); /* clear subscription plan restrictions */ unset($_SESSION['subscriptionPlanOptions']); /**/ $gsSubscriptions = Subscription::getActiveSubscriptions(); if (count($gsSubscriptions) != 1) { PayPalIPN::log(['message' => "Error. Can\\'t cancel subscription. User has no active subscriptions", 'level' => PayPalIPN::LOG_LEVEL_ERROR, 'user_id' => $userId]); } $subscription = $gsSubscriptions[0]; $subscriptionPlan = new SubscriptionPlan(); $subscriptionPlan->load($subscription['plan_id']); if (!$this->validateUsersCount() && $validateUsersCount) { $result = ['error' => 2, 'message' => 'Error, wrong users count']; } /* free subscription */ if ($subscriptionPlan->service_provider == 'getscorecard' && $subscriptionPlan->service_name == 'free') { $recordId = $subscription['subId']; $subscription = new Subscription(); $subscription->load($recordId); $subscription->status = Subscription::STATUS_CANCELED; $subscription->save(); $result = ['error' => 0, 'message' => 'success. Subscription canceling.']; } else { if (!$subscription['subscription_id']) { PayPalIPN::log(['message' => "Error. Can\\'t cancel subscription. Wrong subscription id", 'level' => PayPalIPN::LOG_LEVEL_ERROR, 'user_id' => $userId]); } $lastTransaction = $ipn->getLastActiveTransactionBySubscription($subscription['subId']); $transactionId = $lastTransaction['txn_id']; $subscriptionId = $subscription['subscription_id']; $refundAmount = $ipn->getTransactionRefundAmount($lastTransaction); $cancelSubscriptionResult = $ipn->changeSubscriptionStatus($subscriptionId, 'Cancel'); $refundTransactionResult = $ipn->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.']; PayPalIPN::log(['txn_id' => $transactionId, 'subscr_id' => $subscriptionId, 'message' => "Subscription canceling", 'level' => PayPalIPN::LOG_LEVEL_INFO, 'data' => '', 'user_id' => $userId]); } else { PayPalIPN::log(['txn_id' => $transactionId, 'subscr_id' => $subscriptionId, 'message' => "Error. Can\\'t cancel subscription. Rejected by PayPal", 'level' => PayPalIPN::LOG_LEVEL_ERROR, 'data' => json_encode(['cancelSubscriptionResult' => $cancelSubscriptionResult, 'refundTransactionResult' => $refundTransactionResult]), 'user_id' => $userId]); } } return $result; }