docs: def send_invoice(self, chat_id, title, description, payload, provider_token, start_parameter, currency, prices, provider_data=None, photo_url=None, photo_size=None, photo_width=None, photo_height=None, need_name=None, need_phone_number=None, need_email=None, need_shipping_address=None, send_phone_number_to_provider=None, send_email_to_provider=None, is_flexible=None, disable_notification=None, reply_to_message_id=None, reply_markup=None):
          """
          Use this method to send invoices. On success, the sent Message is returned.
  
          https://core.telegram.org/bots/api#sendinvoice
  
          
          Parameters:
          
          :param chat_id: Unique identifier for the target private chat
          :type  chat_id: int
          
          :param title: Product name, 1-32 characters
          :type  title: str|unicode
          
          :param description: Product description, 1-255 characters
          :type  description: str|unicode
          
          :param payload: Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use for your internal processes.
          :type  payload: str|unicode
          
          :param provider_token: Payments provider token, obtained via Botfather
          :type  provider_token: str|unicode
          
          :param start_parameter: Unique deep-linking parameter that can be used to generate this invoice when used as a start parameter
          :type  start_parameter: str|unicode
          
          :param currency: Three-letter ISO 4217 currency code, see more on currencies
          :type  currency: str|unicode
          
          :param prices: Price breakdown, a list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.)
          :type  prices: list of pytgbot.api_types.sendable.payments.LabeledPrice
          
          
          Optional keyword parameters:
          
          :param provider_data: JSON-encoded data about the invoice, which will be shared with the payment provider. A detailed description of required fields should be provided by the payment provider.
          :type  provider_data: str|unicode
          
          :param photo_url: URL of the product photo for the invoice. Can be a photo of the goods or a marketing image for a service. People like it better when they see what they are paying for.
          :type  photo_url: str|unicode
          
          :param photo_size: Photo size
          :type  photo_size: int
          
          :param photo_width: Photo width
          :type  photo_width: int
          
          :param photo_height: Photo height
          :type  photo_height: int
          
          :param need_name: Pass True, if you require the user's full name to complete the order
          :type  need_name: bool
          
          :param need_phone_number: Pass True, if you require the user's phone number to complete the order
          :type  need_phone_number: bool
          
          :param need_email: Pass True, if you require the user's email address to complete the order
          :type  need_email: bool
          
          :param need_shipping_address: Pass True, if you require the user's shipping address to complete the order
          :type  need_shipping_address: bool
          
          :param send_phone_number_to_provider: Pass True, if user's phone number should be sent to provider
          :type  send_phone_number_to_provider: bool
          
          :param send_email_to_provider: Pass True, if user's email address should be sent to provider
          :type  send_email_to_provider: bool
          
          :param is_flexible: Pass True, if the final price depends on the shipping method
          :type  is_flexible: bool
          
          :param disable_notification: Sends the message silently. Users will receive a notification with no sound.
          :type  disable_notification: bool
          
          :param reply_to_message_id: If the message is a reply, ID of the original message
          :type  reply_to_message_id: int
          
          :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: pytgbot.api_types.sendable.reply_markup.InlineKeyboardMarkup
          
          Returns:
  
          :return: On success, the sent Message is returned
          :rtype:  pytgbot.api_types.receivable.updates.Message
          """
          from pytgbot.api_types.sendable.payments import LabeledPrice
          from pytgbot.api_types.sendable.reply_markup import InlineKeyboardMarkup
          
          assert_type_or_raise(chat_id, int, parameter_name="chat_id")
          
          assert_type_or_raise(title, unicode_type, parameter_name="title")
          
          assert_type_or_raise(description, unicode_type, parameter_name="description")
          
          assert_type_or_raise(payload, unicode_type, parameter_name="payload")
          
          assert_type_or_raise(provider_token, unicode_type, parameter_name="provider_token")
          
          assert_type_or_raise(start_parameter, unicode_type, parameter_name="start_parameter")
          
          assert_type_or_raise(currency, unicode_type, parameter_name="currency")
          
          assert_type_or_raise(prices, list, parameter_name="prices")
          
          assert_type_or_raise(provider_data, None, unicode_type, parameter_name="provider_data")
          
          assert_type_or_raise(photo_url, None, unicode_type, parameter_name="photo_url")
          
          assert_type_or_raise(photo_size, None, int, parameter_name="photo_size")
          
          assert_type_or_raise(photo_width, None, int, parameter_name="photo_width")
          
          assert_type_or_raise(photo_height, None, int, parameter_name="photo_height")
          
          assert_type_or_raise(need_name, None, bool, parameter_name="need_name")
          
          assert_type_or_raise(need_phone_number, None, bool, parameter_name="need_phone_number")
          
          assert_type_or_raise(need_email, None, bool, parameter_name="need_email")
          
          assert_type_or_raise(need_shipping_address, None, bool, parameter_name="need_shipping_address")
          
          assert_type_or_raise(send_phone_number_to_provider, None, bool, parameter_name="send_phone_number_to_provider")
          
          assert_type_or_raise(send_email_to_provider, None, bool, parameter_name="send_email_to_provider")
          
          assert_type_or_raise(is_flexible, None, bool, parameter_name="is_flexible")
          
          assert_type_or_raise(disable_notification, None, bool, parameter_name="disable_notification")
          
          assert_type_or_raise(reply_to_message_id, None, int, parameter_name="reply_to_message_id")
          
          assert_type_or_raise(reply_markup, None, InlineKeyboardMarkup, parameter_name="reply_markup")
          
          result = self.do("sendInvoice", chat_id=chat_id, title=title, description=description, payload=payload, provider_token=provider_token, start_parameter=start_parameter, currency=currency, prices=prices, provider_data=provider_data, photo_url=photo_url, photo_size=photo_size, photo_width=photo_width, photo_height=photo_height, need_name=need_name, need_phone_number=need_phone_number, need_email=need_email, need_shipping_address=need_shipping_address, send_phone_number_to_provider=send_phone_number_to_provider, send_email_to_provider=send_email_to_provider, is_flexible=is_flexible, disable_notification=disable_notification, reply_to_message_id=reply_to_message_id, reply_markup=reply_markup)
          if self.return_python_objects:
              logger.debug("Trying to parse {data}".format(data=repr(result)))
              from pytgbot.api_types.receivable.updates import Message
              try:
                  return Message.from_array(result)
              except TgApiParseException:
                  logger.debug("Failed parsing as api_type Message", exc_info=True)
              # end try
              # no valid parsing so far
              raise TgApiParseException("Could not parse result.")  # See debug log for details!
          # end if return_python_objects
          return result