public function pull_purchase_code($api, $purchase_code, $api_raw_data = array(), $existing_shub_user_id = false) { $purchase_code = strtolower(preg_replace('#([a-z0-9]{8})-?([a-z0-9]{4})-?([a-z0-9]{4})-?([a-z0-9]{4})-?([a-z0-9]{12})#', '$1-$2-$3-$4-$5', $purchase_code)); // todo: add documentation that it needs to be named "Purchase Code" // todo: add a default extra value called Purchase Code. if (strlen($purchase_code) != 36) { return false; } // check existing purchase code and return that if it's cached $existing_purchase = shub_get_single('shub_envato_purchase', 'purchase_code', $purchase_code); if ($existing_purchase && $existing_purchase['shub_envato_purchase_id']) { // if there is a matching support id, grab that cached support data, add shub_user_id do it and return it // this matches our return data below. // if we don't find this then we continue below and call the API again to get fresh data. $existing_support = shub_get_single('shub_envato_support', array('shub_envato_purchase_id'), array($existing_purchase['shub_envato_purchase_id'])); if ($existing_support && $existing_support['shub_user_id'] && $existing_support['support_data']) { $return = @json_decode($existing_support['support_data'], true); if ($return) { $return['shub_user_id'] = $existing_support['shub_user_id']; return $return; } } } $accounts = array(); if (!$api) { // loop through accounts and try an API call on each one. $accounts = $this->get_accounts(); } do { if ($accounts) { // grab an API from this account. $account = array_shift($accounts); $shub_envato_account = new shub_envato_account($account['shub_account_id']); // found the account, pull in the API and build the url $api = $shub_envato_account->get_api(); } if (!$api) { break; } // $result = $api->api('v1/market/private/user/verify-purchase:' . $purchase_code . '.json'); $result = $api->api('v2/market/author/sale?code=' . $purchase_code); /* { "amount": "12.60", "sold_at": "2015-08-18T21:30:02+10:00", "item": { "id": 1299019, "name": "WooCommerce Australia Post Shipping Calculator", "description": ... "site": "codecanyon.net", "classification": "wordpress/ecommerce/woocommerce/shipping", "classification_url": "http://codecanyon.net/category/wordpress/ecommerce/woocommerce/shipping", "price_cents": 1800, "number_of_sales": 1054, "author_username": "******", "author_url": "http://codecanyon.net/user/dtbaker", "author_image": "https://0.s3.envato.com/files/111547951/dtbaker-php-scripts-wordpress-themes-and-plugins.png", "url": "http://codecanyon.net/item/woocommerce-australia-post-shipping-calculator/1299019", "thumbnail_url": "https://0.s3.envato.com/files/15047665/thumb.png", "summary": "High Resolution: No, Compatible With: WooCommerce 2.3.x, Software Version: WordPress 4.2, WordPress 4.1, WordPress 4.0, WordPress 3.9, WordPress 3.8, WordPress 3.7", "rating": { "rating": 3.82, "count": 49 }, "updated_at": "2015-08-13T12:34:59+10:00", "published_at": "2012-01-15T17:59:18+11:00", "trending": false, "previews": { "landscape_preview": { "landscape_url": "https://image-cc.s3.envato.com/files/15047663/preview.jpg" } } }, "license": "Regular License", "code": "c77ff344-9be4-4ba1-9e50-ce92e37c33e0", "support_amount": "" } }*/ if ($result && !empty($result['item']) && !empty($result['item']['id'])) { // valid purchase code. // what is the username attached to this purchase result? $envato_username = $result['buyer']; // find this user in our system. $shub_user = new SupportHubUser_Envato(); if ($existing_shub_user_id) { $shub_user->load($existing_shub_user_id); } else { $shub_user->load_by_meta('envato_username', strtolower($envato_username)); } if (!$shub_user->get('shub_user_id')) { // no users exists in our system with this username. // add a new one. $shub_user->create_new(); } if (!$shub_user->get('user_username')) { $shub_user->update('user_username', $envato_username); } $shub_user->add_unique_meta('envato_username', strtolower($envato_username)); // find out which product this purchase code is relating to $existing_products = SupportHub::getInstance()->get_products(); // check if this item exists already $exists = false; foreach ($existing_products as $existing_product) { if (isset($existing_product['product_data']['envato_item_id']) && $existing_product['product_data']['envato_item_id'] == $result['item']['id']) { $exists = $existing_product['shub_product_id']; } } $newproduct = new SupportHubProduct(); if (!$exists) { $newproduct->create_new(); } else { $newproduct->load($exists); } if (!$newproduct->get('product_name')) { $newproduct->update('product_name', $result['item']['name']); } $existing_product_data = $newproduct->get('product_data'); if (!is_array($existing_product_data)) { $existing_product_data = array(); } if (empty($existing_product_data['envato_item_id'])) { $existing_product_data['envato_item_id'] = $result['item']['id']; } if (empty($existing_product_data['envato_item_data'])) { // get these item details from api $existing_product_data['envato_item_data'] = $result['item']; if (empty($existing_product_data['image'])) { $existing_product_data['image'] = $result['item']['thumbnail_url']; } if (empty($existing_product_data['url'])) { $existing_product_data['url'] = $result['item']['url']; } } $newproduct->update('product_data', $existing_product_data); if ($newproduct->get('shub_product_id')) { } $shub_envato_purchase_id = false; // store this in our purchase code database so we can access it easier later on $existing_purchase = shub_get_single('shub_envato_purchase', 'purchase_code', $purchase_code); if (!$existing_purchase) { // see if we can find an existing purchase by this user at the same time, without a purchase code. // (because results from the purchase api do not contian purchase codes) $possible_purchases = shub_get_multiple('shub_envato_purchase', array('shub_user_id' => $shub_user->get('shub_user_id'), 'shub_product_id' => $newproduct->get('shub_product_id'), 'purchase_time' => strtotime($result['sold_at']))); foreach ($possible_purchases as $possible_purchase) { if (empty($possible_purchases['purchase_code'])) { // this purchase came from the other api and doesn't have a purchase code. // add it in! $shub_envato_purchase_id = shub_update_insert('shub_envato_purchase_id', $possible_purchase['shub_envato_purchase_id'], 'shub_envato_purchase', array('purchase_code' => $purchase_code, 'api_time' => time())); if (empty($possible_purchases['purchase_data'])) { $raw_purchase_data = array_merge(array('author/sale' => $result), is_array($api_raw_data) ? $api_raw_data : array()); $shub_envato_purchase_id = shub_update_insert('shub_envato_purchase_id', $possible_purchase['shub_envato_purchase_id'], 'shub_envato_purchase', array('purchase_data' => json_encode($raw_purchase_data))); } } } } else { // we do have an existing purchase. $shub_envato_purchase_id = $existing_purchase['shub_envato_purchase_id']; // if (empty($existing_purchase['shub_user_id'])) { shub_update_insert('shub_envato_purchase_id', $shub_envato_purchase_id, 'shub_envato_purchase', array('shub_user_id' => $shub_user->get('shub_user_id'), 'shub_product_id' => $newproduct->get('shub_product_id'), 'purchase_time' => strtotime($result['sold_at']))); // } } if (!$shub_envato_purchase_id) { // add new one $raw_purchase_data = array_merge(array('author/sale' => $result), is_array($api_raw_data) ? $api_raw_data : array()); $shub_envato_purchase_id = shub_update_insert('shub_envato_purchase_id', false, 'shub_envato_purchase', array('shub_user_id' => $shub_user->get('shub_user_id'), 'shub_product_id' => $newproduct->get('shub_product_id'), 'envato_user_id' => 0, 'api_time' => time(), 'api_type' => 'author/sale', 'purchase_time' => strtotime($result['sold_at']), 'purchase_code' => $purchase_code, 'purchase_data' => json_encode($raw_purchase_data))); } if ($shub_envato_purchase_id) { // support expiry time is 6 months from the purchase date, or as specified by the api result. if (strtotime($result['sold_at']) < strtotime("2015-09-01")) { $support_expiry_time = strtotime("+6 months", strtotime("2015-09-01")); } else { $support_expiry_time = strtotime("+6 months", strtotime($result['sold_at'])); } if (!empty($result['supported_until'])) { $support_expiry_time = strtotime($result['supported_until']); } $existing_support = shub_get_single('shub_envato_support', array('shub_envato_purchase_id'), array($shub_envato_purchase_id)); if ($existing_support && empty($existing_support['shub_user_id'])) { shub_update_insert('shub_envato_support_id', $existing_support['shub_envato_support_id'], 'shub_envato_support', array('shub_user_id' => $shub_user->get('shub_user_id'))); } if ($existing_support && $existing_support['shub_envato_support_id'] && $existing_support['start_time'] == strtotime($result['sold_at'])) { // check the existing support expiry matches the one we have in the database. if ($existing_support['end_time'] < $support_expiry_time) { // we have a support extension! $shub_envato_support_id = shub_update_insert('shub_envato_support_id', $existing_support['shub_envato_support_id'], 'shub_envato_support', array('end_time' => $support_expiry_time, 'api_type' => 'author/sale', 'support_data' => json_encode($result))); } } else { // we are adding a new support entry $shub_envato_support_id = shub_update_insert('shub_envato_support_id', false, 'shub_envato_support', array('shub_user_id' => $shub_user->get('shub_user_id'), 'shub_product_id' => $newproduct->get('shub_product_id'), 'shub_envato_purchase_id' => $shub_envato_purchase_id, 'api_type' => 'author/sale', 'start_time' => strtotime($result['sold_at']), 'end_time' => $support_expiry_time, 'support_data' => json_encode($result))); } } $result['shub_user_id'] = $shub_user->get('shub_user_id'); return $result; } } while (count($accounts)); // if we get here it means the API request failed or it's an invalid purchase code. // log it in our database so we can at least re-check it at a later point in time or show it as failed in the UI somehow. $existing_purchase = shub_get_single('shub_envato_purchase', 'purchase_code', $purchase_code); if (!$existing_purchase) { $shub_envato_purchase_id = shub_update_insert('shub_envato_purchase_id', false, 'shub_envato_purchase', array('shub_user_id' => $existing_shub_user_id, 'shub_product_id' => 0, 'envato_user_id' => 0, 'api_type' => 'fail', 'purchase_time' => 0, 'purchase_code' => $purchase_code, 'purchase_data' => '')); } return false; }
public function get_user_hints($user_hints = array()) { $comments = $this->get_comments(); $first_comment = current($comments); if (isset($first_comment['shub_user_id']) && $first_comment['shub_user_id']) { $user_hints['shub_user_id'][] = $first_comment['shub_user_id']; } $message_from = @json_decode($first_comment['message_from'], true); if ($message_from && isset($message_from['username'])) { //} && $message_from['username'] != $envato_message->get('account')->get( 'account_name' )){ // this wont work if user changes their username, oh well. $other_users = new SupportHubUser_Envato(); $other_users->load_by_meta('envato_username', $message_from['username']); if ($other_users->get('shub_user_id') && !in_array($other_users->get('shub_user_id'), $user_hints['shub_user_id'])) { // pass these back to the calling method so we can get the correct values. $user_hints['shub_user_id'][] = $other_users->get('shub_user_id'); } } return $user_hints; }