我的 Telegram 机器人的 Python 脚本有问题,我在 Paypal 上配置了一个 REST API,当用户单击 Telegram 上的付款按钮时,用户应该被重定向到付款页面,除了我的脚本创建数据库中的令牌提供访问权限,但不会重定向用户进行付款。
在 Paypal 上,我在任何地方都找不到
return_url
和 cancel_url
的链接。
这是我的功能(我不会向您发送所有代码):
async def start(update: Update, context: CallbackContext) -> None:
user_id = update.effective_user.id
if check_payment(user_id):
# L'utilisateur a déjà payé, donc on peut activer le bot
await context.bot.send_message(chat_id=update.effective_chat.id, text='Bienvenue, voici la liste des commandes disponibles:\n\n /start - Lancer le bot et liste toutes les commandes du bot\n/setdate - Modification de la prochaine commande fournisseur\n/countdown - Afficher un compte à rebours jusqu’à la prochaine commande fournisseur\n/list - Affiche toute la liste des commandes du bot')
else:
# L'utilisateur n'a pas encore payé, donc on affiche le bouton de paiement
await start_paiement(update, context)
paypalrestsdk.configure({
"mode": "live", # sandbox ou live
"client_id": "-",
"client_secret": "-" })
cnx = mysql.connector.connect(user='-', password='-',
host='localhost',
database='-')
def generate_token():
return binascii.hexlify(os.urandom(20)).decode()
def check_payment(user_id):
cursor = cnx.cursor()
query = ("SELECT token FROM tokens WHERE user_id = %s")
cursor.execute(query, (user_id,))
result = cursor.fetchone()
return result is not None
async def start_paiement(update: Update, context: CallbackContext) -> None:
user_id = update.effective_user.id
if check_payment(user_id):
# L'utilisateur a déjà payé, donc on démarre le bot normalement
await context.bot.send_message(chat_id=update.effective_chat.id, text="Bienvenue !")
else:
# L'utilisateur n'a pas encore payé, donc on affiche le bouton de paiement
keyboard = [[InlineKeyboardButton("Payer", callback_data='pay')]]
reply_markup = InlineKeyboardMarkup(keyboard)
welcome_message = "Bienvenue, \n\n Veuillez effectuer le paiement de 100 euros \n pour un accès à vie à ce bot. \n\n Si vous souhaitez d'abord tester nos différents bots avant de procéder à votre achat, vous pouvez rejoindre notre groupe <a href='-'>exemple</a>"
await context.bot.send_message(chat_id=update.effective_chat.id, text=welcome_message, reply_markup=reply_markup, parse_mode='HTML', disable_web_page_preview=True)
async def pay(update: Update, context: CallbackContext) -> None:
query = update.callback_query
await query.answer() # gérer les callbacks du bouton de paiement
payment = paypalrestsdk.Payment({
"intent": "sale",
# Configurez votre retour d'appel et les URL d'annulation ici
"redirect_urls": {
"return_url": "-m",
"cancel_url": "-"},
"payer": {"payment_method": "paypal"},
# Configurez votre paiement ici
"transactions": [{
"item_list": {
"items": [{
"name": "Accès au Bot",
"sku": "item",
"price": '100.00',
"currency": "EUR",
"quantity": 1}]},
"amount": {
"total": '100.00',
"currency": "EUR"},
"description": "Paiement pour l'accès au Bot"}]})
if payment.create():
print('Paiement créé avec succès')
token = generate_token()
print(f'Le jeton pour l\'utilisateur est: {token}')
cursor = cnx.cursor()
query = ("INSERT INTO tokens "
"(user_id, token) "
"VALUES (%s, %s)")
cursor.execute(query, (update.effective_user.id, token))
cnx.commit()
else:
print('Échec de la création du paiement PayPal')
print(payment.error)
你能帮我解决问题或找到解决方案吗?
如果您将付款人重定向到 PayPal 以批准付款,则 return_url 和 cancel_url 是您自己的 URL,它们随后将返回该 URL。在 return_url 的情况下,您需要显示一个确认页面,当交易确认时,捕获/执行付款。
我不确定您的代码中的“paypalrestsdk”是什么,但 PayPal 的所有 REST SDK 均已弃用,不应用于新的集成。直接与 REST API 集成(使用客户端 id 和密钥获取访问令牌,然后以 JSON 格式进行 HTTPS 请求/响应)