#!/usr/bin/env python # pylint: disable=C0116 # This program is dedicated to the public domain under the CC0 license. """Basic example for a bot that can receive payment from user.""" import logging from telegram import LabeledPrice, ShippingOption, Update from telegram.ext import ( Updater, CommandHandler, MessageHandler, Filters, PreCheckoutQueryHandler, ShippingQueryHandler, CallbackContext, ) # Enable logging logging.basicConfig( format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO ) logger = logging.getLogger(__name__) def start_callback(update: Update, _: CallbackContext) -> None: """Displays info on how to use the bot.""" msg = ( "Use /shipping to get an invoice for shipping-payment, or /noshipping for an " "invoice without shipping." ) update.message.reply_text(msg) def start_with_shipping_callback(update: Update, context: CallbackContext) -> None: """Sends an invoice with shipping-payment.""" chat_id = update.message.chat_id title = "Payment Example" description = "Payment Example using python-telegram-bot" # select a payload just for you to recognize its the donation from your bot payload = "Custom-Payload" # In order to get a provider_token see https://core.telegram.org/bots/payments#getting-a-token provider_token = "PROVIDER_TOKEN" currency = "USD" # price in dollars price = 1 # price * 100 so as to include 2 decimal points # check https://core.telegram.org/bots/payments#supported-currencies for more details prices = [LabeledPrice("Test", price * 100)] # optionally pass need_name=True, need_phone_number=True, # need_email=True, need_shipping_address=True, is_flexible=True context.bot.send_invoice( chat_id, title, description, payload, provider_token, currency, prices, need_name=True, need_phone_number=True, need_email=True, need_shipping_address=True, is_flexible=True, ) def start_without_shipping_callback(update: Update, context: CallbackContext) -> None: """Sends an invoice without shipping-payment.""" chat_id = update.message.chat_id title = "Payment Example" description = "Payment Example using python-telegram-bot" # select a payload just for you to recognize its the donation from your bot payload = "Custom-Payload" # In order to get a provider_token see https://core.telegram.org/bots/payments#getting-a-token provider_token = "PROVIDER_TOKEN" currency = "USD" # price in dollars price = 1 # price * 100 so as to include 2 decimal points prices = [LabeledPrice("Test", price * 100)] # optionally pass need_name=True, need_phone_number=True, # need_email=True, need_shipping_address=True, is_flexible=True context.bot.send_invoice( chat_id, title, description, payload, provider_token, currency, prices ) def shipping_callback(update: Update, _: CallbackContext) -> None: """Answers the ShippingQuery with ShippingOptions""" query = update.shipping_query # check the payload, is this from your bot? if query.invoice_payload != 'Custom-Payload': # answer False pre_checkout_query query.answer(ok=False, error_message="Something went wrong...") return # First option has a single LabeledPrice options = [ShippingOption('1', 'Shipping Option A', [LabeledPrice('A', 100)])] # second option has an array of LabeledPrice objects price_list = [LabeledPrice('B1', 150), LabeledPrice('B2', 200)] options.append(ShippingOption('2', 'Shipping Option B', price_list)) query.answer(ok=True, shipping_options=options) # after (optional) shipping, it's the pre-checkout def precheckout_callback(update: Update, _: CallbackContext) -> None: """Answers the PreQecheckoutQuery""" query = update.pre_checkout_query # check the payload, is this from your bot? if query.invoice_payload != 'Custom-Payload': # answer False pre_checkout_query query.answer(ok=False, error_message="Something went wrong...") else: query.answer(ok=True) # finally, after contacting the payment provider... def successful_payment_callback(update: Update, _: CallbackContext) -> None: """Confirms the successful payment.""" # do something after successfully receiving payment? update.message.reply_text("Thank you for your payment!") def main() -> None: """Run the bot.""" # Create the Updater and pass it your bot's token. updater = Updater("TOKEN") # Get the dispatcher to register handlers dispatcher = updater.dispatcher # simple start function dispatcher.add_handler(CommandHandler("start", start_callback)) # Add command handler to start the payment invoice dispatcher.add_handler(CommandHandler("shipping", start_with_shipping_callback)) dispatcher.add_handler(CommandHandler("noshipping", start_without_shipping_callback)) # Optional handler if your product requires shipping dispatcher.add_handler(ShippingQueryHandler(shipping_callback)) # Pre-checkout handler to final check dispatcher.add_handler(PreCheckoutQueryHandler(precheckout_callback)) # Success! Notify your user! dispatcher.add_handler(MessageHandler(Filters.successful_payment, successful_payment_callback)) # Start the Bot updater.start_polling() # Run the bot until you press Ctrl-C or the process receives SIGINT, # SIGTERM or SIGABRT. This should be used most of the time, since # start_polling() is non-blocking and will stop the bot gracefully. updater.idle() if __name__ == '__main__': main()