Telegram小程序内Stars支付实现求助:WebApp.openInvoice使用问题
Telegram小程序内Stars支付全流程实现指南
你的核心问题是对WebApp.openInvoice的参数理解错误——这个方法不需要机器人链接或后端地址,它只需要Telegram官方生成的发票专属链接。下面是完整的实现步骤,包含后端(PHP)和前端代码修正:
一、核心逻辑梳理
小程序内Stars支付的正确流程是:
- 后端通过Telegram Bot API的
createInvoiceLink方法生成发票链接(而非sendInvoice) - 前端将该链接传入
WebApp.openInvoice,唤起小程序内支付界面 - 支付完成后,Telegram通过Webhook通知后端,后端处理订单确认
二、后端(PHP)生成发票链接
首先你的机器人必须已开通Stars支付权限(需向Telegram申请,满足账号资质要求),然后用createInvoiceLink接口生成链接:
<?php $botToken = '你的机器人Token'; $apiUrl = "https://api.telegram.org/bot{$botToken}/createInvoiceLink"; // 构造发票参数:Stars对应币种为XTR,金额单位是最小单位(1 Stars = 100 XTR) $params = [ 'title' => '商品名称', 'description' => '商品描述', 'payload' => '自定义订单标识(如订单ID)', 'provider_token' => '你的Stars支付Provider Token(Telegram提供)', 'currency' => 'XTR', // 固定为XTR代表Telegram Stars 'prices' => json_encode([ [ 'label' => '商品费用', 'amount' => 500 // 对应5 Stars(5*100) ] ]), 'start_parameter' => 'your_unique_parameter' // 可选,用于追踪来源 ]; // 发送请求获取发票链接 $ch = curl_init($apiUrl); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $params); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = json_decode(curl_exec($ch), true); curl_close($ch); // 返回生成的发票链接给前端 if ($response['ok']) { echo $response['result']; } else { echo '生成发票失败:' . $response['description']; } ?>
三、前端代码修正
你之前的openInvoice参数完全错误,正确的调用方式是传入后端生成的invoiceLink,同时要确保Web App初始化完成:
<script src="https://telegram.org/js/telegram-web-app.js"></script> <button type="button" onclick="handlePay()">Pay</button> <script> // 初始化Telegram Web App window.Telegram.WebApp.ready(); async function handlePay() { // 从后端获取预先生成的发票链接 const invoiceLink = await fetch('/your-backend-endpoint.php') .then(res => res.text()); try { // 唤起小程序内支付界面 const result = await window.Telegram.WebApp.openInvoice(invoiceLink); // 支付成功后的前端处理(可选) if (result) { alert('支付成功!'); // 可在此刷新页面或更新订单状态 } } catch (error) { // 支付失败或取消的处理 alert('支付失败:' + error.message); } } </script>
四、后端处理支付通知
支付完成后,Telegram会向你的机器人Webhook发送包含successful_payment字段的Update,后端需要接收并验证:
<?php $botToken = '你的机器人Token'; $update = json_decode(file_get_contents('php://input'), true); if (isset($update['message']['successful_payment'])) { $paymentData = $update['message']['successful_payment']; $orderPayload = $paymentData['invoice_payload']; // 之前传入的自定义订单标识 $totalStars = $paymentData['total_amount'] / 100; // 转换为Stars数量 // 在这里处理订单确认逻辑,比如标记订单为已支付 // 注意:必须验证支付数据的真实性,避免伪造请求 } ?>
关键注意事项
- 机器人必须开通Stars支付权限,否则
createInvoiceLink会报错 - 金额必须以XTR最小单位计算(1 Stars = 100 XTR)
openInvoice返回Promise,需用async/await或.then()处理结果- 必须验证Telegram发送的Webhook通知,防止恶意请求
内容的提问来源于stack exchange,提问作者Pantherous
相关产品推荐
相关产品推荐

