You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Telegram小程序内Stars支付实现求助:WebApp.openInvoice使用问题

Telegram小程序内Stars支付全流程实现指南

你的核心问题是对WebApp.openInvoice的参数理解错误——这个方法不需要机器人链接或后端地址,它只需要Telegram官方生成的发票专属链接。下面是完整的实现步骤,包含后端(PHP)和前端代码修正:

一、核心逻辑梳理

小程序内Stars支付的正确流程是:

  1. 后端通过Telegram Bot API的createInvoiceLink方法生成发票链接(而非sendInvoice)
  2. 前端将该链接传入WebApp.openInvoice,唤起小程序内支付界面
  3. 支付完成后,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 01:33:23