public function getAllUsers (array $userOpenIDs, callable $callback = null, $lang = 'en')
    {
        if (count($userOpenIDs) < 1) {
            throw new InvalidArgumentException("At least one user is required.");
        } else {
            $userOpenIDs = array_unique(array_values($userOpenIDs));
        }

        // Build requests.
        $requestBuilder = function ($openIDs) use ($lang) {
            foreach ($openIDs as $user) {
                yield new Request('POST', "https://api.weixin.qq.com/cgi-bin/user/info?openid={$user}&lang={$lang}");
            }
        };

        $profiles = [];

        // Set default callback.
        if (! isset($callback)) {
            $profiles = array_combine($userOpenIDs, array_pad([], count($userOpenIDs), null));
            $callback = function (RequestException $error = null, User $user = null) use (&$profiles) {
                if ($user !== null) {
                    $profiles[$user->getOpenID()] = $user;
                }
            };
        }

        // Send requests.
        (new Pool(
            $this->client,
            $requestBuilder($userOpenIDs),
            [
                'fulfilled' => function (ResponseInterface $response, $index) use ($callback) {
                    $json = json_decode($response->getBody());

                    call_user_func($callback, null, new User($json));
                },
                'rejected'  => function (RequestException $reason, $index) use ($callback) {
                    call_user_func($callback, $reason, null);
                },
            ]
        ))->promise()->wait();

        return $profiles;
    }