LinePay 支付完成後返回 LINE 應用而不跳出外部瀏覽器

.NET 開發 LINE LIFF 和 LINE Pay 整合的應用,並希望支付完成後返回 LINE 應用而不跳出外部瀏覽器,可以根據以下步驟進行調整:

1. 使用內嵌結帳模式

在 .NET 中使用 LINE Pay API 時,可以通過設置 API 請求的參數來控制支付流程。內嵌結帳模式允許用戶在 LINE 應用內完成支付,而無需跳出到外部瀏覽器。

1.1 設定支付請求中的 capture 參數

在呼叫 LINE Pay API 的 .NET 程式碼中,設置 captureconfirmfalse,然後進行後續支付流程控制。這樣可以啟用「內嵌結帳」模式:

var requestBody = new
{
    amount = 1000,
    currency = "JPY",
    orderId = "order12345",
    packages = new[]
    {
        new
        {
            id = "package123",
            amount = 1000,
            name = "Sample Package",
            products = new[]
            {
                new { id = "product123", name = "Sample Product", quantity = 1, price = 1000 }
            }
        }
    },
    redirectUrls = new
    {
        confirmUrl = "https://yourdomain.com/linepay/confirm",
        cancelUrl = "https://yourdomain.com/linepay/cancel"
    },
    options = new
    {
        payment = "capture=false" // 開啟內嵌結帳模式
    }
};

// 呼叫 LINE Pay API(假設已經建立 HttpClient)
var content = new StringContent(JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");
var response = await httpClient.PostAsync("https://api-pay.line.me/v3/payments/request", content);

2. 設置回調 URL 回到 LIFF 應用

支付完成後,可以使用 LIFF 協議 liff://app/{LIFF_ID} 作為 confirmUrl,這樣用戶在支付完成後會返回到 LIFF 頁面而不是啟動外部瀏覽器。

2.1 設置 confirmUrl 參數

當建立支付請求時,將 redirectUrls.confirmUrl 設置為 LIFF 應用的 URL:

var requestBody = new
{
    amount = 1000,
    currency = "JPY",
    orderId = "order12345",
    packages = new[]
    {
        new
        {
            id = "package123",
            amount = 1000,
            name = "Sample Package",
            products = new[]
            {
                new { id = "product123", name = "Sample Product", quantity = 1, price = 1000 }
            }
        }
    },
    redirectUrls = new
    {
        confirmUrl = "liff://app/YOUR_LIFF_ID", // 導回 LIFF 應用的 URL
        cancelUrl = "https://yourdomain.com/linepay/cancel"
    }
};

這樣,當用戶完成支付後會直接返回到 LIFF 頁面而不會啟動外部瀏覽器。

3. 使用 .NET API 來確認支付

支付完成後,可以在您的 .NET 應用中確認支付結果並返回支付狀態給 LIFF 應用。可以設置一個 API 端點來接收支付狀態,並在 LIFF 中用 JavaScript 呼叫此端點檢查支付狀態。

[ApiController]
[Route("linepay")]
public class LinePayController : ControllerBase
{
    [HttpPost("confirm")]
    public async Task<IActionResult> ConfirmPayment([FromQuery] string transactionId)
    {
        // 確認支付狀態的邏輯
        var requestBody = new
        {
            amount = 1000,
            currency = "JPY"
        };
        
        var content = new StringContent(JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");
        var response = await httpClient.PostAsync($"https://api-pay.line.me/v3/payments/{transactionId}/confirm", content);
        
        if (response.IsSuccessStatusCode)
        {
            return Ok(new { status = "success" });
        }
        return BadRequest(new { status = "failed" });
    }
}

4. 在 LIFF 中自動檢查支付結果

支付完成返回到 LIFF 頁面後,可以使用 JavaScript 自動檢查支付狀態並顯示結果。

// 確認付款狀態的 API URL
const confirmUrl = 'https://yourdomain.com/linepay/confirm';

async function checkPaymentStatus(transactionId) {
  try {
    const response = await fetch(`${confirmUrl}?transactionId=${transactionId}`);
    const data = await response.json();
    if (data.status === 'success') {
      alert('付款成功');
    } else {
      alert('付款失敗');
    }
  } catch (error) {
    console.error('檢查付款狀態時發生錯誤', error);
  }
}

// 在頁面加載完成後檢查付款狀態
document.addEventListener('DOMContentLoaded', () => {
  const transactionId = getTransactionIdFromUrl(); // 從 URL 中取得 transactionId
  if (transactionId) {
    checkPaymentStatus(transactionId);
  }
});

這樣可以在支付完成後,讓用戶自動回到 LINE 應用中的 LIFF 畫面並檢查支付結果。

Last updated