/**
  * 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;
 }
Esempio n. 3
0
 /**
  * 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;
 }
Esempio n. 5
0
 /**
  * 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;
 }
Esempio n. 7
0
 /**
  * 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;
 }
Esempio n. 12
0
 /**
  * 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" />&nbsp;&nbsp;
						      	 <input class="button button-primary" type="button" name="cancel" onclick="window.location=\'%s\'" value="%s" />&nbsp;					
					          </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" />&nbsp;					
										  </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" />&nbsp;					
					  </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" />&nbsp;&nbsp;
						      	 <input class="button button-primary" type="button" name="cancel" onclick="window.location=\'%s\'" value="%s" />&nbsp;					
					          </p>', $other_packs_button, __('Next', 'mgm'), $cancel_url, __('Cancel', 'mgm'));
            // html
            $html .= '</div></form>';
        }
        // end generate form
    }
    // end
    // return
    return $html;
}
Esempio n. 17
0
 /**
  * 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;
 }
Esempio n. 18
0
 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))));
}