private function ensure_mapping_is_correct($mapping_from_member_exists, $mapping_from_user_exists, $wp_user, $member, $wp_user_existed_before_request, array $context) { if ($mapping_from_member_exists) { $method = 'update_mapping_by_member'; } elseif ($mapping_from_user_exists) { $method = 'update_mapping_by_user'; } else { $method = 'create_mapping'; } $outcome_of_mapping = $this->repository()->{$method}($wp_user, $member, $context); if (is_wp_error($outcome_of_mapping)) { if ($outcome_of_mapping->get_error_code() === "duplicate_user_for_member" && !$wp_user_existed_before_request) { // We only record this error as others will be passed up and recorded // by something else, whereas here we're working around the error. memberful_wp_record_wp_error($outcome_of_mapping); wp_delete_user($wp_user->ID); $error_data = $outcome_of_mapping->get_error_data(); return $error_data['canonical_user']; } else { return $outcome_of_mapping; } } return $wp_user; }
/** * Gets the access token and refresh token from an authorization code * * @param string $auth_code The authorization code returned from OAuth endpoint * @return StdObject Access token and Refresh token */ public function get_oauth_tokens($auth_code) { $params = array('client_id' => get_option('memberful_client_id'), 'client_secret' => get_option('memberful_client_secret'), 'grant_type' => 'authorization_code', 'code' => $auth_code); $response = memberful_wp_post_data_to_api_as_json(self::oauth_member_url('token'), $params); if (is_wp_error($response)) { memberful_wp_record_wp_error($response); return $this->_error('could_not_get_tokens', $response); } $body = json_decode($response['body']); $code = $response['response']['code']; if ($code != 200 || $body === NULL || empty($body->access_token)) { $payload = array('code' => 'oauth_access_fail', 'error' => 'Could not get access token from Memberful', 'response' => $response); memberful_wp_record_error($payload); return $this->_error($payload['code'], $payload['error']); } return json_decode($response['body']); }