WhatsApp Link 是一條用來開啟 WhatsApp 對話的網址,點擊後會開啟指定號碼的聊天視窗,對方毋須先把號碼儲存到聯絡人。這個功能在WhatsApp 官方的 Click to Chat 說明有記載,手機應用程式與 WhatsApp Web 都支援。

兩個前提決定連結能否開成。號碼要以國際格式書寫,香港即 852 開頭;號碼背後亦要有有效的 WhatsApp 帳號。

製作 WhatsApp Link,不必先註冊任何生成工具的帳戶:把固定格式的網址,接上以 852 開頭的電話號碼就完成。852 是香港的國際電話代碼,通訊事務管理局辦公室的《香港電訊服務號碼計劃》有列明。852 後面直接接本地號碼,中間不加「+」、空格、括號或破折號;號碼裏的 0 原樣保留。

常用格式有兩種:API 域名連結與 wa.me 連結,開啟的是同一個對話。下文範本裏的 XXXXXXXX,一律換成自己的香港電話號碼;範本並非可聯絡的號碼。

API 域名連結以 api.whatsapp.com 開頭,phone 參數接 852 加電話號碼。完整網址如下,複製後換掉 XXXXXXXX:

api.whatsapp.com 是 WhatsApp 其中一個官方域名。用它製作連結,並不代表開通了 WhatsApp Business Platform 的程式介面,是兩回事。

wa.me 連結的寫法更短:wa.me 後面直接接完整的國際格式電話號碼。同一組號碼的寫法如下:

我們團隊實測時,wa.me 連結有時會出現開啟問題,遇到這種情況,建議優先用 API 域名連結;本文兩種格式都會示範。

WhatsApp Business App 的號碼內置一條短連結,在應用程式的工具中開啟即可複製、分享,並可設定預設訊息,WhatsApp 官方的短連結說明列有相關步驟。網上亦有生成工具,輸入國際格式號碼與自訂訊息就得出連結,部分工具連 QR Code 一起生成。兩者都屬可選,基本連結按上文格式手動組合即可,不必先轉用商業版。

為 WhatsApp 連結加上預填訊息

text 參數怎樣處理中文與特殊符號?

預填訊息靠網址的 text 參數實現:API 域名連結在 phone 後面用 & 接 text=,wa.me 則在號碼後面用 ? 接 text=。中文、空格及 & 這類符號要先做百分比編碼,變成 % 開頭的字串;部分符號如 ! 或括號會原樣保留,MDN 的encodeURIComponent() 說明列有完整的保留清單。百分比編碼只影響文字能否正確顯示;訊息會否送出,是另一回事。編好的訊息只會顯示在點擊連結的人的輸入欄,按下發送才會送出,不是自動發出,也不是自動回覆。

以下兩條範例都用同一句「你好,我想查詢產品詳情」:文字已完成編碼,複製後換上號碼即可使用。

想換自己的訊息,把原始中文句子貼進任何 URL 編碼工具,或用 JavaScript 的 encodeURIComponent() 執行一次,得出的字串貼回 text= 後面就完成。編碼的對象是訊息文字本身,不是整條網址;永遠由原始文字編一次就好,對現成的 % 字串再編,可能讓輸入欄顯示未還原的編碼字串。

連結中的 text 參數對應預填訊息;圖中號碼只作示例,使用時請換成自己的號碼

產品、服務與活動查詢的訊息寫法

訊息以短為準:一句講明來意,對方直接按發送就可以。三種常見用途的參考寫法如下:

用途訊息例子
產品查詢你好,我想查詢產品詳情
服務預約你好,想預約服務時間
活動查詢你好,我想查詢這個活動的日期和地點

在哪裏使用 WhatsApp Link?

個人聯絡與社交平台可以怎樣用?

個人用途最直接:把連結放進電郵簽名檔、社交帳號簡介,或名片上的 QR Code,對方一按就開對話,省去先儲存聯絡人的步驟。經營商業帳號的話,WhatsApp Business 的功能頁列出可在 Facebook 專頁與 Instagram 個人檔案設定行動按鈕,把訪客接去對話。不過無論個人還是商業帳號,把連結放進貼文內文時,部分平台的貼文網址未必可以點擊,重要位置優先用平台內建的按鈕功能。

