public function sendTemplateMessageToUser ($templateID, $openID, $url, array $data, array $options = [])
    {
        if (! filter_var($url, FILTER_VALIDATE_URL)) {
            throw new InvalidArgumentException('$url must be a valid URL.');
        }

        $json = json_decode(
            $this->client->send(
                new Request(
                    "POST",
                    "https://api.weixin.qq.com/cgi-bin/message/template/send",
                    [],
                    json_encode(
                        (new Formatter())->formatTemplateMessage(
                            $templateID,
                            $openID,
                            $url,
                            $data,
                            $options
                        )
                    )
                )
            )->getBody()
        );

        if (! isset($json->msgid)) {
            throw new Exception("bad response: expected property `msgid`");
        }

        return $json->msgid;
    }