/** * update subscription package * * @param none * @return subscription package * @verb POST * @action update * @url <site>/mgmapi/subscription_packages/update.<format> * @since 1.0 */ public function update_post() { // post vars $post_vars = $this->request->data['post']; // status $status = 'error'; $data = array(); // message $message = __('Subscription package update failed, ', 'mgm'); // save if (!($errors = $this->_validate_data('update', $post_vars))) { // trim $id = (int) $post_vars['id']; // pack $pack = isset($post_vars['pack']) ? $post_vars['pack'] : array(); // update if (mgm_update_subscription_package($id, $pack)) { // status $status = 'success'; // message $message = __('Subscription package updated successfully', 'mgm'); // data $data = array('pack' => mgm_get_subscription_package($id)); } else { $message .= __('Database error', 'mgm'); } } // response $response = array('status' => $status, 'message' => $message, 'data' => $data); // errors if ($errors !== FALSE) { $response = $response + array('errors' => $errors); } // return return array($response, 200); }
/** * Specifically check recurring status of each rebill for an expiry date * ALong with IPN post mechanism for rebills, the module will need to specifically request for the rebill status * @param int $user_id * @param object $member * @return boolean */ function query_rebill_status($user_id, $member = NULL) { // check if (isset($member->payment_info->subscr_id) && !empty($member->payment_info->subscr_id)) { // check pack if (isset($member->pack_id)) { if ($pack = mgm_get_subscription_package($member->pack_id)) { // one time billing cycle if (isset($pack['num_cycles']) && (int) $pack['num_cycles'] == 1) { // log mgm_log('Exit Flag for One time billing', $this->module . '_' . __FUNCTION__); // exit return false; } } } // add internal vars $data = array('PARTNER' => $this->setting['partner'], 'VENDOR' => $this->setting['vendor'], 'USER' => $this->setting['username'], 'PWD' => $this->setting['password'], 'TRXTYPE' => 'R', 'TENDER' => 'C', 'ACTION' => 'I', 'ORIGPROFILEID' => $member->payment_info->subscr_id); // log mgm_log($data, $this->module . '_' . __FUNCTION__); // data $data_str = _http_build_query($data, null, '&', '', false); // do not urlencode // post 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'); // post $http_response = mgm_remote_post($post_url, $data_str, array('headers' => $http_headers, 'timeout' => 30, 'sslverify' => false)); // respomse $response = array(); // parse parse_str($http_response, $response); // log mgm_log($response, $this->module . '_' . __FUNCTION__); // check if (isset($response['STATUS'])) { // old status $old_status = $member->status; // set status switch ($response['STATUS']) { case 'ACTIVE': // set new status $member->status = $new_status = MGM_STATUS_ACTIVE; // status string $member->status_str = __('Last payment cycle processed successfully', 'mgm'); // last pay date $last_pay_date = date('Y-m-d'); // today // date to add $date_add = mgm_get_pack_cycle_date((int) $member->pack_id, $member); // date to add if (isset($response['NEXTPAYMENT']) && !empty($response['NEXTPAYMENT'])) { // convert to date $response['NEXTPAYMENT'] = $this->_maketime($response['NEXTPAYMENT']); // make time // check if ($date_add !== false) { // new expire date should be later than current expire date, #1223 $last_pay_date = strtotime(str_replace('+', '-', $date_add), $response['NEXTPAYMENT']); // start date // $response['START'] = $this->_maketime($response['START']); // mmddyyyy // check before start date if ($last_pay_date < $member->join_date) { $last_pay_date = $member->join_date; } // format $last_pay_date = date('Y-m-d', $last_pay_date); } } // last pay date $member->last_pay_date = $last_pay_date; //date('Y-m-d', strtotime($last_pay_date)); // last pay date // $member->last_pay_date = (isset($response['LASTPAYMENTDATE'])) ? date('Y-m-d', strtotime($response['LASTPAYMENTDATE'])) : date('Y-m-d'); // expire date if (isset($response['NEXTPAYMENT']) && !empty($member->expire_date)) { // date to add // $date_add = mgm_get_pack_cycle_date((int)$member->pack_id, $member); // check if ($date_add !== false) { // new expire date should be later than current expire date, #1223 $new_expire_date = date('Y-m-d', strtotime($date_add, strtotime($member->last_pay_date))); // apply on last pay date so the calc always treat last pay date form gateway if (strtotime($new_expire_date) > strtotime($member->expire_date)) { $member->expire_date = $new_expire_date; } } else { // set last pay date if greater than expire date if (strtotime($member->last_pay_date) > strtotime($member->expire_date)) { $member->expire_date = $member->last_pay_date; } } } // save $member->save(); // only run in cron, other wise too many tracking will be added // if( defined('DOING_QUERY_REBILL_STATUS') && DOING_QUERY_REBILL_STATUS != 'manual' ){ // transaction_id $transaction_id = $member->transaction_id; // hook args $args = array('user_id' => $user_id, 'transaction_id' => $transaction_id); // after succesful payment hook do_action('mgm_membership_transaction_success', $args); // backward compatibility do_action('mgm_subscription_purchase_payment_success', $args); // new organized name // } break; case 'VENDOR INACTIVE': case 'DEACTIVATED BY MERCHANT': // if expire date in future, let as awaiting if (!empty($member->expire_date) && strtotime($member->expire_date) > time()) { // 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($member->expire_date))); // set reset date $member->status_reset_on = $member->expire_date; // reset as $member->status_reset_as = MGM_STATUS_CANCELLED; } else { // set cancelled // set new status $member->status = $new_status = MGM_STATUS_CANCELLED; // status string $member->status_str = __('Last payment cycle cancelled', 'mgm'); } // save $member->save(); // only run in cron, other wise too many tracking will be added // if( defined('DOING_QUERY_REBILL_STATUS') && DOING_QUERY_REBILL_STATUS != 'manual' ){ // after cancellation hook do_action('mgm_membership_subscription_cancelled', array('user_id' => $user_id)); // } break; case 'EXPIRED': // set new status $member->status = $new_status = MGM_STATUS_EXPIRED; // status string $member->status_str = __('Last payment cycle expired', 'mgm'); // save $member->save(); break; case 'TOO MANY FAILURES': // set new status $member->status = $new_status = MGM_STATUS_NULL; // status string $member->status_str = __('Last payment cycle failed, too many failed transactions.', 'mgm'); // save $member->save(); break; } // action if (isset($new_status) && $new_status != $old_status) { // user status change do_action('mgm_user_status_change', $user_id, $new_status, $old_status, 'module_' . $this->module, $member->pack_id); // rebill status change do_action('mgm_rebill_status_change', $user_id, $new_status, $old_status, 'query'); // query or notify } // return as a successful rebill return true; } } // return return false; //default to false to skip normal modules }