企業網站與網店怎樣加聯絡按鈕?

網站加 WhatsApp 按鈕,用一個普通的 <a> 連結就做到:href 指向你的 WhatsApp 連結,再交給 CSS 排成按鈕外觀,不必安裝外掛或聊天系統。以下兩段代碼分別是基本查詢按鈕與附預填訊息按鈕,XXXXXXXX 同樣換成自己的號碼:

留意 HTML 屬性內的 &amp; 寫法:屬性裏的 & 要寫成 &amp;,瀏覽器會自動還原;兩段代碼已按此寫好,直接複製即可。這是連結按鈕,點擊後在 WhatsApp 開啟對話,不是在網站內嵌入完整的對話視窗。

按鈕多數放在網店的產品頁,或網站的聯絡頁、報價表旁,讓訪客在猶豫的位置直接發問。

線上廣告查詢怎樣接 WhatsApp?

在 Facebook 或 Instagram 投放廣告時,可以選用把人流引入 WhatsApp 對話的廣告類型,WhatsApp Business 的廣告產品頁列出的設定入口包括 Meta 廣告管理員與 Facebook 專頁。這與在普通貼文貼出一條連結不同,原生廣告按鈕由平台接手開啟對話,訪客一按就轉到商戶的 WhatsApp。

實體店舖與活動怎樣用 QR Code?

實體宣傳由 QR Code 承接:把做好的連結交給支援網址的 QR Code 產生器,轉成圖片後放上海報、店內展示牌或活動單張。印製之前,先用手機相機或支援網址的掃碼工具,掃一次實體樣張,核對開啟的號碼與預填訊息無誤;印刷品一旦出錯,重印的成本遠高於測試那幾分鐘。

工具方面,可以用 Canva QR Code 產生器:選擇靜態 QR Code,貼上完整的 WhatsApp 連結後生成,再放進海報或單張設計。若已在 Canva 排版,便可在同一份設計中完成。

連結測試與錯誤排查

手機與 WhatsApp Web 各要測試什麼?

手機上點開連結,確認三件事:進入的是你的對話、號碼無誤、預填訊息出現在輸入欄。點擊後或會先出現「繼續聊天」頁面或登入提示,確認後才進對話,屬正常流程,不算連結失效。之後再於電腦用 WhatsApp Web 開一次;官方說明指 Click to Chat 手機與網頁版都支援,親自開一次最穩妥。

開啟連結後,可選擇應用程式或 WhatsApp 網頁版;顯示預填訊息並不代表已發送

號碼與預填文字的常見錯誤

連結打不開或預填訊息有誤,先檢查號碼與 text 參數的值,對照下表逐項核對:

現象檢查處理
點擊後無法開啟對話852 有沒有漏掉,號碼是否誤加「+」或空格重組成 852 加本地號碼的格式再試
WhatsApp 輸入欄顯示 %E4… 等編碼字串或亂碼訊息漏做編碼、重複編碼,還是貼得不完整取回原始文字只編碼一次,整段取代 text= 的值
輸入欄沒有預填訊息API 連結該用 &text=、wa.me 該用 ?text=,接符號有否出錯更正連接符號後重新測試

wa.me 開啟異常時怎樣處理?

wa.me 連結打不開,先核對號碼與格式是否照上文的方法寫好,網址裏不要混入空格。核對後仍然失敗,就用同一個號碼與訊息,改組一條 API 域名連結再試;開得到就先用 API 版本。

資料參考

  1. WhatsApp Help Center:How to use click to chat,Click to Chat 免先儲存號碼、有效帳號前提,手機與 WhatsApp Web 均支援
  2. 通訊事務管理局辦公室(2026):香港電訊服務號碼計劃,第 6 頁列明香港國際電話代碼 852
  3. WhatsApp Help Center:How to create short links,商業版帳戶短連結的複製、分享與預設訊息設定
  4. MDN contributors(2025):encodeURIComponent(),訊息值的百分比編碼與會原樣保留的符號清單
  5. WhatsApp Business:Business App Features,Facebook 專頁與 Instagram 個人檔案的行動按鈕
  6. WhatsApp Business:Ads that click to WhatsApp,把廣告人流引入 WhatsApp 對話的廣告類型與建立入口
  7. Canva:QR Code Generator,將網址生成靜態 QR Code,並加入印刷品設計

