與使用 gtag 類似,您可以使用 Google Analytics Measurement Protocol 連同 User-ID 傳送使用者提供的資料,可用於改善行為和轉換評估成效。
如要連同 Measurement Protocol 要求傳送使用者提供的資料,請在 JSON 酬載中加入 user_data 參數。如果提供 user_data,建議一併加入 user_id 參數。確保評估結果最準確,並讓功能正常運作。
Measurement Protocol 使用的正規化和雜湊演算法,與 Google Ads API 強化評估功能相同。基於隱私權考量,電子郵件地址、電話號碼、名字、姓氏和街道地址必須使用 SHA-256 演算法進行雜湊處理後,才能上傳。雜湊值應以十六進位字串格式編碼 (僅含十六進位數字的字串物件),例如 88d7ecb5c5b21d7b1。
為了使雜湊處理結果標準化,在對其中任何值進行雜湊處理前,您必須先完成下列事項:
- 移除開頭和結尾的空白字元。
- 將文字轉換為小寫。
- 根據 E164 標準設定電話號碼格式。
- 移除
gmail.com和googlemail.com電子郵件地址中網域名稱前的所有半形句號 (.)。
JSON 貼文內文
| 鍵 | 類型 | 說明 |
|---|---|---|
| user_id | 字串 | 使用者的專屬 ID,如要進一步瞭解這個 ID,請參閱「跨平台分析的 User-ID」。 |
| user_data | 物件 | 可識別使用者的強化使用者資料欄位。 |
| user_data.sha256_email_address[] | 字串陣列 < | 經雜湊處理和編碼的使用者電子郵件地址。
正規化後如下:
|
| user_data.sha256_phone_number[] | 字串陣列 | 經雜湊處理及編碼的使用者電話號碼。
正規化後如下:
|
| user_data.address[] | 陣列 | 根據實際位置識別使用者。 |
| user_data.address[].sha256_first_name | 字串 <0x | 經雜湊處理和編碼的使用者名字。
正規化後如下:
|
| user_data.address[].sha256_last_name | 字串 <0x | 經雜湊處理和編碼的使用者姓氏。
正規化後如下:
|
| user_data.address[].sha256_street | 字串 <0x | 經雜湊處理和編碼的使用者街道和號碼。
正規化後如下:
|
| user_data.address[].city | 字串 <0x | 使用者地址所在的城市。
正規化後如下:
|
| user_data.address[].region | 字串 <0x | 使用者地址的州或地域。
正規化後如下:
|
| user_data.address[].postal_code | 字串 | 使用者的地址郵遞區號。
正規化後如下:
|
| user_data.address[].country | 字串 | 使用者的地址國家/地區代碼。格式符合 ISO 3166-1 alpha-2 標準。 |
如要進一步瞭解傳輸和酬載的格式,請參閱 Measurement Protocol 參考文件。
傳送使用者提供的資料
與會自動雜湊處理敏感使用者提供資料的 gtag 不同,Measurement Protocol 要求開發人員先使用安全的單向雜湊演算法 (稱為 SHA256) 雜湊處理敏感使用者提供資料,再使用 十六進位字串格式編碼,然後才呼叫 API。
名稱開頭為 sha256 前置字元的所有使用者資料欄位,都只能填入經過雜湊處理和十六進位編碼的值。
下列程式碼範例會執行必要的加密和編碼步驟:
Node.js
const { subtle } = require('crypto').webcrypto;
async function populateSensitiveUserData(value) {
const encoder = new TextEncoder();
// Convert a string value to UTF-8 encoded text.
const valueUtf8 = encoder.encode(value);
// Compute the hash (digest) using the SHA-256 algorithm.
const hashSha256 = await subtle.digest('SHA-256', valueUtf8);
// Convert buffer to byte array.
const hashArray = Array.from(new Uint8Array(hashSha256));
// Return a hex-encoded string.
return hashArray.map(b => b.toString(16).padStart(2, "0")).join('');
};
// Test the encryption function by calling it.
async function main() {
return await populateSensitiveUserData('<value>');
}
main()
.then(v => console.log(v))
.catch(err => console.error(err));
為方便起見,user_data 物件內的所有重複欄位 (例如 address、sha256_email_address、sha256_phone_number) 都可以傳遞單一值,而非陣列。
下列程式碼範例會呼叫 Measurement Protocol,並傳遞使用者資料和 User-ID。
Node.js
const measurementId = "MEASUREMENT_ID";
const apiSecret = "API_SECRET";
// Populate mock User Data using the `populateSensitiveUserData` function defined
// above.
const yourEmailSha256Variable = await populateSensitiveUserData('test@yourdomain.com');
const yourPhoneSha256Variable = await populateSensitiveUserData('+15555555555');
const yourFirstNameSha256Variable = await populateSensitiveUserData('john');
const yourLastNameSha256Variable = await populateSensitiveUserData('doe');
const yourStreetAddressSha256Variable = await populateSensitiveUserData('123 main street');
// Populate mock unencrypted user data.
const yourCityVariable = 'san francisco';
const yourRegionVariable = 'california';
const yourPostalCodeVariable = '94000';
const yourCountryVariable = 'US';
fetch(`https://www.google-analytics.com/mp/collect?measurement_id=${measurementId}&api_secret=${apiSecret}`, {
method: "POST",
body: JSON.stringify({
client_id: "CLIENT_ID",
user_id: "USER_ID",
events: [{
name: "purchase"
}],
user_data: {
sha256_email_address: yourEmailSha256Variable,
sha256_phone_number: yourPhoneSha256Variable,
address: {
sha256_first_name: yourFirstNameSha256Variable,
sha256_last_name: yourLastNameSha256Variable,
sha256_street: yourStreetAddressSha256Variable,
city: yourCityVariable,
region: yourRegionVariable,
postal_code: yourPostalCodeVariable,
country: yourCountryVariable
}
}
})
});
多個值
開發人員可以選擇使用陣列值 (而非字串) 來提供多個值 (最多 3 個電話號碼和電子郵件,最多 2 個地址)。擷取多個值時,可以提高比對成功的機率。
Node.js
const measurementId = "MEASUREMENT_ID";
const apiSecret = "API_SECRET";
fetch(`https://www.google-analytics.com/mp/collect?measurement_id=${measurementId}&api_secret=${apiSecret}`, {
method: "POST",
body: JSON.stringify({
client_id: "CLIENT_ID",
user_id: "USER_ID",
events: [{
name: "purchase"
}],
user_data: {
sha256_email_address: [yourEmailSha256Variable1, yourEmailSha256Variable2],
sha256_phone_number: [yourPhoneSha256Variable1, yourPhoneSha256Variable2],
address: [{
sha256_first_name: yourFirstNameSha256Variable1,
sha256_last_name: yourLastNameSha256Variable1,
sha256_street: yourStreetAddressSha256Variable1,
city: yourCityVariable1,
region: yourRegionVariable1,
postal_code: yourPostalCodeVariable1,
country: yourCountryVariable1
},{
sha256_first_name: yourFirstNameSha256Variable2,
sha256_last_name: yourLastNameSha256Variable2,
sha256_street: yourStreetAddressSha256Variable2,
city: yourCityVariable2,
region: yourRegionVariable2,
postal_code: yourPostalCodeVariable2,
country: yourCountryVariable2
}]
}
})
});