/** * Cancel Recurring Subscription * * @param int/string $trans_ref * @param int $user_id * @param int/string $subscr_id * @return boolean */ function cancel_recurring_subscription($trans_ref = null, $user_id = null, $subscr_id = null, $pack_id = null) { //if coming form process return after a subscription payment if (!empty($trans_ref)) { $transdata = $this->_get_transaction_passthrough($trans_ref); if ($transdata['payment_type'] != 'subscription_purchase') { return false; } $user_id = $transdata['user_id']; if (isset($transdata['is_another_membership_purchase']) && $transdata['is_another_membership_purchase'] == 'Y') { $member = mgm_get_member_another_purchase($user_id, $transdata['membership_type']); } else { $member = mgm_get_member($user_id); } if (isset($member->payment_info->module) && !empty($member->payment_info->module)) { $subscr_id = null; if (!empty($member->payment_info->subscr_id)) { $subscr_id = $member->payment_info->subscr_id; } elseif (!empty($member->pack_id)) { //check the pack is recurring $s_packs = mgm_get_class('subscription_packs'); $sel_pack = $s_packs->get_pack($member->pack_id); if ($sel_pack['num_cycles'] != 1) { $subscr_id = 0; } // 0 stands for a lost subscription id } //check for same module: if not call the same function of the applicale module. if (str_replace('mgm_', '', $member->payment_info->module) != str_replace('mgm_', '', $this->code)) { // mgm_log('RECALLing '. $member->payment_info->module .': cancel_recurring_subscription FROM: ' . $this->code); return mgm_get_module($member->payment_info->module, 'payment')->cancel_recurring_subscription($trans_ref, null, null, $pack_id); } //skip if same pack is updated if (empty($member->pack_id) || is_numeric($pack_id) && $pack_id == $member->pack_id) { return false; } } else { return false; } } //ony for subscription_purchase if ($subscr_id) { $user = get_userdata($user_id); $format = mgm_get_date_format('date_format'); // compose post body $post_data = array('USER' => $this->setting['username'], 'PWD' => $this->setting['password'], 'SIGNATURE' => $this->setting['signature'], 'VERSION' => '64.0', 'METHOD' => 'ManageRecurringPaymentsProfileStatus', 'PROFILEID' => $subscr_id, 'ACTION' => 'Cancel', 'NOTE' => sprintf('Cancellation selected by member on UPGRADE: "%s", ID: %d on: %s', $user->user_email, $user->ID, date($format))); // end point url $end_point = $this->_get_endpoint(); //issue #1508 $url_parsed = parse_url($end_point); // domain/host $domain = $url_parsed['host']; // headers $http_headers = array('POST /cgi-bin/webscr HTTP/1.1\\r\\n', 'Content-Type: application/x-www-form-urlencoded\\r\\n', 'Host: ' . $domain . '\\r\\n', 'Connection: close\\r\\n\\r\\n'); // post $http_response = mgm_remote_post($end_point, $post_data, array('headers' => $http_headers, 'timeout' => 30, 'sslverify' => false)); // log mgm_log($http_response, __FUNCTION__); // fields // $fields = mgm_http_build_query($post_data); // post // $response = $this->_curl_post($endpoint, $fields, '', false); // sleep sleep(1); // parse $this->response = array(); // parse to array parse_str($http_response, $this->response); // log mgm_log($this->response, __FUNCTION__); // cancel return isset($this->response['ACK']) && $this->response['ACK'] == 'Success' ? true : false; } elseif ($subscr_id === 0) { //send email to admin if subscription Id is absent $system_obj = mgm_get_class('system'); $dge = bool_from_yn($system_obj->get_setting('disable_gateway_emails')); //send email only if setting enabled if (!$dge) { // blog $blogname = get_option('blogname'); // user $user = get_userdata($user_id); // notify admin mgm_notify_admin_membership_cancellation_manual_removal_required($blogname, $user, $member); } return true; } return false; }
/** * Cancel Recurring Subscription * * @param int/string $trans_ref * @param int $user_id * @param int/string $subscr_id * @return boolean/string message */ function cancel_recurring_subscription($trans_ref = null, $user_id = null, $sale_id = null, $pack_id = null) { // if coming form process return after a subscription payment if (!empty($trans_ref)) { // transaction data $transdata = $this->_get_transaction_passthrough($trans_ref); // validate if ($transdata['payment_type'] != 'subscription_purchase') { return false; } // user $user_id = $transdata['user_id']; // multiple purchase if (isset($transdata['is_another_membership_purchase']) && $transdata['is_another_membership_purchase'] == 'Y') { $member = mgm_get_member_another_purchase($user_id, $transdata['membership_type']); } else { $member = mgm_get_member($user_id); } // subscription exists if (isset($member->payment_info->module) && !empty($member->payment_info->module)) { // sale id if (isset($member->payment_info->txn_id)) { $sale_id = $member->payment_info->txn_id; } else { //check pack is recurring: $pid = $pack_id ? $pack_id : $member->pack_id; if ($pid) { $s_packs = mgm_get_class('subscription_packs'); $sel_pack = $s_packs->get_pack($pid); if ($sel_pack['num_cycles'] != 1) { $sale_id = 0; } //not found } } // module info // check for same module: if not call the same function of the applicale module. if (str_replace('mgm_', '', $member->payment_info->module) != str_replace('mgm_', '', $this->code)) { // recur return mgm_get_module($member->payment_info->module, 'payment')->cancel_recurring_subscription($trans_ref, null, null, $pack_id); } //skip if same pack is updated if (empty($member->pack_id) || is_numeric($pack_id) && $pack_id == $member->pack_id) { return false; } } else { // error return false; } } // only for subscription_purchase if ($sale_id) { // sale id, returned order_number on approval url post back // saledetail_url $saledetail_url = add_query_arg(array('sale_id' => $sale_id), $this->_get_endpoint('saledetail')); // auth string $auth = $this->setting['apiusername'] . ':' . $this->setting['apipassword']; // post data $post_data = array(); // headers $http_headers = array('Accept' => 'application/json', 'Authorization' => 'Basic ' . base64_encode($auth)); // fetch $http_response = mgm_remote_post($saledetail_url, $post_data, array('headers' => $http_headers, 'timeout' => 30, 'sslverify' => false)); // decode $response = json_decode($http_response); // ind $lineitem_id = ''; // validate if ((string) $response->response_code == 'OK') { $lineitem_id = (string) $response->sale->invoices[0]->lineitems[0]->billing->lineitem_id; } // set post $post_data = array('vendor_id' => $this->setting['sid'], 'lineitem_id' => $lineitem_id); // unsubscribe_url $unsubscribe_url = $this->_get_endpoint('unsubscribe'); // fetch $http_response = mgm_remote_post($unsubscribe_url, $post_data, array('headers' => $http_headers, 'timeout' => 30, 'sslverify' => false)); // decode $response = json_decode($http_response); // return status if ((string) $response->response_code == 'OK') { return true; } else { return $response->errors[0]->message; } } elseif ($sale_id === 0) { //send email to admin if subscription Id is absent $system_obj = mgm_get_class('system'); $dge = bool_from_yn($system_obj->get_setting('disable_gateway_emails')); //send email only if setting enabled if (!$dge) { // blog $blogname = get_option('blogname'); // user $user = get_userdata($user_id); // notify admin mgm_notify_admin_membership_cancellation_manual_removal_required($blogname, $user, $member); } return true; } // default return false; }
/** * Cancel Recurring Subscription * This is not a private function * @param int/string $trans_ref * @param int $user_id * @param int/string $subscr_id * @param int $pack_id * @return boolean */ function cancel_recurring_subscription($trans_ref = null, $user_id = null, $subscr_id = null, $pack_id = null) { //if coming form process return after a subscription payment if (!empty($trans_ref)) { $transdata = $this->_get_transaction_passthrough($trans_ref); if ($transdata['payment_type'] != 'subscription_purchase') { return false; } $user_id = $transdata['user_id']; if (isset($transdata['is_another_membership_purchase']) && $transdata['is_another_membership_purchase'] == 'Y') { $member = mgm_get_member_another_purchase($user_id, $transdata['membership_type']); } else { $member = mgm_get_member($user_id); } if (isset($member->payment_info->module) && !empty($member->payment_info->module)) { if (isset($member->payment_info->subscr_id)) { $subscr_id = $member->payment_info->subscr_id; } else { //check pack is recurring: $pid = $pack_id ? $pack_id : $member->pack_id; if ($pid) { $s_packs = mgm_get_class('subscription_packs'); $sel_pack = $s_packs->get_pack($pid); if ($sel_pack['num_cycles'] != 1) { $subscr_id = 0; } } } //check for same module: if not call the same function of the applicale module. if (str_replace('mgm_', '', $member->payment_info->module) != str_replace('mgm_', '', $this->code)) { mgm_log('RECALLing ' . $member->payment_info->module . ': cancel_recurring_subscription FROM: ' . $this->code); return mgm_get_module($member->payment_info->module, 'payment')->cancel_recurring_subscription($trans_ref, null, null, $pack_id); } //skip if same pack is updated if (empty($member->pack_id) || is_numeric($pack_id) && $pack_id == $member->pack_id) { return false; } } else { return false; } } // when a subscription found if ($subscr_id) { // @todo add api call // query data $query_data = array(); // add internal vars $secure = array('clientAccnum' => $this->setting['client_acccnum'], 'clientSubacc' => $this->setting['client_subacc'], 'username' => $this->setting['datalink_username'], 'password' => $this->setting['datalink_password']); // merge $query_data = array_merge($query_data, $secure); // overwrite post data array with secure params // method $query_data['action'] = 'cancelSubscription'; //check if (isset($member)) { $query_data['subscriptionId'] = $member->payment_info->subscr_id; } else { $query_data['subscriptionId'] = $subscr_id; } // xml response $query_data['returnXML'] = 1; // post string $query_string = _http_build_query($query_data, null, '&'); // endpoint $endpoint = $this->_get_endpoint('datalink_sms'); // url $url = $endpoint . '?' . $query_string; // log mgm_log($url, $this->module . '_' . __FUNCTION__); // remote get $http_response = mgm_remote_get($url, null, null, false); // log mgm_log($http_response, $this->module . '_' . __FUNCTION__); // xml if ($xml = @simplexml_load_string($http_response)) { // log mgm_log($xml, $this->module . '_' . __FUNCTION__); // return return (int) $xml == 1; // success } // end api call } elseif (is_null($subscr_id) || $subscr_id === 0) { $system_obj = mgm_get_class('system'); $dge = bool_from_yn($system_obj->get_setting('disable_gateway_emails')); // check if (!$dge) { // blog $blogname = get_option('blogname'); // user $user = get_userdata($user_id); // notify admin mgm_notify_admin_membership_cancellation_manual_removal_required($blogname, $user, $member); } // return return true; } // return return false; }
/** * Cancel Recurring Subscription * This is not a private function * @param int/string $trans_ref * @param int $user_id * @param int/string $subscr_id * @return boolean */ function cancel_recurring_subscription($trans_ref = null, $user_id = null, $subscr_id = null, $pack_id = null) { //if coming form process return after a subscription payment if (!empty($trans_ref)) { $transdata = $this->_get_transaction_passthrough($trans_ref); if ($transdata['payment_type'] != 'subscription_purchase') { return false; } $user_id = $transdata['user_id']; if (isset($transdata['is_another_membership_purchase']) && $transdata['is_another_membership_purchase'] == 'Y') { $member = mgm_get_member_another_purchase($user_id, $transdata['membership_type']); } else { $member = mgm_get_member($user_id); } if (isset($member->payment_info->module) && !empty($member->payment_info->module)) { if (isset($member->payment_info->subscr_id)) { $subscr_id = $member->payment_info->subscr_id; } else { //check pack is recurring: $pid = $pack_id ? $pack_id : $member->pack_id; if ($pid) { $s_packs = mgm_get_class('subscription_packs'); $sel_pack = $s_packs->get_pack($pid); if ($sel_pack['num_cycles'] != 1) { $subscr_id = 0; } // 0 stands for a lost subscription id } } //check for same module: if not call the same function of the applicale module. if (str_replace('mgm_', '', $member->payment_info->module) != str_replace('mgm_', '', $this->code)) { // mgm_log('RECALLing '. $member->payment_info->module .': cancel_recurring_subscription FROM: ' . $this->code); return mgm_get_module($member->payment_info->module, 'payment')->cancel_recurring_subscription($trans_ref, null, null, $pack_id); } //skip if same pack is updated if (empty($member->pack_id) || is_numeric($pack_id) && $pack_id == $member->pack_id) { return false; } } else { return false; } } //ony for subscription_purchase if ($subscr_id) { // end point $endpoint = $this->_get_endpoint('unsubscribe'); // base // add query $url = add_query_arg(array('SUBSCRIPTION_ID' => urlencode($subscr_id), 'MERCHANT_ID' => urlencode($this->setting['merchant_id']), 'ZombaioGWPass' => urlencode($this->setting['gw_pass']), 'ReasonCode' => urlencode(11)), $endpoint); // create curl post //$buffer = $this->_curl_post($url); // headers $http_headers = array(); // fetch $http_response = mgm_remote_post($url, $post_data, array('headers' => $http_headers, 'timeout' => 30, 'sslverify' => false)); // verify if ($http_response == 1) { return true; } else { // message return $this->_get_cancel_error($http_response); } } elseif ($subscr_id === 0) { //send email to admin if subscription Id is absent $system_obj = mgm_get_class('system'); $dge = bool_from_yn($system_obj->get_setting('disable_gateway_emails')); //send email only if setting enabled if (!$dge) { $user = get_userdata($user_id); //send notification email to admin: $message = __('The User: '******'mgm') . $user->user_email . ' (' . $user_id . ') ' . __('has upgraded/cancelled subscription.', 'mgm'); $message .= "<br/>" . __('Please unsubscribe the user subscription from Gateway Merchant panel.', 'mgm'); if (!empty($member->transaction_id)) { $message .= "<br/>" . __('MGM Transaction Id:', 'mgm') . $member->transaction_id; } //admin email: if (!empty($system_obj->setting['admin_email'])) { @mgm_mail($system_obj->setting['admin_email'], sprintf(__('[%s] User Subscription Cancellation', 'mgm'), get_option('blogname')), $message); } } return true; } return false; }
/** * Cancel Recurring Subscription * Cancellation includes 2 webservice calls * 1. delete Rebill Event on eWay * 2. delete Rebill Customer on eWay * This is not a private function * @param int/string $trans_ref * @param int $user_id * @param int/string $rebill_id * @param int $pack_id * @return boolean */ function cancel_recurring_subscription($trans_ref = null, $user_id = null, $rebill = null, $pack_id = null) { //if coming form process return after a subscription payment if (!empty($trans_ref)) { $transdata = $this->_get_transaction_passthrough($trans_ref); if ($transdata['payment_type'] != 'subscription_purchase') { return false; } $user_id = $transdata['user_id']; if (isset($transdata['is_another_membership_purchase']) && $transdata['is_another_membership_purchase'] == 'Y') { $member = mgm_get_member_another_purchase($user_id, $transdata['membership_type']); } else { $member = mgm_get_member($user_id); } if (isset($member->payment_info->module) && !empty($member->payment_info->module)) { if (isset($member->payment_info->subscr_id)) { $rebill['rebill_id'] = $member->payment_info->subscr_id; $rebill['rebill_customer_id'] = $member->payment_info->rebill_customerid; } else { //check pack is recurring: $pid = $pack_id ? $pack_id : $member->pack_id; if ($pid) { $s_packs = mgm_get_class('subscription_packs'); $sel_pack = $s_packs->get_pack($pid); if ($sel_pack['num_cycles'] != 1) { $rebill['rebill_id'] = 0; } // 0 stands for a lost subscription id } } //check for same module: if not call the same function of the applicale module. if (str_replace('mgm_', '', $member->payment_info->module) != str_replace('mgm_', '', $this->code)) { // log mgm_log('RECALLing ' . $member->payment_info->module . ': cancel_recurring_subscription FROM: ' . $this->module, $this->module . '_cancel'); // return return mgm_get_module($member->payment_info->module, 'payment')->cancel_recurring_subscription($trans_ref, null, null, $pack_id); } //skip if same pack is updated if (empty($member->pack_id) || is_numeric($pack_id) && $pack_id == $member->pack_id) { return false; } } else { return false; } } //if valid rebill data is found and settings are set if (!empty($rebill['rebill_id']) && !empty($rebill['rebill_customer_id']) && !empty($this->setting['customer_id']) && !empty($this->setting['username']) && !empty($this->setting['password'])) { $gateway_method = 'webservice'; $secure = array('CustomerID' => $this->setting['customer_id'], 'Username' => $this->setting['username'], 'Password' => $this->setting['password']); //data to post //Delete Rebill Event $post_data = array('webservice_action' => 'DeleteRebillEvent', 'RebillCustomerID' => $rebill['rebill_customer_id'], 'RebillID' => $rebill['rebill_id']); $post_data = array_merge($post_data, $secure); // filter post data and create soap xml $post_string = $this->_filter_postdata($gateway_method, $post_data); // endpoint $endpoint = $this->_get_endpoint($this->status . '_' . $gateway_method); // test_webservice / live_webservice // headers $http_headers = $this->_get_http_headers($gateway_method, $post_data['webservice_action']); // log mgm_log('Request Headers [' . $post_data['webservice_action'] . ']' . mgm_pr($http_headers, true), __FUNCTION__); // log mgm_log('Request [' . $post_data['webservice_action'] . ']' . $post_string, __FUNCTION__); // create curl post $http_response = mgm_remote_post($endpoint, $post_string, array('headers' => $http_headers, 'timeout' => 30, 'sslverify' => false)); // log mgm_log('Response [' . $post_data['webservice_action'] . ']' . $http_response, __FUNCTION__); /*$http_header = array('User-Agent: NuSOAP/0.9.5 (1.123)', 'Content-Type: text/xml; charset=ISO-8859-1', sprintf('SOAPAction: "http://www.eway.com.au/gateway/rebill/manageRebill/%s"', $post_data['webservice_action']));*/ // post soap data // $buffer = $this->_curl_post($endpoint, $post_string, $http_header); // parse response $this->_process_response($gateway_method, $http_response, $post_data['webservice_action']); // log mgm_log('Response Parsed [' . $post_data['webservice_action'] . ']' . mgm_pr($this->response, true), __FUNCTION__); //if rebill event is deleted, delete rebill customer if (isset($this->response['response_status']) && $this->response['response_status'] == 1) { //delete rebill customer: $post_data['webservice_action'] = 'DeleteRebillCustomer'; // filter post data and create soap xml $post_string = $this->_filter_postdata($gateway_method, $post_data); // soap_action $soap_action = sprintf('http://www.eway.com.au/gateway/rebill/manageRebill/%s', $post_data['webservice_action']); // http_headers $http_headers = array_merge($http_headers, array('SOAPAction' => $soap_action)); // log mgm_log('Request Headers [' . $post_data['webservice_action'] . ']' . mgm_pr($http_headers, true), __FUNCTION__); // log mgm_log('Request [' . $post_data['webservice_action'] . ']' . $post_string, __FUNCTION__); // create curl post $http_response = mgm_remote_post($endpoint, $post_string, array('headers' => $http_headers, 'timeout' => 30, 'sslverify' => false)); // log mgm_log('Response [' . $post_data['webservice_action'] . ']' . $http_response, __FUNCTION__); /*$http_header = array('User-Agent: NuSOAP/0.9.5 (1.123)', 'Content-Type: text/xml; charset=ISO-8859-1', sprintf('SOAPAction: "http://www.eway.com.au/gateway/rebill/manageRebill/%s"', $post_data['webservice_action']));*/ // post soap data // $buffer = $this->_curl_post($endpoint, $post_string, $http_header); // parse response $this->_process_response($gateway_method, $http_response, $post_data['webservice_action']); // log mgm_log('Response Parsed [' . $post_data['webservice_action'] . ']' . mgm_pr($this->response, true), __FUNCTION__); // check if (isset($this->response['response_status']) && $this->response['response_status'] == 1) { //done return true; } } } elseif ($rebill['rebill_id'] === 0) { $system_obj = mgm_get_class('system'); $dge = bool_from_yn($system_obj->get_setting('disable_gateway_emails')); //send email only if setting enabled if (!$dge) { $user = get_userdata($user_id); //send notification email to admin: $message = __('The User: '******'mgm') . $user->user_email . ' (' . $user_id . ') ' . __('has upgraded/cancelled subscription.', 'mgm'); $message .= "<br/>" . __('Please unsubscribe the user from Gateway Merchant panel.', 'mgm'); if (!empty($rebill['rebill_customer_id'])) { $message .= "<br/><br/>" . __('Customer Rebill Id: ', 'mgm') . $rebill['rebill_customer_id']; } if (!empty($rebill['rebill_id'])) { $message .= "<br/><br/>" . __('Rebill Id: ', 'mgm') . $rebill['rebill_id']; } if (isset($member->transaction_id)) { $message .= "<br/>" . __('MGM Transaction Id:', 'mgm') . $member->transaction_id; } //admin email: if (!empty($system_obj->setting['admin_email'])) { @mgm_mail($system_obj->setting['admin_email'], sprintf(__('[%s] User Subscription Cancellation', 'mgm'), get_option('blogname')), $message); } } //treat as done return true; } return false; }
/** * Cancel Recurring Subscription * This is not a private function * @param int/string $trans_ref * @param int $user_id * @param int/string $subscr_id * @param int $pack_id * @return boolean */ function cancel_recurring_subscription($trans_ref = null, $user_id = null, $subscr_id = null, $pack_id = null) { //if coming form process return after a subscription payment if (!empty($trans_ref)) { $transdata = $this->_get_transaction_passthrough($trans_ref); if ($transdata['payment_type'] != 'subscription_purchase') { return false; } $user_id = $transdata['user_id']; if (isset($transdata['is_another_membership_purchase']) && $transdata['is_another_membership_purchase'] == 'Y') { $member = mgm_get_member_another_purchase($user_id, $transdata['membership_type']); } else { $member = mgm_get_member($user_id); } if (isset($member->payment_info->module) && !empty($member->payment_info->module)) { if (isset($member->payment_info->subscr_id)) { $subscr_id = $member->payment_info->subscr_id; } else { //check pack is recurring: $pid = $pack_id ? $pack_id : $member->pack_id; if ($pid) { $s_packs = mgm_get_class('subscription_packs'); $sel_pack = $s_packs->get_pack($pid); if ($sel_pack['num_cycles'] != 1) { $subscr_id = 0; } // 0 stands for a lost subscription id } } //check for same module: if not call the same function of the applicale module. if (str_replace('mgm_', '', $member->payment_info->module) != str_replace('mgm_', '', $this->code)) { mgm_log('RECALLing ' . $member->payment_info->module . ': cancel_recurring_subscription FROM: ' . $this->code); return mgm_get_module($member->payment_info->module, 'payment')->cancel_recurring_subscription($trans_ref, null, null, $pack_id); } //skip if same pack is updated if (empty($member->pack_id) || is_numeric($pack_id) && $pack_id == $member->pack_id) { return false; } } else { return false; } } $system_obj = mgm_get_class('system'); $dge = bool_from_yn($system_obj->get_setting('disable_gateway_emails')); //send email only if setting enabled if ((!empty($subscr_id) || $subscr_id === 0) && !$dge) { $user = get_userdata($user_id); //send notification email to admin: $message = __('The User: '******'mgm') . $user->user_email . ' (' . $user_id . ') ' . __('has upgraded/cancelled subscription.', 'mgm'); $message .= "<br/>" . __('Please unsubscribe the user from Gateway Merchant panel.', 'mgm'); if ($subscr_id) { $message .= "<br/><br/>" . __('Pay Id: ', 'mgm') . $subscr_id; } if (isset($member->transaction_id)) { $message .= "<br/>" . __('MGM Transaction Id:', 'mgm') . $member->transaction_id; } //admin email: if (!empty($system_obj->setting['admin_email'])) { @mgm_mail($system_obj->setting['admin_email'], sprintf(__('[%s] User Subscription Cancellation', 'mgm'), get_option('blogname')), $message); } } return true; }
/** * Cancel Recurring Subscription * This is not a private function * @param int/string $trans_ref * @param int $user_id * @param int/string $subscr_id * @param int $pack_id * @return boolean */ function cancel_recurring_subscription($trans_ref = null, $user_id = null, $subscr_id = null, $pack_id = null) { //if coming form process return after a subscription payment if (!empty($trans_ref)) { $transdata = $this->_get_transaction_passthrough($trans_ref); if ($transdata['payment_type'] != 'subscription_purchase') { return false; } $user_id = $transdata['user_id']; if (isset($transdata['is_another_membership_purchase']) && $transdata['is_another_membership_purchase'] == 'Y') { $member = mgm_get_member_another_purchase($user_id, $transdata['membership_type']); } else { $member = mgm_get_member($user_id); } if (isset($member->payment_info->module)) { if (isset($member->payment_info->subscr_id)) { $subscr_id = $member->payment_info->subscr_id; } else { //check pack is recurring: $pid = $pack_id ? $pack_id : $member->pack_id; if ($pid) { $s_packs = mgm_get_class('subscription_packs'); $sel_pack = $s_packs->get_pack($pid); if ($sel_pack['num_cycles'] != 1) { $subscr_id = 0; } } } //check for same module: if not call the same function of the applicale module. if (str_replace('mgm_', '', $member->payment_info->module) != str_replace('mgm_', '', $this->code)) { // log mgm_log('RECALLing ' . $member->payment_info->module . ': cancel_recurring_subscription FROM: ' . $this->code); // return return mgm_get_module($member->payment_info->module, 'payment')->cancel_recurring_subscription($trans_ref, null, null, $pack_id); } //skip if same pack is updated if (empty($member->pack_id) || is_numeric($pack_id) && $pack_id == $member->pack_id) { return false; } } else { return false; } } // when a subscription found if ($subscr_id) { // call api // end point $endpoint = $this->_get_endpoint('search'); // search // headers $http_headers = array(); //array('Content-Type' => 'text/xml'); // data $query = array('auth_user' => $this->setting['searchapi_auth_user'], 'auth_pass' => $this->setting['searchapi_auth_pass'], 'member_id' => $subscr_id, 'trans_id' => $member->payment_info->txn_id, 'api_action' => 'search'); //prevcanc // // url $post_url = add_query_arg($query, $endpoint); // log mgm_log($post_url, __FUNCTION__); // create curl post $http_response = mgm_remote_get($post_url, array('headers' => $http_headers, 'timeout' => 30, 'sslverify' => false)); // log mgm_log($http_response, __FUNCTION__); // parse if ($xml = @simplexml_load_string($http_response)) { // log mgm_log($xml, __FUNCTION__); // has status if (isset($xml->Record->Customer->MemberId)) { // get actions $actions = (array) $xml->Record->AvailableActions; // check if (isset($actions['Action']) && in_array('cancel', $actions['Action'])) { // 2nd call $query = array_merge($query, array('api_action' => 'cancel', 'cancel_reason' => 'wmapprvd')); // post url $post_url = add_query_arg($query, $endpoint); // log mgm_log($post_url, __FUNCTION__); // cancel $http_response = mgm_remote_get($post_url, array('headers' => $http_headers, 'timeout' => 30, 'sslverify' => false)); // log mgm_log($http_response, __FUNCTION__); // flag. @todo fetch exact response status // log mgm_log($xml, __FUNCTION__); // flag. @todo fetch response status if (isset($xml->Cancel->Response) && (string) $xml->Cancel->Response == 'Success') { return true; } } else { return __('Member already cancelled', 'mgm'); } } else { // error if (isset($xml->Error->Response)) { return (string) $xml->Error->Response; } else { //mgm_pr((array)$xml); $xml_a = (array) $xml; return isset($xml_a[0]) ? $xml_a[0] : __('Unknown', 'mgm'); } } } // end } elseif (is_null($subscr_id) || $subscr_id === 0) { $system_obj = mgm_get_class('system'); $dge = bool_from_yn($system_obj->get_setting('disable_gateway_emails')); // check if (!$dge) { // blog $blogname = get_option('blogname'); // user $user = get_userdata($user_id); // notify admin mgm_notify_admin_membership_cancellation_manual_removal_required($blogname, $user, $member); } // return return true; } // return return false; }
function _buy_membership() { // system $system_obj = mgm_get_class('system'); $s_packs = mgm_get_class('subscription_packs'); $dge = bool_from_yn($system_obj->get_setting('disable_gateway_emails')); $dpne = bool_from_yn($system_obj->get_setting('disable_payment_notify_emails')); // get passthrough, stop further process if fails to parse $custom = $this->_get_transaction_passthrough($_POST['custom']); // local var extract($custom); // currency if (!$currency) { $currency = $system_obj->get_setting('currency'); } // find user $user = get_userdata($user_id); //another_subscription modification if (isset($custom['is_another_membership_purchase']) && bool_from_yn($custom['is_another_membership_purchase'])) { $member = mgm_get_member_another_purchase($user_id, $custom['membership_type']); } else { $member = mgm_get_member($user_id); } // Get the current AC join date if (!($join_date = $member->join_date)) { $member->join_date = time(); } // Set current AC join date // if there is no duration set in the user object then run the following code if (empty($duration_type)) { //if there is no duration type then use Months $duration_type = 'm'; } // membership type default if (empty($membership_type)) { //if there is no account type in the custom string then use the existing type $membership_type = md5($member->membership_type); } // validate parent method $membership_type_verified = $this->_validate_membership_type($membership_type, 'md5|plain'); // verified if (!$membership_type_verified) { if (strtolower($member->membership_type) != 'free') { // notify admin, only if gateway emails on if (!$dge) { mgm_notify_admin_membership_verification_failed($this->name); } // abort return; } else { $membership_type_verified = $member->membership_type; } } // set $membership_type = $membership_type_verified; // sub pack $subs_pack = $s_packs->get_pack($pack_id); // if trial on if ($subs_pack['trial_on']) { $member->trial_on = $subs_pack['trial_on']; $member->trial_cost = $subs_pack['trial_cost']; $member->trial_duration = $subs_pack['trial_duration']; $member->trial_duration_type = $subs_pack['trial_duration_type']; $member->trial_num_cycles = $subs_pack['trial_num_cycles']; } //pack currency over rides genral setting currency - issue #1602 if (isset($subs_pack['currency']) && $subs_pack['currency'] != $currency) { $currency = $subs_pack['currency']; } // duration $member->duration = $duration; $member->duration_type = strtolower($duration_type); $member->amount = $amount; $member->currency = $currency; $member->membership_type = $membership_type; $member->pack_id = $pack_id; // $member->payment_type = 'subscription'; $member->active_num_cycles = isset($num_cycles) && !empty($num_cycles) ? $num_cycles : $subs_pack['num_cycles']; $member->payment_type = (int) $member->active_num_cycles == 1 ? 'one-time' : 'subscription'; // payment info for unsubscribe $member->payment_info = new stdClass(); $member->payment_info->module = $this->code; // transaction type $member->payment_info->txn_type = 'subscription'; // subscriber id $member->payment_info->subscr_id = ''; // refer id $member->payment_info->txn_id = ''; // mgm transaction id $member->transaction_id = $_POST['custom']; // process response $new_status = $update_role = false; // process $process = 'Success'; // status switch ($process) { case 'Success': // set pending status $new_status = MGM_STATUS_PENDING; // starus string $member->status_str = __('Last payment is pending', 'mgm'); $time = time(); $last_pay_date = isset($member->last_pay_date) ? $member->last_pay_date : null; $member->last_pay_date = date('Y-m-d', $time); // for upgrading if ($member->status == MGM_STATUS_ACTIVE) { // mark for later status reset $member->status_reset_on = date('Y-m-d', strtotime($member->expire_date)); } // check subscription_option if (isset($subscription_option)) { // on option switch ($subscription_option) { // @ToDo, apply expire date login case 'create': // expire date will be based on current time // expire date will be based on current time case 'upgrade': // expire date will be based on current time // already on top break; case 'downgrade': // expire date will be based on expire_date if exists, current time other wise // expire date will be based on expire_date if exists, current time other wise case 'extend': // expire date will be based on expire_date if exists, current time other wise // extend/expire date // calc expiry - issue #1226 // membership extend functionality broken if we try to extend the same day so removed && $last_pay_date != date('Y-m-d', $time) check if (!empty($member->expire_date)) { $expiry = strtotime($member->expire_date); if ($expiry > 0 && $expiry > $time) { $time = $expiry; } } break; } } // type expanded $duration_exprs = $s_packs->get_duration_exprs(); // if not lifetime/date range if (in_array($member->duration_type, array_keys($duration_exprs))) { // take only date exprs //consider trial duration if trial period is applicable if (isset($trial_on) && $trial_on == 1) { //Do it only once if (!isset($member->rebilled) && isset($member->active_num_cycles) && $member->active_num_cycles != 1) { $time = strtotime("+{$trial_duration} {$duration_exprs[$trial_duration_type]}", $time); } } else { // time - issue #1068 $time = strtotime("+{$member->duration} {$duration_exprs[$member->duration_type]}", $time); } // formatted $time_str = date('Y-m-d', $time); // date extended if (!$member->expire_date || strtotime($time_str) > strtotime($member->expire_date)) { $member->expire_date = $time_str; } } else { //if lifetime: if ($member->duration_type == 'l') { // el = lifetime $member->expire_date = ''; } //issue #1096 if ($member->duration_type == 'dr') { // el = /date range $member->expire_date = $duration_range_end_dt; } } //update rebill: issue #: 489 if ($member->active_num_cycles != 1 && (int) $member->rebilled < (int) $member->active_num_cycles) { // rebill $member->rebilled = !$member->rebilled ? 1 : (int) $member->rebilled + 1; } // role update if ($role) { $update_role = true; } // transaction_id $transaction_id = $this->_get_transaction_id(); // hook args $args = array('user_id' => $user_id, 'transaction_id' => $transaction_id); // another membership if (isset($custom['is_another_membership_purchase']) && bool_from_yn($custom['is_another_membership_purchase'])) { $args['another_membership'] = $custom['membership_type']; } // after succesful payment hook do_action('mgm_membership_transaction_success', $args); // backward compatibility do_action('mgm_subscription_purchase_payment_success', $args); // new organized name do_action('mgm_return_subscription_payment_' . $this->module, $args); // autoresponder break; case 'Denied': $new_status = MGM_STATUS_NULL; $member->status_str = __('Last payment was refunded or denied', 'mgm'); break; case 'Pending': $new_status = MGM_STATUS_PENDING; $reason = 'Unknown'; $member->status_str = sprintf(__('Last payment is pending. Reason: %s', 'mgm'), $reason); break; default: $new_status = MGM_STATUS_ERROR; $member->status_str = sprintf(__('Last payment status: %s', 'mgm'), $_POST['payment_status']); break; } // old status $old_status = $member->status; // set new status $member->status = $new_status; // whether to acknowledge the user - This should happen only once $acknowledge_user = $this->send_payment_email($_POST['custom']); // whether to subscriber the user to Autoresponder - This should happen only once $acknowledge_ar = mgm_subscribe_to_autoresponder($member, $_POST['custom']); //another_subscription modification if (isset($custom['is_another_membership_purchase']) && bool_from_yn($custom['is_another_membership_purchase'])) { //issue #1227 if ($subs_pack['hide_old_content']) { $member->hide_old_content = $subs_pack['hide_old_content']; } mgm_save_another_membership_fields($member, $user_id); // Multiple membership upgrade: first time if (isset($member->transaction_id) && isset($custom['multiple_upgrade_prev_packid']) && is_numeric($custom['multiple_upgrade_prev_packid'])) { mgm_multiple_upgrade_save_memberobject($custom, $member->transaction_id); } } else { $member->save(); } // status change event do_action('mgm_user_status_change', $user_id, $new_status, $old_status, 'module_' . $this->module, $member->pack_id); //update coupon usage do_action('mgm_update_coupon_usage', array('user_id' => $user_id)); // role if ($update_role) { $obj_role = new mgm_roles(); $obj_role->add_user_role($user_id, $role); } // update transaction if (is_numeric($member->transaction_id)) { mgm_update_transaction(array('module' => $this->module, 'status' => $member->status, 'status_text' => $member->status_str), $member->transaction_id); } // return action do_action('mgm_return_' . $this->module, array('user_id' => $user_id)); // backward compatibility do_action('mgm_return_subscription_payment_' . $this->module, array('user_id' => $user_id)); // new , individual do_action('mgm_return_subscription_payment', array('user_id' => $user_id, 'acknowledge_ar' => $acknowledge_ar, 'mgm_member' => $member)); // new, global // read member again for internal updates if any // another_subscription modification if (isset($custom['is_another_membership_purchase']) && bool_from_yn($custom['is_another_membership_purchase'])) { $member = mgm_get_member_another_purchase($user_id, $custom['membership_type']); } else { $member = mgm_get_member($user_id); } // send email notification to client $blogname = get_option('blogname'); // notify if ($acknowledge_user) { // notify user, only if gateway emails on if (!$dpne) { // notify if (mgm_notify_user_membership_purchase($blogname, $user, $member, $custom, $subs_pack, $s_packs, $system_obj)) { // update as email sent $this->update_paymentemail_sent($alt_tran_id); } } // notify admin, only if gateway emails on if (!$dge) { // pack duration $pack_duration = $s_packs->get_pack_duration($subs_pack); // notify admin, mgm_notify_admin_membership_purchase($blogname, $user, $member, $pack_duration); } } }
/** * ongoing member canceled */ function mgm_ongoing_member_canceled($user, $member, $spacks_obj, $data, $other_purchases = false) { // MARK status reset for manual pay upgrade if (isset($member->status_reset_on) && !is_null($member->status_reset_on)) { // date match if ($member->status_reset_on == $data['current_date']) { // manual pay if ($member->payment_info->module == 'mgm_manualpay') { // set as pending again $member->status = MGM_STATUS_PENDING; } else { // other // set as cancelled or whatever set in "reset_as" $member->status = $member->status_reset_as; // expire date if cancelled if ($member->status_reset_as == MGM_STATUS_CANCELLED) { // expire on $member->expire_date = $data['current_date']; // reassign expiry membership pack if exists: issue#: 535 $member = apply_filters('mgm_reassign_member_subscription', $user->ID, $member, 'CANCEL', true); } } // save multiple level subscription if ($other_purchases) { mgm_save_another_membership_fields($member, $user->ID); } else { // update $member->save(); } // recapture if ($other_purchases) { $member = mgm_get_member_another_purchase($user->ID, $member->membership_type); } else { $member = mgm_get_member($user->ID); } } } // return return $member; }
/** * User status change event, tracks exipre and update autoresponder * * @param int $user_id * @param string $new_status * @param string $old_status * @param string $context * @param int $pack_id * @return void */ function mgm_user_status_change_process($user_id, $new_status, $old_status, $context = NULL, $pack_id = NULL) { // args $args = func_get_args(); // check if ($new_status == MGM_STATUS_EXPIRED) { // if setting if (bool_from_yn(mgm_get_setting('unsubscribe_autoresponder_on_expire', 'N'))) { // get member $member = mgm_get_member($user_id); // @todo get member by pack // get another if ((int) $pack_id > 0 && $member->pack_id != $pack_id) { // get another member $member = mgm_get_member_another_purchase($user_id, NULL, $pack_id); } // check if (bool_from_yn($member->subscribed)) { // call @todo mgm_autoresponder_send_unsubscribe($user_id, $member); } } } }
/** * Cancel Recurring Subscription * This is not a private function * @param int/string $trans_ref * @param int $user_id * @param int/string $subscr_id * @return boolean */ function cancel_recurring_subscription($trans_ref = null, $user_id = null, $subscr_id = null, $pack_id = null) { global $wpdb; //if coming form process return after a subscription payment if (!empty($trans_ref)) { $transdata = $this->_get_transaction_passthrough($trans_ref); if ($transdata['payment_type'] != 'subscription_purchase') { return false; } $user_id = $transdata['user_id']; if (isset($transdata['is_another_membership_purchase']) && $transdata['is_another_membership_purchase'] == 'Y') { $member = mgm_get_member_another_purchase($user_id, $transdata['membership_type']); } else { $member = mgm_get_member($user_id); } if (isset($member->payment_info->module) && !empty($member->payment_info->module)) { if (isset($member->payment_info->subscr_id)) { $subscr_id = $member->payment_info->subscr_id; } else { //check pack is recurring: $pid = $pack_id ? $pack_id : $member->pack_id; if ($pid) { $s_packs = mgm_get_class('subscription_packs'); $sel_pack = $s_packs->get_pack($pid); if ($sel_pack['num_cycles'] != 1) { $subscr_id = 0; } } } //check for same module: if not call the same function of the applicale module. if (str_replace('mgm_', '', $member->payment_info->module) != str_replace('mgm_', '', $this->code)) { // log // mgm_log('RECALLing '. $member->payment_info->module .': cancel_recurring_subscription FROM: ' . $this->code); // return return mgm_get_module($member->payment_info->module, 'payment')->cancel_recurring_subscription($trans_ref, null, null, $pack_id); } //skip if same pack is updated if (empty($member->pack_id) || is_numeric($pack_id) && $pack_id == $member->pack_id) { return false; } } else { return false; } } //only for subscription_purchase if ($pack_id && $user_id) { $userInfo = get_userdata($user_id); $client_cache = $wpdb->get_results($wpdb->prepare('SELECT paymill_sub_id FROM ' . $wpdb->prefix . 'paymill_subscriptions WHERE mgm_user_id="%s" AND mgm_offer_id="%s"', array($user_id, $pack_id)), ARRAY_A); if (isset($client_cache[0]['paymill_sub_id']) && strlen($client_cache[0]['paymill_sub_id']) > 0) { $this->subscriptions->remove($client_cache[0]['paymill_sub_id']); $query = $wpdb->prepare('DELETE FROM ' . $wpdb->prefix . 'paymill_subscriptions WHERE mgm_user_id="%s" AND mgm_offer_id="%s"', array($user_id, $pack_id)); $wpdb->query($query); return true; } else { return false; } } return false; }
/** * Cancel Recurring Subscription * This is not a private function * @param int/string $trans_ref * @param int $user_id * @param int/string $subscr_id * @return boolean */ function cancel_recurring_subscription($trans_ref = null, $user_id = null, $subscr_id = null, $pack_id = null) { //if coming form process return after a subscription payment if (!empty($trans_ref)) { $transdata = $this->_get_transaction_passthrough($trans_ref); if ($transdata['payment_type'] != 'subscription_purchase') { return false; } $user_id = $transdata['user_id']; if (isset($transdata['is_another_membership_purchase']) && $transdata['is_another_membership_purchase'] == 'Y') { $member = mgm_get_member_another_purchase($user_id, $transdata['membership_type']); } else { $member = mgm_get_member($user_id); } if (isset($member->payment_info->module) && !empty($member->payment_info->module)) { $subscr_id = null; if (!empty($member->payment_info->subscr_id)) { $subscr_id = $member->payment_info->subscr_id; } elseif (!empty($member->pack_id)) { //check the pack is recurring $s_packs = mgm_get_class('subscription_packs'); $sel_pack = $s_packs->get_pack($member->pack_id); if ($sel_pack['num_cycles'] != 1) { $subscr_id = 0; } // 0 stands for a lost subscription id } //check for same module: if not call the same function of the applicale module. if (str_replace('mgm_', '', $member->payment_info->module) != str_replace('mgm_', '', $this->code)) { // mgm_log('RECALLing '. $member->payment_info->module .': cancel_recurring_subscription FROM: ' . $this->code); return mgm_get_module($member->payment_info->module, 'payment')->cancel_recurring_subscription($trans_ref, null, null, $pack_id); } //skip if same pack is updated if (empty($member->pack_id) || is_numeric($pack_id) && $pack_id == $member->pack_id) { return false; } } else { return false; } } // when a subscription found if ($subscr_id) { $user = get_userdata($user_id); $date_format = mgm_get_date_format('date_format'); // post data $post_data = array('USER' => $this->setting['ap_merchant'], 'PASSWORD' => $this->setting['ap_apipassword'], 'SUBSCRIPTIONREFERENCE' => $subscr_id, 'NOTE' => sprintf('Cancellation selected by member: "%s", ID: %d on: %s', $user->user_email, $user->ID, date($date_format)), 'TESTMODE' => $this->status == 'test' ? '1' : '0'); // url $unsubscribe_url = $this->_get_endpoint('unsubscribe'); // headers $http_headers = array(); // create curl post $http_response = mgm_remote_post($unsubscribe_url, $post_data, array('headers' => $http_headers, 'timeout' => 30, 'sslverify' => false)); // parse @parse_str($http_response, $data); // verify if (isset($data['REFERENCENUMBER']) && $data['RETURNCODE'] == 100) { return true; } elseif (isset($data['DESCRIPTION'])) { //error string return $data['DESCRIPTION']; } } elseif (is_null($subscr_id) || $subscr_id === 0) { //send email to admin if subscription Id is absent $system_obj = mgm_get_class('system'); $dge = bool_from_yn($system_obj->get_setting('disable_gateway_emails')); // check if (!$dge) { // blog $blogname = get_option('blogname'); // user $user = get_userdata($user_id); // notify admin mgm_notify_admin_membership_cancellation_manual_removal_required($blogname, $user, $member); } // return return true; } // return return false; }
/** * Cancel Recurring Subscription * This is not a private function * @param int/string $trans_ref * @param int $user_id * @param int/string $subscr_id // if -1, it will treated as a lost subscription id * @param int $pack_id * @return boolean */ function cancel_recurring_subscription($trans_ref = null, $user_id = null, $subscr_id = null, $pack_id = null) { //if coming form process return after a subscription payment if (!empty($trans_ref)) { $transdata = $this->_get_transaction_passthrough($trans_ref); if ($transdata['payment_type'] != 'subscription_purchase') { return false; } $user_id = $transdata['user_id']; if (isset($transdata['is_another_membership_purchase']) && $transdata['is_another_membership_purchase'] == 'Y') { $member = mgm_get_member_another_purchase($user_id, $transdata['membership_type']); } else { $member = mgm_get_member($user_id); } if (isset($member->payment_info->module) && !empty($member->payment_info->module)) { if (isset($member->payment_info->subscr_id)) { $subscr_id = $member->payment_info->subscr_id; } else { //check pack is recurring: $pid = $pack_id ? $pack_id : $member->pack_id; if ($pid) { $s_packs = mgm_get_class('subscription_packs'); $sel_pack = $s_packs->get_pack($pid); if ($sel_pack['num_cycles'] != 1) { $subscr_id = 0; } } } //check for same module: if not call the same function of the applicale module. if (str_replace('mgm_', '', $member->payment_info->module) != str_replace('mgm_', '', $this->code)) { // mgm_log('RECALLing '. $member->payment_info->module .': cancel_recurring_subscription FROM: ' . $this->code); return mgm_get_module($member->payment_info->module, 'payment')->cancel_recurring_subscription($trans_ref, null, null, $pack_id); } //skip if same pack is updated if (empty($member->pack_id) || is_numeric($pack_id) && $pack_id == $member->pack_id) { return false; } } else { return false; } } //ony for subscription_purchase if (!is_null($subscr_id)) { $user = get_userdata($user_id); $date_format = mgm_get_date_format('date_format'); $comment = sprintf('Cancellation selected by member on UPGRADE: "%s", ID: %d on: %s', $user->user_email, $user->ID, date($date_format)); // compose post body $data = array('PARTNER' => $this->setting['partner'], 'VENDOR' => $this->setting['vendor'], 'USER' => $this->setting['username'], 'PWD' => $this->setting['password'], 'TENDER' => 'C', 'TRXTYPE' => 'R', 'ACTION' => 'C', 'ORIGPROFILEID' => $subscr_id, 'COMMENT1' => $this->_remove_special_chars($comment)); // url $post_url = $this->_get_endpoint(); //issue #1508 $url_parsed = parse_url($post_url); // domain/host $domain = $url_parsed['host']; // headers $http_headers = array('POST /cgi-bin/webscr HTTP/1.1\\r\\n', 'Content-Type: application/x-www-form-urlencoded\\r\\n', 'Host: ' . $domain . '\\r\\n', 'Connection: close\\r\\n\\r\\n'); // log mgm_log($data, $this->module . '_' . __FUNCTION__); // data $data_post = _http_build_query($data, null, '&', '', false); // do not encode // post $http_response = mgm_remote_post($post_url, $data_post, array('headers' => $http_headers, 'timeout' => 30, 'sslverify' => false)); // sleep sleep(1); // parse $response = array(); // parse parse_str($http_response, $response); // log mgm_log($response, $this->module . '_' . __FUNCTION__); // cancel return isset($response['RESULT']) && $response['RESULT'] == 0 ? true : $response; } elseif (is_null($subscr_id) || $subscr_id === 0) { //send email to admin if subscription Id is absent $system_obj = mgm_get_class('system'); $dge = bool_from_yn($system_obj->get_setting('disable_gateway_emails')); //send email only if setting enabled if (!$dge) { // blog $blogname = get_option('blogname'); // user $user = get_userdata($user_id); // notify admin mgm_notify_admin_membership_cancellation_manual_removal_required($blogname, $user, $member); } return true; } return false; }
private function _get_member_object($user_id) { if (isset($_POST['ps_mem'][$user_id]) && !empty($_POST['ps_mem'][$user_id])) { $member = mgm_get_member_another_purchase($user_id, $_POST['ps_mem'][$user_id][0]); if (empty($member)) { return new stdClass(); } } else { $member = mgm_get_member($user_id); } return $member; }
/** * Cancel Recurring Subscription * This is not a private function * @param int/string $trans_ref * @param int $user_id * @param int/string $subscr_id * @param int $pack_id * @return boolean */ function cancel_recurring_subscription($trans_ref = null, $user_id = null, $subscr_id = null, $pack_id = null) { //if coming form process return after a subscription payment if (!empty($trans_ref)) { $transdata = $this->_get_transaction_passthrough($trans_ref); if ($transdata['payment_type'] != 'subscription_purchase') { return false; } $user_id = $transdata['user_id']; if (isset($transdata['is_another_membership_purchase']) && $transdata['is_another_membership_purchase'] == 'Y') { $member = mgm_get_member_another_purchase($user_id, $transdata['membership_type']); } else { $member = mgm_get_member($user_id); } if (isset($member->payment_info->module)) { if (isset($member->payment_info->subscr_id)) { $subscr_id = $member->payment_info->subscr_id; } else { //check pack is recurring: $pid = $pack_id ? $pack_id : $member->pack_id; if ($pid) { $s_packs = mgm_get_class('subscription_packs'); $sel_pack = $s_packs->get_pack($pid); if ($sel_pack['num_cycles'] != 1) { $subscr_id = 0; } } } //check for same module: if not call the same function of the applicale module. if (str_replace('mgm_', '', $member->payment_info->module) != str_replace('mgm_', '', $this->code)) { mgm_log('RECALLing ' . $member->payment_info->module . ': cancel_recurring_subscription FROM: ' . $this->code); return mgm_get_module($member->payment_info->module, 'payment')->cancel_recurring_subscription($trans_ref, null, null, $pack_id); } //skip if same pack is updated if (empty($member->pack_id) || is_numeric($pack_id) && $pack_id == $member->pack_id) { return false; } } else { return false; } } //send email only if setting enabled if (!empty($subscr_id) || $subscr_id === 0) { $system_obj = mgm_get_class('system'); $dge = bool_from_yn($system_obj->get_setting('disable_gateway_emails')); //send email only if setting enabled if (!$dge) { // blog $blogname = get_option('blogname'); // user $user = get_userdata($user_id); // notify admin mgm_notify_admin_membership_cancellation_manual_removal_required($blogname, $user, $member); } return true; } return false; }
/** * show buttons of modules available for upgrade/downgrade/complete payment * * @param array args * @return string html */ function mgm_get_upgrade_buttons($args = array()) { global $wpdb; // current user $user = wp_get_current_user(); // get user if (!$user->ID) { // get user from query string $user = mgm_get_user_from_querystring(); } // validate if (!$user->ID) { return __('No such user', 'mgm'); } // userdata $username = $user->user_login; $mgm_home = get_option('siteurl'); // upgrdae multiple $multiple_upgrade = false; //issue #1511 $prev_pack_id = mgm_get_var('prev_pack_id', '', true); $prev_membership_type = mgm_get_var('membership_type', '', true); // get member // issue#: 843 (3) if (isset($prev_pack_id) && (int) $prev_pack_id > 0 && isset($prev_membership_type) && !empty($prev_membership_type)) { // only for multiple membership upgrade $multiple_upgrade = true; // get member $member = mgm_get_member_another_purchase($user->ID, $prev_membership_type, $prev_pack_id); // mark status as inactive $member->status = MGM_STATUS_NULL; } else { $member = mgm_get_member($user->ID); //this is a fix for issue#: 589, see the notes for details: //This is to read saved coupons as array in order to fix the fatal error on some servers. //This will change the object on each users profile view. //Also this will avoid using patch for batch update, $old_coupons_found = 0; // loop foreach (array('upgrade', 'extend') as $coupon_type) { // check if (isset($member->{$coupon_type}['coupon']) && is_object($member->{$coupon_type}['coupon'])) { // convert $member->{$coupon_type}['coupon'] = (array) $member->{$coupon_type}['coupon']; // mark $old_coupons_found++; } } // save if old coupons found if ($old_coupons_found) { $member->save(); } } // other objects $system_obj = mgm_get_class('system'); $packs_obj = mgm_get_class('subscription_packs'); // membership_type $membership_type = isset($prev_membership_type) && !empty($prev_membership_type) ? $prev_membership_type : mgm_get_user_membership_type($user->ID, 'code'); // captured above // duration $duration_str = $packs_obj->duration_str; $trial_taken = $member->trial_taken; // pack_id if main mgm_member / multiple membership $pack_id = isset($prev_pack_id) && (int) $prev_pack_id > 0 ? $prev_pack_id : (int) $member->pack_id; // got pack if ($pack_id) { $pack_details = $packs_obj->get_pack($pack_id); $pack_membership_type = $pack_details['membership_type']; $preference = $pack_details['preference']; } else { $preference = 0; } // action - issue #1275 $action = mgm_get_var('action', '', true); if ($action == 'complete_payment') { // get active packs on complete payment page $active_packs = $packs_obj->get_packs('register'); } else { // get active packs on upgrade page $active_packs = $packs_obj->get_packs('upgrade'); //issue #1368 // loop and preference foreach ($active_packs as $_pack) { // set preference order for later sort $pack_preferences[] = $_pack['preference']; } // preference sort packs if (count($pack_preferences) > 0) { // preference sort sort($pack_preferences); //preference sorted $preferences_sorted = array(); // loop by preference foreach ($pack_preferences as $pack_preference) { //issue #1710 if ($pack_preference >= $preference) { // loop packs foreach ($active_packs as $_pack) { // preference order match if ($_pack['preference'] == $pack_preference) { // duplicate check if (!in_array($_pack['id'], $preferences_sorted)) { // set pack $preference_packs[] = mgm_stripslashes_deep($_pack); // mark as preference sorted $preferences_sorted[] = $_pack['id']; } } } } } } $active_packs = $preference_packs; } // issue#: 664 // action : upgrade/complete_payment. Allow complete payment only if there is an associated $pack_id and the current subscription is not free/trial $action = !empty($action) && (int) $pack_id > 0 ? $action : 'upgrade'; // upgrade or complete_payment // show current $show_current_pack = false; // switch if ($action == 'complete_payment' && isset($pack_membership_type) && in_array($pack_membership_type, array('free', 'trial'))) { // upgrade $action = 'upgrade'; // show current $show_current_pack = true; } // form action // carry forward get params $url_parms = array('action' => $action, 'user_id' => $user->ID); // 'username'=> $username, // prev_membership_type if (isset($prev_membership_type)) { $url_parms['membership_type'] = $prev_membership_type; } // prev_pack_id if (isset($prev_pack_id)) { $url_parms['prev_pack_id'] = $prev_pack_id; } // form action $form_action = mgm_get_custom_url('transactions', false, $url_parms); // issue 1009 if (!($membership_details_url = $system_obj->get_setting('membership_details_url'))) { $membership_details_url = get_admin_url() . 'profile.php?page=mgm/profile'; } // cancel $cancel_url = $action == 'upgrade' && $user->ID > 0 ? $membership_details_url : mgm_get_custom_url('login'); // active modules $a_payment_modules = $system_obj->get_active_modules('payment'); // bug from liquid-dynamiks.com theme #779 if (isset($_POST['wpsb_email'])) { unset($_POST['wpsb_email']); } // posted form----------------------------------------------------------------------- if (!empty($_POST) || isset($_GET['edit_userinfo'])) { // update user data if (isset($_POST['method']) && $_POST['method'] == 'update_user') { // user lib if (mgm_compare_wp_version('3.1', '<')) { // only before 3.1 require_once ABSPATH . WPINC . '/registration.php'; } // callback // do_action('personal_options_update', $user->ID); // not multisite, duplicate email allowed ? if (!is_multisite()) { // save $errors = mgm_user_profile_update($user->ID); } else { // multi site // get user $user = get_userdata($user->ID); // update here: // Update the email address, if present. duplicate check if ($user->user_login && isset($_POST['user_email']) && is_email($_POST['user_email']) && $wpdb->get_var($wpdb->prepare("SELECT user_login FROM {$wpdb->signups} WHERE user_login = %s", $user->user_login))) { $wpdb->query($wpdb->prepare("UPDATE {$wpdb->signups} SET user_email = %s WHERE user_login = %s", $_POST['user_email'], $user->user_login)); } // edit if (!isset($errors) || isset($errors) && is_object($errors) && false == $errors->get_error_codes()) { $errors = mgm_user_profile_update($user->ID); } } // errors if (isset($errors) && !is_numeric($errors)) { // get error $error_html = mgm_set_errors($errors, true); // edit flag $_GET['edit_userinfo'] = 1; } } // second step for complete payment, userdata edit if (isset($_GET['edit_userinfo'])) { // error if (isset($error_html)) { $html .= $error_html; } // form $html .= sprintf('<form action="%s" method="post" class="mgm_form">', $form_action); $html .= sprintf('<p>%s</p>', __('Edit Your Personal Information', 'mgm')); // get custom fields $html .= mgm_user_profile_form($user->ID, true); // html $html .= '<input type="hidden" name="ref" value="' . md5($member->amount . '_' . $member->duration . '_' . $member->duration_type . '_' . $member->membership_type) . '" />'; $html .= '<input type="hidden" name="form_action" value="' . $form_action . '" />'; $html .= '<input type="hidden" name="subs_opt" value="' . $_POST['subs_opt'] . '" rel="mgm_subscription_options"/>'; // carry forward mgm_payment_gateways field value: issue#: 919 if (isset($_POST['mgm_payment_gateways'])) { $html .= '<input type="hidden" name="mgm_payment_gateways" value="' . $_POST['mgm_payment_gateways'] . '" />'; } //issue #1236 if (isset($_POST['mgm_upgrade_field']['coupon']) && !empty($_POST['mgm_upgrade_field']['coupon'])) { //issue #1250 - Coupon validation if (!empty($_POST['form_action'])) { //issue #1591 $coupon_err_redirect_url = $_POST['form_action']; if (preg_match('/complete_payment/', $coupon_err_redirect_url)) { $coupon_err_redirect_url = str_replace('&edit_userinfo=1', '', $coupon_err_redirect_url); } // check if its a valid coupon if (!($coupon = mgm_get_coupon_data($_POST['mgm_upgrade_field']['coupon']))) { //redirect back to the form $q_arg = array('error_field' => 'Coupon', 'error_type' => 'invalid', 'error_field_value' => $_POST['mgm_upgrade_field']['coupon']); $redirect = add_query_arg($q_arg, $coupon_err_redirect_url); mgm_redirect($redirect); exit; } else { // get subs if ($subs_pack = mgm_decode_package(mgm_post_var('subs_opt'))) { // values $coupon_values = mgm_get_coupon_values(NULL, $coupon['value'], true); // check if (isset($coupon_values['new_membership_type']) && $coupon_values['new_membership_type'] != $subs_pack['membership_type']) { $new_membership_type = mgm_get_membership_type_name($coupon_values['new_membership_type']); $q_arg = array('error_field' => 'Coupon', 'error_type' => 'invalid', 'membership_type' => $coupon_values['new_membership_type'], 'error_field_value' => $_POST['mgm_upgrade_field']['coupon']); $redirect = add_query_arg($q_arg, $coupon_err_redirect_url); mgm_redirect($redirect); exit; } } } } $html .= '<input type="hidden" name="mgm_upgrade_field[coupon]" value="' . $_POST['mgm_upgrade_field']['coupon'] . '" class="mgm_upgrade_field">'; } // set $html .= sprintf('<p> <input class="button button-primary" type="button" name="back" onclick="window.location=\'%s\'" value="%s" /> <input class="button button-primary" type="submit" name="submit" value="%s" /> <input class="button button-primary" type="button" name="cancel" onclick="window.location=\'%s\'" value="%s" /> </p>', $form_action, __('Back', 'mgm'), __('Save & Next', 'mgm'), $cancel_url, __('Cancel', 'mgm')); // html $html .= '</form>'; // final step, show payment buttons } elseif (isset($_POST['submit'])) { // verify selected if (!isset($_POST['subs_opt'])) { // die return sprintf(__('Package not selected, <a href="%s">go back</a>.', 'mgm'), $_POST['form_action']); exit; } // check and validate passed data if ($_POST['ref'] != md5($member->amount . '_' . $member->duration . '_' . $member->duration_type . '_' . $member->membership_type)) { // die return __('Package data tampered. Cheatin!', 'mgm'); exit; } // get selected pack $selected_pack = mgm_decode_package($_POST['subs_opt']); // check selected pack is a valid pack $valid = false; // loop packs foreach ($active_packs as $pack) { // check if ($pack['cost'] == $selected_pack['cost'] && $pack['duration'] == $selected_pack['duration'] && $pack['duration_type'] == $selected_pack['duration_type'] && $pack['membership_type'] == $selected_pack['membership_type'] && $pack['id'] == $selected_pack['pack_id']) { // valid $valid = true; break; } } // error if (!$valid) { return __('Invalid package data. Cheatin!', 'mgm'); exit; } //update description if not set if (!isset($selected_pack['description'])) { $selected_pack['description'] = $pack['description']; } //update pack currency - issue #1602 if (isset($pack['currency']) && !empty($pack['currency'])) { $selected_pack['currency'] = $pack['currency']; } // num cycle if (!isset($selected_pack['num_cycles'])) { //Note the above break in for loop: $selected_pack['num_cycles'] = $pack['num_cycles']; } //issue#: 658 if (isset($pack['role'])) { $selected_pack['role'] = $pack['role']; } //applicable modules: $selected_pack['modules'] = $pack['modules']; $selected_pack['product'] = $pack['product']; // trial if ($pack['trial_on']) { $selected_pack['trial_on'] = $pack['trial_on']; $selected_pack['trial_duration'] = $pack['trial_duration']; $selected_pack['trial_duration_type'] = $pack['trial_duration_type']; $selected_pack['trial_cost'] = $pack['trial_cost']; $selected_pack['trial_num_cycles'] = $pack['trial_num_cycles']; } // save member data including coupon etc, MUST save after all validation passed, we dont want any // unwanted value in member object unless its a valid upgrade // save if ($multiple_upgrade) { $member = mgm_save_partial_fields(array('on_upgrade' => true), 'mgm_upgrade_field', $selected_pack['cost'], true, strip_tags($_GET['action']), $member); } else { $member = mgm_save_partial_fields(array('on_upgrade' => true), 'mgm_upgrade_field', $selected_pack['cost'], true, strip_tags($_GET['action'])); } //save custom fields issue #1285 if (isset($_POST['mgm_upgrade_field']) && !empty($_POST['mgm_upgrade_field'])) { //upgrade custom fileds $cfu_fileds = mgm_get_class('member_custom_fields')->get_fields_where(array('display' => array('on_upgrade' => true))); //loop fields foreach ($cfu_fileds as $cf_filed) { //skip coupon and autoresponder if (in_array($cf_filed['name'], array('coupon', 'autoresponder'))) { continue; } //check if (isset($_POST['mgm_upgrade_field'][$cf_filed['name']])) { // check upgrae and required if ((bool) $cf_filed['attributes']['required'] === true) { if (empty($_POST['mgm_upgrade_field'][$cf_filed['name']])) { //redirect back to the form $q_arg = array('error_field' => $cf_filed['label'], 'error_type' => 'empty', 'error_field_value' => $_POST['mgm_upgrade_field'][$cf_filed['name']]); $redirect = add_query_arg($q_arg, $_POST['form_action']); mgm_redirect($redirect); exit; } } //appending custom fields if (isset($member->custom_fields->{$cf_filed}['name'])) { $member->custom_fields->{$cf_filed}['name'] = $_POST['mgm_upgrade_field'][$cf_filed['name']]; } else { $member->custom_fields->{$cf_filed}['name'] = $_POST['mgm_upgrade_field'][$cf_filed['name']]; } } } $member->save(); } //issue #860 if (isset($_POST['mgm_upgrade_field']['autoresponder']) && bool_from_yn($_POST['mgm_upgrade_field']['autoresponder'])) { $member->subscribed = 'Y'; $member->autoresponder = $system_obj->active_modules['autoresponder']; //issue #1511 if ($multiple_upgrade) { mgm_save_another_membership_fields($member, $user->ID); } else { $member->save(); } //issue #1276 } else { $member->subscribed = ''; $member->autoresponder = ''; //issue #1511 if ($multiple_upgrade) { mgm_save_another_membership_fields($member, $user->ID); } else { $member->save(); } } //issue #1236 if (isset($_POST['mgm_upgrade_field']['coupon']) && !empty($_POST['mgm_upgrade_field']['coupon'])) { //issue #1250 - Coupon validation if (!empty($_POST['form_action'])) { // check if its a valid coupon if (!($coupon = mgm_get_coupon_data($_POST['mgm_upgrade_field']['coupon']))) { //redirect back to the form $q_arg = array('error_field' => 'Coupon', 'error_type' => 'invalid', 'error_field_value' => $_POST['mgm_upgrade_field']['coupon']); $redirect = add_query_arg($q_arg, $_POST['form_action']); mgm_redirect($redirect); exit; } else { // get subs if ($subs_pack = mgm_decode_package(mgm_post_var('subs_opt'))) { // values $coupon_values = mgm_get_coupon_values(NULL, $coupon['value'], true); // check if (isset($coupon_values['new_membership_type']) && $coupon_values['new_membership_type'] != $subs_pack['membership_type']) { $new_membership_type = mgm_get_membership_type_name($coupon_values['new_membership_type']); $q_arg = array('error_field' => 'Coupon', 'error_type' => 'invalid', 'membership_type' => $coupon_values['new_membership_type'], 'error_field_value' => $_POST['mgm_upgrade_field']['coupon']); $redirect = add_query_arg($q_arg, $_POST['form_action']); mgm_redirect($redirect); exit; } } } } } // payment_gateways if set: Eg: $_POST['mgm_payment_gateways'] = mgm_paypal $cf_payment_gateways = isset($_POST['mgm_payment_gateways']) && !empty($_POST['mgm_payment_gateways']) ? $_POST['mgm_payment_gateways'] : null; // bypass step2 if payment gateway is submitted: issue #: 469 // removed complete_payment checking here in order to enable coupon for complete_payment. issue#: 802 if (!is_null($cf_payment_gateways)) { // get pack mgm_get_upgrade_coupon_pack($member, $selected_pack, strip_tags($_GET['action'])); // cost if ((double) $selected_pack['cost'] > 0) { //get an object of the payment gateway: $mod_obj = mgm_get_module($cf_payment_gateways, 'payment'); // tran options $tran_options = array('user_id' => $user->ID); // is register & purchase if (isset($_POST['post_id'])) { $tran_options['post_id'] = (int) $_POST['post_id']; } // if multiple membership if ($multiple_upgrade) { $tran_options['is_another_membership_purchase'] = true; // This is to replace current mgm_member object with new mgm_member object of the upgrade pack $tran_options['multiple_upgrade_prev_packid'] = mgm_get_var('prev_pack_id', '', true); } // upgrade flag if ($action == 'upgrade') { $tran_options['subscription_option'] = 'upgrade'; } // create transaction // $tran_id = $mod_obj->_create_transaction($selected_pack, $tran_options); $tran_id = mgm_add_transaction($selected_pack, $tran_options); //bypass directly to process return if manual payment: if ($cf_payment_gateways == 'mgm_manualpay') { // set $_POST['custom'] = $tran_id; // direct call to module return function: $mod_obj->process_return(); // exit exit; } // set redirect $redirect = add_query_arg(array('tran_id' => mgm_encode_id($tran_id)), $mod_obj->_get_endpoint('html_redirect', true)); // redirect mgm_redirect($redirect); // this goes to subscribe, mgm_functions.php/mgm_get_subscription_buttons // exit exit; } } // end gateway // get coupon pack mgm_get_upgrade_coupon_pack($member, $selected_pack, strip_tags($_GET['action'])); // start html $html = '<div>'; // free package if (($selected_pack['cost'] == 0 || $selected_pack['membership_type'] == 'free') && in_array('mgm_free', $a_payment_modules) && mgm_get_module('mgm_free')->enabled == 'Y') { // html $html .= sprintf('<div>%s - %s</div>', __('Create a free account ', 'mgm'), ucwords($selected_pack['membership_type'])); // module $module = 'mgm_free'; // payments url $payments_url = mgm_get_custom_url('transactions'); // if tril module selected and cost is 0 and free moduleis not active if ($selected_pack['membership_type'] == 'trial') { // check if (in_array('mgm_trial', $a_payment_modules)) { // module $module = 'mgm_trial'; } } // query_args -issue #1005 $query_args = array('method' => 'payment_return', 'module' => $module, 'custom' => implode('_', array($user->ID, $selected_pack['duration'], $selected_pack['duration_type'], $selected_pack['pack_id'], 'N', $selected_pack['membership_type']))); // redirector if (isset($_REQUEST['redirector'])) { // set $query_args['redirector'] = $_REQUEST['redirector']; } // redirect to module to mark the payment as complete $redirect = add_query_arg($query_args, $payments_url); // redirect if (!headers_sent()) { @header('location: ' . $redirect); } else { // js redirect $html .= sprintf('<script type="text/javascript">window.location = "%s";</script><div>%s</div>', $redirect, $packs_obj->get_pack_desc($pack)); } } else { // paid package, generate buy buttons // set html $html .= sprintf('<div class="mgm_get_subs_btn">%s</div>', $packs_obj->get_pack_desc($selected_pack)); // coupon if (isset($member->upgrade) && is_array($member->upgrade) && isset($member->upgrade['coupon']['id'])) { // set html $html .= sprintf('<div class="mgm_get_subs_btn">%s</div>', sprintf(__('Using Coupon "%s" - %s', 'mgm'), $member->upgrade['coupon']['name'], $member->upgrade['coupon']['description'])); } // set html $html .= sprintf('<div class="mgm_get_subs_btn">%s</div>', __('Please Select from Available Payment Gateways', 'mgm')); } // init $payment_modules = array(); // active if (count($a_payment_modules) > 0) { // loop foreach ($a_payment_modules as $payment_module) { // not trial if (in_array($payment_module, array('mgm_free', 'mgm_trial'))) { continue; } // consider only the modules assigned to pack if (isset($selected_pack['modules']) && !in_array($payment_module, (array) $selected_pack['modules'])) { continue; } // store $payment_modules[] = $payment_module; } } // loop payment module if not free if (count($payment_modules) && $selected_pack['cost']) { // transaction $tran_id = false; $tran_options = array('user_id' => $user->ID); // if multiple membership if ($multiple_upgrade) { // another $tran_options['is_another_membership_purchase'] = true; // This is to replace current mgm_member object with new mgm_member object of the upgrade pack $tran_options['multiple_upgrade_prev_packid'] = mgm_get_var('prev_pack_id', '', true); } // upgrade if ($action == 'upgrade') { $tran_options['subscription_option'] = 'upgrade'; } // loop foreach ($payment_modules as $module) { // module $mod_obj = mgm_get_module($module, 'payment'); // create transaction // if(!$tran_id) $tran_id = $mod_obj->_create_transaction($selected_pack, $extra_options); if (!$tran_id) { $tran_id = mgm_add_transaction($selected_pack, $tran_options); } // set html $html .= sprintf('<div>%s</div>', $mod_obj->get_button_subscribe(array('pack' => $selected_pack, 'tran_id' => $tran_id))); } // mgm_pr($_REQUEST); // profile edit #698 if ($_GET['action'] == 'complete_payment') { // update $form_action for user data edit if (isset($_COOKIE['wp_tempuser_login']) && $_COOKIE['wp_tempuser_login'] == $user->ID && !isset($_GET['edit_userinfo'])) { // form action $form_action = add_query_arg(array('edit_userinfo' => 1), $form_action); // action $html .= sprintf('<form action="%s" method="post" class="mgm_form">', $form_action); $html .= '<input type="hidden" name="ref" value="' . md5($member->amount . '_' . $member->duration . '_' . $member->duration_type . '_' . $member->membership_type) . '" />'; $html .= '<input type="hidden" name="form_action" value="' . $form_action . '" />'; $html .= '<input type="hidden" name="subs_opt" value="' . $_POST['subs_opt'] . '" rel="mgm_subscription_options"/>'; // set $html .= sprintf('<p><input type="button" name="back" onclick="window.location=\'%s\'" value="%s" class="button-primary" /> <input type="button" name="cancel" onclick="window.location=\'%s\'" value="%s" class="button-primary" /> </p>', $form_action, __('Edit Personal Information', 'mgm'), $cancel_url, __('Cancel', 'mgm')); // html $html .= '</form>'; } } } else { // no module error if ($selected_pack['cost']) { // set html $html .= sprintf('<div>%s</div>', __('Error, no payment gateways active on upgrade page, notify administrator.', 'mgm')); } } // html $html .= '</div>'; } // end final step post } else { // generate upgrade/complete payment form ---------------------------------------------------------- // selected subscription, from args (shortcode) or get url $selected_pack = mgm_get_selected_subscription($args); $css_group = mgm_get_css_group(); // upgrade_packages $upgrade_packages = ''; // pack count $pack_count = 0; // pack to modules $pack_modules = array(); //mgm_pr($active_packs); //issue #1553 if (!empty($active_packs)) { // loop packs foreach ($active_packs as $pack) { // mgm_pr($pack); // default $checked = ''; // for complete payment only show purchased pack if ($action == 'complete_payment') { // pack selected if (isset($pack_id)) { // leave other pack, if not show other packs if ($pack['id'] != $pack_id && !isset($_GET['show_other_packs'])) { continue; } // select if ($pack['id'] == $pack_id) { $checked = 'checked="checked"'; } } } else { // 'upgrade': // upgrade // echo '<br>pack#' . $pack['id'] . ' step1'; // leave current pack, it will goto extend if (isset($pack_id)) { if (!$show_current_pack && $pack['id'] == $pack_id) { continue; } } // echo '<br>pack#' . $pack['id'] . ' step2'; // skip trial or free packs if (in_array($pack['membership_type'], array('trial', 'free'))) { continue; } // echo '<br>pack#' . $pack['id'] . ' step3'; // skip if not allowed if (!mgm_pack_upgrade_allowed($pack)) { continue; } // echo '<br>pack#' . $pack['id'] . ' step4'; // selected pack if ($selected_pack !== false) { // checked $checked = mgm_select_subscription($pack, $selected_pack); // skip other when a package sent as selected if (empty($checked)) { continue; } } // echo '<br>pack#' . $pack['id'] . ' step5'; } // checked if (!$checked) { $checked = (int) $pack['default'] == 1 ? ' checked="checked"' : ''; } // duration if ($pack['duration'] == 1) { $dur_str = rtrim($duration_str[$pack['duration_type']], 's'); } else { $dur_str = $duration_str[$pack['duration_type']]; } // encode pack $subs_opt_enc = mgm_encode_package($pack); // set $pack_modules[$subs_opt_enc] = $pack['modules']; // free if (($pack['cost'] == 0 || strtolower($pack['membership_type']) == 'free') && in_array('mgm_free', $a_payment_modules) && mgm_get_module('mgm_free')->is_enabled()) { // input $input = sprintf('<input type="radio" %s class="checkbox" name="subs_opt" value="%s" rel="mgm_subscription_options"/>', $checked, $subs_opt_enc); // html $upgrade_packages .= ' <div class="mgm_subs_wrapper ' . $pack['membership_type'] . '"> <div class="mgm_subs_option ' . $pack['membership_type'] . '"> ' . $input . ' </div> <div class="mgm_subs_pack_desc ' . $pack['membership_type'] . '"> ' . $packs_obj->get_pack_desc($pack) . ' </div> <div class="clearfix"></div> <div class="mgm_subs_desc ' . $pack['membership_type'] . '"> ' . mgm_stripslashes_deep($pack['description']) . ' </div> </div>'; } else { // input $input = sprintf('<input type="radio" %s class="checkbox" name="subs_opt" value="%s" rel="mgm_subscription_options"/>', $checked, $subs_opt_enc); // html $upgrade_packages .= ' <div class="mgm_subs_wrapper ' . $pack['membership_type'] . '"> <div class="mgm_subs_option ' . $pack['membership_type'] . '"> ' . $input . ' </div> <div class="mgm_subs_pack_desc ' . $pack['membership_type'] . '"> ' . $packs_obj->get_pack_desc($pack) . ' </div> <div class="clearfix"></div> <div class="mgm_subs_desc ' . $pack['membership_type'] . '"> ' . mgm_stripslashes_deep($pack['description']) . ' </div> </div>'; } // count $pack_count++; } } // start $html = ''; // html if ($pack_count > 1) { $html .= sprintf('<p class="message register">%s</p>', __('Please Select from Available Membership Packages', 'mgm')); } // add pack_modules as json data, may consider jquery data later if (!empty($pack_modules)) { $html .= sprintf('<script language="javascript">var mgm_pack_modules = %s</script>', json_encode($pack_modules)); } //issue #867 if ($css_group != 'none') { // set css $html .= sprintf('<link rel="stylesheet" href="%s/css/%s/mgm.form.fields.css" type="text/css" media="all" />', untrailingslashit(MGM_ASSETS_URL), $css_group); } // show error when no upgrde if (!$upgrade_packages) { // html $html .= '<div class="mgm_subs_wrapper"> <div class="mgm_subs_pack_desc"> ' . __('Sorry, no upgrades available.', 'mgm') . ' </div> </div> <p> <input type="button" name="cancel" onclick="window.location=\'' . $cancel_url . '\'" value="' . __('Cancel', 'mgm') . '" class="button-primary" /> </p>'; } else { // edit/other pack link $edit_button = $other_packs_button = ''; // issue #: 675, issue #1279 if ($action == 'complete_payment' || isset($_REQUEST['action']) && $_REQUEST['action'] == 'complete_payment') { // issue#: 416 // mgm_pr($_GET); if (isset($_GET['show_other_packs'])) { // other packs url - issue #1279, #1215 update, other packs url missed username $other_packs_url = add_query_arg(array('action' => 'complete_payment', 'username' => $username), mgm_get_custom_url('transactions')); // mgm_get_current_url() //$other_packs_url = str_replace('&show_other_packs=1', '', $other_packs_url); $other_packs_label = __('Show subscribed package', 'mgm') . ''; } else { // other packs url - issue #1279, #1215 update, other packs url missed username $other_packs_url = add_query_arg(array('action' => 'complete_payment', 'show_other_packs' => 1, 'username' => $username), mgm_get_custom_url('transactions')); // mgm_get_current_url() $other_packs_label = __('Show other packages', 'mgm'); } // issue#: 710 if (count($active_packs) > 1) { // button $other_packs_button = sprintf('<input type="button" value="%s" class="button-primary" onclick="window.location=\'%s\'">', $other_packs_label, $other_packs_url); } // update $form_action for user data edit if (isset($_COOKIE['wp_tempuser_login']) && $_COOKIE['wp_tempuser_login'] == $user->ID && !isset($_GET['edit_userinfo'])) { $form_action = add_query_arg(array('edit_userinfo' => 1), $form_action); } else { //issue #1279 $form_action = add_query_arg(array('action' => 'complete_payment', 'username' => $username, 'edit_userinfo' => 1), mgm_get_current_url()); } } // echo $form_action; // check errors if any: $html .= mgm_subscription_purchase_errors(); // form $html .= sprintf('<form action="%s" method="post" class="mgm_form">', $form_action); $html .= sprintf('<div class="mgm_get_pack_form_container">%s', $upgrade_packages); //issue #1285 $html .= mgm_get_custom_fields($user->ID, array('on_upgrade' => true), 'mgm_upgrade_field'); $html .= '<input type="hidden" name="ref" value="' . md5($member->amount . '_' . $member->duration . '_' . $member->duration_type . '_' . $member->membership_type) . '" />'; $html .= '<input type="hidden" name="form_action" value="' . $form_action . '" />'; // set $html .= sprintf('<p>%s <input class="button button-primary" type="submit" name="submit" value="%s" /> <input class="button button-primary" type="button" name="cancel" onclick="window.location=\'%s\'" value="%s" /> </p>', $other_packs_button, __('Next', 'mgm'), $cancel_url, __('Cancel', 'mgm')); // html $html .= '</div></form>'; } // end generate form } // end // return return $html; }
/** * Cancel Recurring Subscription * This is not a private function * @param int/string $trans_ref * @param int $user_id * @param int/string $subscr_id * @param int $pack_id * @return boolean */ function cancel_recurring_subscription($trans_ref = null, $user_id = null, $subscr_id = null, $pack_id = null) { //if coming form process return after a subscription payment if (!empty($trans_ref)) { $transdata = $this->_get_transaction_passthrough($trans_ref); if ($transdata['payment_type'] != 'subscription_purchase') { return false; } $user_id = $transdata['user_id']; if (isset($transdata['is_another_membership_purchase']) && $transdata['is_another_membership_purchase'] == 'Y') { $member = mgm_get_member_another_purchase($user_id, $transdata['membership_type']); } else { $member = mgm_get_member($user_id); } if (isset($member->payment_info->module) && !empty($member->payment_info->module)) { if (isset($member->payment_info->subscr_id)) { $subscr_id = $member->payment_info->subscr_id; } else { //check pack is recurring: $pid = $pack_id ? $pack_id : $member->pack_id; if ($pid) { $s_packs = mgm_get_class('subscription_packs'); $sel_pack = $s_packs->get_pack($pid); if ($sel_pack['num_cycles'] != 1) { $subscr_id = 0; } } } //check for same module: if not call the same function of the applicale module. if (str_replace('mgm_', '', $member->payment_info->module) != str_replace('mgm_', '', $this->code)) { mgm_log('RECALLing ' . $member->payment_info->module . ': cancel_recurring_subscription FROM: ' . $this->code); return mgm_get_module($member->payment_info->module, 'payment')->cancel_recurring_subscription($trans_ref, null, null, $pack_id); } //skip if same pack is updated if (empty($member->pack_id) || is_numeric($pack_id) && $pack_id == $member->pack_id) { return false; } } else { return false; } } else { if ($this->setting['aquirer'] != 'sisow') { // skip sisow return false; //skip as trans reff will need to be passed always } } //only for subscription_purchase if ($this->setting['aquirer'] == 'sisow') { if (!isset($member)) { $member = mgm_get_member($user_id); } $txn_id = $member->payment_info->txn_id; //mgm_pr($member); // endpoint $endpoint = $this->_get_endpoint(); // set $endpoint = str_replace('[action]', 'CancelReservationRequest', $endpoint); // keys $compute_keys = array($txn_id, $this->setting['merchant_id'], $this->setting['secret_key']); $compute_sha1 = sha1(implode('', $compute_keys)); $post_data = array('trxid' => $txn_id, 'merchantid' => $this->setting['merchant_id'], 'sha1' => $compute_sha1); // headers $http_headers = array(); //array('Content-Type' => 'text/xml'); //mgm_pr($post_data); die; // create curl post $http_response = mgm_remote_post($endpoint, $post_data, array('headers' => $http_headers, 'timeout' => 30, 'sslverify' => false)); mgm_log($http_response, __FUNCTION__); // parse if ($xml = @simplexml_load_string($http_response)) { mgm_log($xml, __FUNCTION__); // redirect to issuer if (isset($xml->reservation->status)) { return (string) $xml->reservation->status == 'Cancelled' ? true : false; } else { return false; } } } //send email only if setting enabled if (!empty($subscr_id) || $subscr_id === 0) { $system_obj = mgm_get_class('system'); $dge = bool_from_yn($system_obj->get_setting('disable_gateway_emails')); //send email only if setting enabled if (!$dge) { // blog $blogname = get_option('blogname'); // user $user = get_userdata($user_id); // notify admin mgm_notify_admin_membership_cancellation_manual_removal_required($blogname, $user, $member); } return true; } return false; }
function _buy_membership($transid = null) { // system $system_obj = mgm_get_class('system'); $s_packs = mgm_get_class('subscription_packs'); // get details //if transaction id is available: if (is_numeric($transid)) { $custom = $this->_get_transaction_passthrough($transid); extract($custom); // mgm_log($custom); } else { //Purchase Another Membership Level problem : issue #: 752 $is_another_membership_purchase = 'N'; $parts = explode('_', $_REQUEST['custom']); $params = array('user_id' => 0, 'duration' => '', 'duration_type' => '', 'pack_id' => 0, 'is_another_membership_purchase' => 'N', 'membership_type' => ''); $i = 0; foreach ($params as $param => $default) { if (isset($parts[$i])) { ${$param} = $parts[$i]; } else { ${$param} = $default; } $i++; } } // get pack $pack = $s_packs->get_pack($pack_id); // membership_type -issue #1005 if (empty($membership_type)) { $membership_type = $pack['membership_type']; } // user if ($user = get_userdata($user_id)) { //Purchase Another Membership Level problem : issue #: 752 if ($is_another_membership_purchase == 'Y') { // another_subscription modification //issue #1073 $member = mgm_get_member_another_purchase($user_id, $membership_type); } else { // get member $member = mgm_get_member($user_id); } //pack currency over rides genral setting currency - issue #1602 if (isset($pack['currency']) && !empty($pack['currency'])) { $currency = $pack['currency']; } else { $currency = $system_obj->setting['currency']; } // check //uncommented the below line as it is not updating in upgrade subscription //if (!$member->duration) { $member->duration = $duration ? $duration : 1; // one year $member->duration_type = $duration_type ? $duration_type : 'y'; $member->amount = 0.0; //$member->currency = 'USD';//not sure y hardcoded $member->currency = $currency; $member->membership_type = $membership_type; //} // set pack $member->pack_id = $pack_id; $member->active_num_cycles = isset($num_cycles) && !empty($num_cycles) ? $num_cycles : $pack['num_cycles']; // set status $member->status = MGM_STATUS_ACTIVE; $member->account_desc = __('Free Account', 'mgm'); $member->last_pay_date = ''; //reset payment_info if already set: if (isset($member->payment_info)) { unset($member->payment_info); } //unset rebill: if (isset($member->rebilled)) { unset($member->rebilled); } //unset transaction_id: if (isset($member->transaction_id)) { unset($member->transaction_id); } // join date $time = time(); // set if (!isset($member->join_date) || isset($member->join_date) && empty($member->join_date)) { $member->join_date = $time; } // old content hide - issue #1227 if (isset($hide_old_content)) { $member->hide_old_content = $hide_old_content; } // type expanded $duration_exprs = $s_packs->get_duration_exprs(); // if not lifetime/date range if (in_array($member->duration_type, array_keys($duration_exprs))) { // take only date exprs // @TODO, time should be last expire date #773, 3 use cases must be tracked // expect new param in tran subscription_type: new, upgrade, downgrade, extend $expire_date_ts = !$member->expire_date ? $time : strtotime($member->expire_date); // time $expire_date_ts = strtotime("+{$member->duration} {$duration_exprs[$member->duration_type]}", $expire_date_ts); // formatted $expire_date = date('Y-m-d', $expire_date_ts); // date extended if (!$member->expire_date || $expire_date_ts > strtotime($member->expire_date)) { $member->expire_date = $expire_date; } } else { //if lifetime: if ($member->duration_type == 'l') { // el = lifetime $member->expire_date = ''; } //issue #1096 if ($member->duration_type == 'dr') { // el = /date range $member->expire_date = $duration_range_end_dt; } } //Purchase Another Membership Level problem : issue #: 752 if (bool_from_yn($is_another_membership_purchase)) { $custom = array('is_another_membership_purchase' => 'Y'); } // old status $old_status = $member->status; // set new status $member->status = $new_status = MGM_STATUS_ACTIVE; // whether to subscriber the user to Autoresponder - This should happen only once //issue #1073 if (!empty($transid) && $transid != null) { $acknowledge_ar = mgm_subscribe_to_autoresponder($member, $transid); } else { $acknowledge_ar = mgm_subscribe_to_autoresponder($member, null); } // update if (isset($custom['is_another_membership_purchase']) && bool_from_yn($custom['is_another_membership_purchase'])) { // get object - issue #1227 $obj_sp = mgm_get_class('subscription_packs')->get($member->pack_id); if ($obj_sp['hide_old_content']) { $member->hide_old_content = $obj_sp['hide_old_content']; } mgm_save_another_membership_fields($member, $user_id); // Multiple membership upgrade: first time if ($transid && isset($custom['multiple_upgrade_prev_packid']) && is_numeric($custom['multiple_upgrade_prev_packid'])) { mgm_multiple_upgrade_save_memberobject($custom, $transid); } } else { // update $member->save(); } // on status - issue #1468 switch ($member->status) { case MGM_STATUS_ACTIVE: //sending notification email to user if ($notify_user && $is_registration == 'Y') { $user_pass = mgm_decrypt_password($member->user_password, $user_id); do_action('mgm_register_user_notification', $user_id, $user_pass); } break; } // status change event do_action('mgm_user_status_change', $user_id, $new_status, $old_status, 'module_' . $this->module, $member->pack_id); //update coupon usage do_action('mgm_update_coupon_usage', array('user_id' => $user_id)); // role if (isset($role)) { $obj_role = new mgm_roles(); $obj_role->add_user_role($user_id, $role); } // update pack/transaction if (is_numeric($transid)) { mgm_update_transaction(array('module' => $this->module, 'status_text' => __('Success', 'mgm')), $transid); } // return action do_action('mgm_return_' . $this->module, array('user_id' => $user_id)); // backward compatibility do_action('mgm_return_subscription_payment_' . $this->module, array('user_id' => $user_id)); // new , individual do_action('mgm_return_subscription_payment', array('user_id' => $user_id, 'acknowledge_ar' => $acknowledge_ar, 'mgm_member' => $member)); // new, global: pass mgm_member object to consider multiple level purchases as well. } }
/** * Cancel Recurring Subscription * This is not a private function * @param int/string $trans_ref * @param int $user_id * @param int/string $subscr_id * @return boolean */ function cancel_recurring_subscription($trans_ref = null, $user_id = null, $subscr_id = null, $pack_id = null) { //if coming form process return after a subscription payment if (!empty($trans_ref)) { $transdata = $this->_get_transaction_passthrough($trans_ref); if ($transdata['payment_type'] != 'subscription_purchase') { return false; } $user_id = $transdata['user_id']; if (isset($transdata['is_another_membership_purchase']) && $transdata['is_another_membership_purchase'] == 'Y') { $member = mgm_get_member_another_purchase($user_id, $transdata['membership_type']); } else { $member = mgm_get_member($user_id); } if (isset($member->payment_info->module) && !empty($member->payment_info->module)) { if (isset($member->payment_info->subscr_id)) { $subscr_id = $member->payment_info->subscr_id; } else { //check pack is recurring: $pid = $pack_id ? $pack_id : $member->pack_id; if ($pid) { $s_packs = mgm_get_class('subscription_packs'); $sel_pack = $s_packs->get_pack($pid); if ($sel_pack['num_cycles'] != 1) { $subscr_id = 0; } } } //check for same module: if not call the same function of the applicale module. if (str_replace('mgm_', '', $member->payment_info->module) != str_replace('mgm_', '', $this->code)) { // log // mgm_log('RECALLing '. $member->payment_info->module .': cancel_recurring_subscription FROM: ' . $this->code); // return return mgm_get_module($member->payment_info->module, 'payment')->cancel_recurring_subscription($trans_ref, null, null, $pack_id); } //skip if same pack is updated if (empty($member->pack_id) || is_numeric($pack_id) && $pack_id == $member->pack_id) { return false; } } else { return false; } } //only for subscription_purchase if ($subscr_id) { // set xml content $post_data = '<ARBCancelSubscriptionRequest xmlns="AnetApi/xml/v1/schema/AnetApiSchema.xsd"> <merchantAuthentication> <name>' . $this->setting['loginid'] . '</name> <transactionKey>' . $this->setting['tran_key'] . '</transactionKey> </merchantAuthentication> <refId>' . $user_id . '</refId> <subscriptionId>' . $subscr_id . '</subscriptionId> </ARBCancelSubscriptionRequest>'; // end point $endpoint = $this->_get_endpoint($this->status . '_arb'); // test_arb, live_aim etc. // headers $http_headers = array('Content-Type' => 'text/xml'); // create curl post $http_response = mgm_remote_post($endpoint, $post_data, array('headers' => $http_headers, 'timeout' => 30, 'sslverify' => false)); // parse response and store into a different array: // do not use $this->response here as this will overwrite previous theprevious values in one scenario $arb_response = $this->_process_response('arb', $http_response, false); // check if (isset($arb_response['response_status']) && $arb_response['response_status'] == 1) { return true; } } elseif (is_null($subscr_id) || $subscr_id === 0) { //send email to admin if subscription Id is absent $system_obj = mgm_get_class('system'); $dge = bool_from_yn($system_obj->get_setting('disable_gateway_emails')); //send email only if setting enabled if (!$dge) { // blog $blogname = get_option('blogname'); // user $user = get_userdata($user_id); // notify admin mgm_notify_admin_membership_cancellation_manual_removal_required($blogname, $user, $member); } // return return true; } // return return false; }
/** * unsubscribe default callback */ function mgm_member_unsubscribe() { // user_id from post extract($_POST); // system $system_obj = mgm_get_class('system'); $packs_obj = mgm_get_class('subscription_packs'); $dge = bool_from_yn($system_obj->get_setting('disable_gateway_emails')); // find user $user = get_userdata($user_id); $member = mgm_get_member($user_id); // multiple membesrhip level update: if (isset($_POST['membership_type']) && $member->membership_type != $_POST['membership_type']) { $member = mgm_get_member_another_purchase($user_id, $_POST['membership_type']); } // get pack if ($member->pack_id) { $subs_pack = $packs_obj->get_pack($member->pack_id); } else { $subs_pack = $packs_obj->validate_pack($member->amount, $member->duration, $member->duration_type, $member->membership_type); } // types $duration_exprs = $packs_obj->get_duration_exprs(); // default expire date $expire_date = $member->expire_date; if ($member->duration_type == 'l') { $expire_date = date('Y-m-d'); } // if trial on if ($subs_pack['trial_on'] && isset($duration_exprs[$subs_pack['trial_duration_type']])) { // if cancel data is before trial end, set cancel on trial expire_date $trial_expire_date = strtotime("+{$subs_pack['trial_duration']} {$duration_exprs[$subs_pack['trial_duration_type']]}", $member->join_date); // if lower if (time() < $trial_expire_date) { $expire_date = date('Y-m-d', $trial_expire_date); } } // old status $old_status = $member->status; // if today if ($expire_date == date('Y-m-d')) { // set new status $member->status = $new_status = MGM_STATUS_CANCELLED; // status string $member->status_str = __('Subscription Cancelled', 'mgm'); $member->expire_date = date('Y-m-d'); } else { // date format $date_format = mgm_get_date_format('date_format'); // set new status $member->status = $new_status = MGM_STATUS_AWAITING_CANCEL; // status string $member->status_str = sprintf(__('Subscription awaiting cancellation on %s', 'mgm'), date($date_format, strtotime($expire_date))); // reset on $member->status_reset_on = $expire_date; $member->status_reset_as = MGM_STATUS_CANCELLED; } // multiple memberhip level update: if ($post_membership_type = mgm_post_var('membership_type') && $member->membership_type != $post_membership_type) { mgm_save_another_membership_fields($member, $user_id); } else { $member->save(); } // status change event do_action('mgm_user_status_change', $user_id, $new_status, $old_status, 'member_unsubscribe', $member->pack_id); // send email notification to client $blogname = get_option('blogname'); // email $subject = sprintf(__('[%s] Subscription Cancelled', 'mgm'), $blogname); $message = __('This is an automatic notification from %1$s to %2$s (%3$s). This is a notification to inform you that your subscription has been cancelled. For more information please contact %4$s', 'mgm'); $message = sprintf($message, $blogname, $user->display_name, $user->user_email, $system_obj->setting['admin_email']); // send email notification to user mgm_mail($user->user_email, $subject, $message); // notify admin, only if gateway emails on if (!$dge) { $subject = "[{$blogname}] {$user->user_email} - {$new_status}"; $message = "\tUser display name: {$user->display_name}\n\n<br />\r\r\n\t\t\t\tUser email: {$user->user_email}\n\n<br />\r\r\n\t\t\t\tUser ID: {$user->ID}\n\n<br />\r\r\n\t\t\t\tMembership Type: {$membership_type}\n\n<br />\r\r\n\t\t\t\tNew status: {$new_status}\n\n<br />\r\r\n\t\t\t\tStatus message: {$member->status_str}\n\n<br />\t\t\t\t\t\r\r\n\t\t\t\tPayment Mode: Cancelled\n\n<br />\r\r\n\t\t\t\tPOST Data was: \n\n<br /><br /><pre>" . print_r($_POST, true) . '</pre>'; mgm_mail($system_obj->setting['admin_email'], $subject, $message); } // after cancellation hook do_action('mgm_membership_subscription_cancelled', array('user_id' => $user_id)); // message $lformat = mgm_get_date_format('date_format_long'); $message = sprintf(__("You have successfully Unsubscribed. Your account has been marked for cancellation on %s", "mgm"), $expire_date == date('Y-m-d') ? 'Today' : date($lformat, strtotime($expire_date))); // redirect //mgm_redirect('wp-admin/profile.php?page=mgm/profile&unsubscribed=true&unsubscribe_errors='.urlencode($message)); mgm_redirect(mgm_get_custom_url('membership_details', false, array('unsubscribe_errors' => urlencode($message)))); }