async def send_invoice(self, chat_id: base.Integer, title: base.String,
                           description: base.String, payload: base.String,
                           provider_token: base.String, start_parameter: base.String,
                           currency: base.String, prices: typing.List[types.LabeledPrice],
                           provider_data: typing.Union[typing.Dict, None] = None,
                           photo_url: typing.Union[base.String, None] = None,
                           photo_size: typing.Union[base.Integer, None] = None,
                           photo_width: typing.Union[base.Integer, None] = None,
                           photo_height: typing.Union[base.Integer, None] = None,
                           need_name: typing.Union[base.Boolean, None] = None,
                           need_phone_number: typing.Union[base.Boolean, None] = None,
                           need_email: typing.Union[base.Boolean, None] = None,
                           need_shipping_address: typing.Union[base.Boolean, None] = None,
                           is_flexible: typing.Union[base.Boolean, None] = None,
                           disable_notification: typing.Union[base.Boolean, None] = None,
                           reply_to_message_id: typing.Union[base.Integer, None] = None,
                           reply_markup: typing.Union[types.InlineKeyboardMarkup, None] = None) -> types.Message:
        """
        Use this method to send invoices.

        Source: https://core.telegram.org/bots/api#sendinvoice

        :param chat_id: Unique identifier for the target private chat
        :type chat_id: :obj:`base.Integer`
        :param title: Product name, 1-32 characters
        :type title: :obj:`base.String`
        :param description: Product description, 1-255 characters
        :type description: :obj:`base.String`
        :param payload: Bot-defined invoice payload, 1-128 bytes
            This will not be displayed to the user, use for your internal processes.
        :type payload: :obj:`base.String`
        :param provider_token: Payments provider token, obtained via Botfather
        :type provider_token: :obj:`base.String`
        :param start_parameter: Unique deep-linking parameter that can be used to generate this
            invoice when used as a start parameter
        :type start_parameter: :obj:`base.String`
        :param currency: Three-letter ISO 4217 currency code, see more on currencies
        :type currency: :obj:`base.String`
        :param prices: Price breakdown, a list of components
            (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.)
        :type prices: :obj:`typing.List[types.LabeledPrice]`
        :param provider_data: JSON-encoded data about the invoice, which will be shared with the payment provider
        :type provider_data: :obj:`typing.Union[typing.Dict, None]`
        :param photo_url: URL of the product photo for the invoice
        :type photo_url: :obj:`typing.Union[base.String, None]`
        :param photo_size: Photo size
        :type photo_size: :obj:`typing.Union[base.Integer, None]`
        :param photo_width: Photo width
        :type photo_width: :obj:`typing.Union[base.Integer, None]`
        :param photo_height: Photo height
        :type photo_height: :obj:`typing.Union[base.Integer, None]`
        :param need_name: Pass True, if you require the user's full name to complete the order
        :type need_name: :obj:`typing.Union[base.Boolean, None]`
        :param need_phone_number: Pass True, if you require the user's phone number to complete the order
        :type need_phone_number: :obj:`typing.Union[base.Boolean, None]`
        :param need_email: Pass True, if you require the user's email to complete the order
        :type need_email: :obj:`typing.Union[base.Boolean, None]`
        :param need_shipping_address: Pass True, if you require the user's shipping address to complete the order
        :type need_shipping_address: :obj:`typing.Union[base.Boolean, None]`
        :param is_flexible: Pass True, if the final price depends on the shipping method
        :type is_flexible: :obj:`typing.Union[base.Boolean, None]`
        :param disable_notification: Sends the message silently. Users will receive a notification with no sound
        :type disable_notification: :obj:`typing.Union[base.Boolean, None]`
        :param reply_to_message_id: If the message is a reply, ID of the original message
        :type reply_to_message_id: :obj:`typing.Union[base.Integer, None]`
        :param reply_markup: A JSON-serialized object for an inline keyboard
            If empty, one 'Pay total price' button will be shown. If not empty, the first button must be a Pay button.
        :type reply_markup: :obj:`typing.Union[types.InlineKeyboardMarkup, None]`
        :return: On success, the sent Message is returned
        :rtype: :obj:`types.Message`
        """
        prices = prepare_arg([price.to_python() if hasattr(price, 'to_python') else price for price in prices])
        reply_markup = prepare_arg(reply_markup)
        payload_ = generate_payload(**locals())

        result = await self.request(api.Methods.SEND_INVOICE, payload_)
        return types.Message(**result)
Use this method to send invoices.

        Source: https://core.telegram.org/bots/api#sendinvoice

        :param chat_id: Unique identifier for the target private chat
        :type chat_id: :obj:`base.Integer`
        :param title: Product name, 1-32 characters
        :type title: :obj:`base.String`
        :param description: Product description, 1-255 characters
        :type description: :obj:`base.String`
        :param payload: Bot-defined invoice payload, 1-128 bytes
            This will not be displayed to the user, use for your internal processes.
        :type payload: :obj:`base.String`
        :param provider_token: Payments provider token, obtained via Botfather
        :type provider_token: :obj:`base.String`
        :param start_parameter: Unique deep-linking parameter that can be used to generate this
            invoice when used as a start parameter
        :type start_parameter: :obj:`base.String`
        :param currency: Three-letter ISO 4217 currency code, see more on currencies
        :type currency: :obj:`base.String`
        :param prices: Price breakdown, a list of components
            (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.)
        :type prices: :obj:`typing.List[types.LabeledPrice]`
        :param provider_data: JSON-encoded data about the invoice, which will be shared with the payment provider
        :type provider_data: :obj:`typing.Union[typing.Dict, None]`
        :param photo_url: URL of the product photo for the invoice
        :type photo_url: :obj:`typing.Union[base.String, None]`
        :param photo_size: Photo size
        :type photo_size: :obj:`typing.Union[base.Integer, None]`
        :param photo_width: Photo width
        :type photo_width: :obj:`typing.Union[base.Integer, None]`
        :param photo_height: Photo height
        :type photo_height: :obj:`typing.Union[base.Integer, None]`
        :param need_name: Pass True, if you require the user's full name to complete the order
        :type need_name: :obj:`typing.Union[base.Boolean, None]`
        :param need_phone_number: Pass True, if you require the user's phone number to complete the order
        :type need_phone_number: :obj:`typing.Union[base.Boolean, None]`
        :param need_email: Pass True, if you require the user's email to complete the order
        :type need_email: :obj:`typing.Union[base.Boolean, None]`
        :param need_shipping_address: Pass True, if you require the user's shipping address to complete the order
        :type need_shipping_address: :obj:`typing.Union[base.Boolean, None]`
        :param is_flexible: Pass True, if the final price depends on the shipping method
        :type is_flexible: :obj:`typing.Union[base.Boolean, None]`
        :param disable_notification: Sends the message silently. Users will receive a notification with no sound
        :type disable_notification: :obj:`typing.Union[base.Boolean, None]`
        :param reply_to_message_id: If the message is a reply, ID of the original message
        :type reply_to_message_id: :obj:`typing.Union[base.Integer, None]`
        :param reply_markup: A JSON-serialized object for an inline keyboard
            If empty, one 'Pay total price' button will be shown. If not empty, the first button must be a Pay button.
        :type reply_markup: :obj:`typing.Union[types.InlineKeyboardMarkup, None]`
        :return: On success, the sent Message is returned
        :rtype: :obj:`types.Message`