WhatsApp Link 製作與使用常見問題

WhatsApp Link 可以在網頁版開啟對話嗎?

可以。WhatsApp 官方的 Click to Chat 說明指,這類連結在手機應用程式與 WhatsApp Web 都支援,前提是網址裏的號碼背後有有效的 WhatsApp 帳號。在電腦瀏覽器點擊連結,或會先出現「繼續聊天」頁面或登入提示,確認後就會開啟指定號碼的對話;連結有附 text 參數,輸入欄才會見到預填訊息,沒有這個參數,輸入欄不會自動出現任何文字。號碼無誤但對話開不成,先確認該帳號是否仍在使用,再檢查網址格式。

香港號碼製作 WhatsApp Link,852 前面要加「+」嗎?

不用。網址裏的號碼採國際格式,852 之後直接接本地號碼,中間不加「+」、空格、括號或破折號;香港的代碼 852,通訊事務管理局辦公室的《香港電訊服務號碼計劃》有列明。本地號碼中的 0 亦要原樣保留,不要當成前綴刪走。號碼錯了一位,連結指向的就可能是另一個號碼;多寫了「+」或空格等符號,連結亦可能根本無法開啟。放上海報或廣告前,先用手機開一次核對最穩妥。

WhatsApp Link 的預填訊息會自動發送嗎?

不會。text 參數寫好的文字,只是預先顯示在點擊者一方的輸入欄,要對方自己按下發送鍵,訊息才會送出。它不是自動通知,也不是自動回覆或商戶的歡迎語,商戶要等對方真的發送,才會收到訊息內容。想對方照抄發送,訊息以一句講明來意為準,例如「你好,我想查詢產品詳情」;寫得過長或一次堆幾個問題,反而令對方想刪掉重寫。

(function () { 'use strict'; function restoreLabel(btn) { var label = btn.getAttribute('data-label'); if (label !== null && label !== '') { btn.textContent = label; } btn.classList.remove('is-copied', 'is-failed'); } function flash(btn, ok) { if (btn.getAttribute('data-label') === null) { btn.setAttribute('data-label', btn.textContent); } btn.classList.remove('is-copied', 'is-failed'); btn.classList.add(ok ? 'is-copied' : 'is-failed'); btn.textContent = ok ? '已複製' : '未能複製,請手動選取'; window.setTimeout(function () { restoreLabel(btn); }, 2500); } /* 備用複製:textarea 選取後 execCommand,以其布林結果判斷成敗 */ function legacyCopy(text) { var box = document.createElement('textarea'); box.value = text; box.setAttribute('readonly', ''); box.style.position = 'fixed'; box.style.top = '-1000px'; box.style.left = '0'; document.body.appendChild(box); box.focus(); box.select(); if (typeof box.setSelectionRange === 'function') { box.setSelectionRange(0, text.length); } var done = false; try { done = document.execCommand('copy'); } catch (err) { done = false; } document.body.removeChild(box); return done === true; } function copyText(btn, text) { var finish = function (ok) { flash(btn, ok); }; if (navigator.clipboard && window.isSecureContext && typeof navigator.clipboard.writeText === 'function') { navigator.clipboard.writeText(text).then(function () { finish(true); }, function () { finish(legacyCopy(text)); }); return; } finish(legacyCopy(text)); } function init() { var buttons = document.querySelectorAll('.wa-copy-btn[data-copy-target]'); for (var i = 0; i < buttons.length; i++) { (function (btn) { btn.addEventListener('click', function () { var target = document.getElementById(btn.getAttribute('data-copy-target')); if (!target) { return; } copyText(btn, target.textContent); }); })(buttons[i]); } } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })();