詐騙語言參考
Microsoft Dynamics 365有自己的豐富而表達的語言,可協助您定義和表達您的詐騙策略。 此語言與 C# 和 SQL 有許多相似之處,其設計目的是讓您彈性地解決獨特商務案例的詐騙問題。
您今天可以使用此語言來定義規則和速度。 如需詳細資訊,請參閱 管理規則 和執行 速度檢查。
此詐騙語言參考指南包含構成語言的完整運算元、函式和語句清單:
- 陳述式
- 參考屬性和變數
- 定義您自己的變數
- 全域變數函式
- 決策函式
- 觀察函式
- 聚合函數
- 邏輯運算子
- 比較運算子
- 數學函數
- 日期時間函式
- 類型轉換運算元
- 字串函數
- Gibberish 偵測函式
- 模式偵測函式
- 模型函式
- 地理函式
- 裝置屬性函式
- BIN 查閱函式
- 清單函式
- 在規則中使用清單
- 使用外部呼叫、外部評量和速度
- 屬性的類型推斷
- JSON 陣列和物件
- 後續決策動作中可用的函式
陳述式
語句語法 | 描述 | 範例 |
---|---|---|
LET VariableName = ><表達式<> | LET 語句可用來定義新的變數。 變數的範圍是定義變數的規則或速度。 變數名稱的前置詞應加上貨幣符號 ($)。 如需詳細資訊,請參閱 定義您自己的變數。 在 Condition 區段和所有規則類型和速度集合的 子句中,都可以使用任意數目的 LET 語句。 |
LET $fullName = @"user.firstName" + @"user.lastName" |
觀察 OBSERVE <ObservationFunction>(<KeyValuePairs>) |
OBSERVE 語句不會以決策終止規則執行。 它只會將索引鍵/值組記錄到 API 回應或追蹤記錄。 後續的規則和規則子句會繼續執行,直到 到達 RETURN 語句為止。 OBSERVE 語句後面必須接著一或多個觀察函式。 如果 WHEN 子句存在且評估為 False,則不會記錄 OBSERVE 語句。 下列規則中每個子句最多可以使用一個子句:
|
OBSERVE 輸出(reason=“high score”) OBSERVE TRACE(ip=@“device.ipAddress”) WHEN Model.Risk()。分數 > 400 |
RETURN <DecisionFunction> [ ,<ObservationFunction>(<KeyValuePairs>) ] [ WHEN <BooleanExpression> ] |
RETURN 語句會以決策終止規則執行。 語句必須指定有效的決策函式:Approve()、Reject()、Challenge()或 Review()。 語句也可以指定一或多個 觀察函式: Output() 或 Trace() 最後,語句可以包含 WHEN 子句,以指定它應該執行上述任何一項的條件。 在下列規則中,每個子句最多可以使用一個子句:
|
RETURN Review() RETURN Reject(), Trace(ip=@“device.ipAddress”) WHEN Model.Risk()。分數 > 400 |
ROUTETO QUEUE <QueueName> [ WHEN <BooleanExpression> ] |
ROUTETO 命令用於路由規則,將比對評定導向至案例管理佇列。 選擇性 WHEN 子句可用來描述命令應該執行路由的條件。 路由規則中每個子句最多可以使用一個子句。 |
ROUTETO 佇列(“高價值佇列”) WHEN @"purchase.request.totalAmount"> 500 |
SELECT <AggregationFunction> AS <VelocityName> FROM <AssesmentType> GROUPBY <GroupExpression> [ WHEN <BooleanExpression> ] |
SELECT 語句用於速度集合中,以定義速度。 它必須指定 聚合函數。 必要的 AS 子句可用來建立速度的別名。 然後,可以從規則參考此別名。 必要的 FROM 子句是用來指定要觀察速度的評量類型。 有效值為 Purchase、AccountLogin、AccountCreation、Chargeback、BankEvent 和 CustomAssessment。 必要的 GROUPBY 子句會指定屬性或表示式。 會合併評估為 GROUPBY 語句中相同值的所有事件,以計算 SELECT 語句中要求的匯總。 例如,若要計算每個使用者的匯總,請使用 GROUPBY @"user.userId"。 選擇性 WHEN 子句會指定 Boolean 運算式,以判斷正在處理的評量是否應該包含在所定義的速度中。 在速度集合中,每個子句最多可以使用一個子句。 |
SELECT Count() AS _Purchase_Rejections_Per_Email SELECT DistinctCount(@“purchaseId”) |
WHEN <BooleanExpression> | WHEN 語句就像其他語句上的 WHEN 子句,但它單獨位於規則和速度集合的 Condition 區段中。 它會指定布爾值條件,以判斷應該執行整個規則、速度集或路由規則。 所有規則類型和速度集的 [條件] 區段中最多可以使用一個。 |
WHEN Model.Risk()。分數 > 400 |
DO <動作函式> | DO 語句是用來在規則執行結束時執行某些動作。 此語句只能在決策後動作中使用 | DO SetResponse(name = @“firstname” + @“lastname”) |
參考屬性和變數
您可以使用 at sign (@) 運算子,從目前事件參考屬性。
變數 | 描述 | 範例 |
---|---|---|
@ | at sign (@) 用來參考來自傳入事件的屬性。 屬性可能會作為要求承載的一部分傳送,或Microsoft Dynamics 365詐騙保護可能會產生它。 在 @@ 符號之後,指定您要參考之屬性的完整路徑。 以引弧括住路徑(例如 @“address.city”。 如果參考的屬性不是事件承載的一部分,則會傳回該類型的預設值:0.0 表示雙精度浮點數、字串的空字串等等。 屬性的類型是從屬性所使用的內容推斷而來。 如果提供的內容不足, 預設會使用 String 類型。 如需類型推斷的相關信息,請參閱 屬性的類型推斷。 |
@“address.city” |
$ | 貨幣符號 ($) 用來參考 LET 語句中定義的變數。 如需詳細資訊,請參閱 定義您自己的變數。 | $fullName |
@a[x] | 此變數用來編製數位變數的索引。 如果評估的要求承載包含項目的陣列,您可以使用下列語法來存取陣列的個別元素:@“productList[0]”。 若要存取該專案的屬性,請使用下列語法: @“productList[0].productId” |
@“productList[0].productId” @“paymentInstrumentList[3].type” |
Exists | 此運算子會檢查變數是否存在於事件承載中。 Exists(字串變數) |
Exists(@“user.email”) |
Request.CorrelationId() | 此函式會參考所評估事件的唯一相互關聯標識碼。 您可以使用此函式來存取規則體驗中事件的相互關聯標識碼,並將它傳遞至外部呼叫做為參數或標頭。 | External.MyExternalCall(Request.CorrelationId()) |
.GetDiagnostics() | 此函式可用來從外部呼叫或外部評估回應探索重要的診斷和偵錯資訊。 針對外部呼叫,Diagnostics 物件包含要求承載、端點、HttpStatus 程式代碼、錯誤訊息和延遲。 外部評估回應的診斷物件中無法使用端點。 一旦使用其對應的擴充方法建立 Diagnostics 對象,這些字段就可用於規則中。GetDiagnostics()” | LET $extResponse = External。 myCall(@“device.ipAddress”) LET $extResponseDiagnostics = $extResponse.GetDiagnostics() OBSERVE 輸出(診斷 = $extResponseDiagnostics) WHEN $extResponseDiagnostics。 HttpStatusCode != 200 |
定義您自己的變數
您可以使用 LET 關鍵詞來定義變數。 該變數接著可以在規則中的其他位置參考。 以貨幣符號 ($) 為所有變數加上前置詞。 例如,您會宣告下列變數。
LET $fullName = @"user.firstName" + @"user.lastName"
LET 語句中宣告的變數只能在定義語句的規則或速度集範圍內使用。
例如,若要參考上一個範例中的變數,您可以撰寫下列語句。
WHEN $fullName == "Kayla Goderich"
注意
定義變數之後,就無法使用新的值來更新它。
全域變數函式
您可以使用全域變數函式來設定和取得規則內的變數。 設定全域變數之後,即可在相同環境或子環境內的決策規則、速度、路由規則和決策後動作記憶體取它們。 下表列出「詐騙保護」所使用的階層。 例如,如果您在根環境中的規則中設定全域變數,則 Fraud Protection 可以在相同環境中的相同評量或任何其他規則內擷取其值,或是任何子環境。
Operator | 名稱 | 範例 |
---|---|---|
SetVariables(k=v) | 此函式可用來設定機碼/值組,也就是將值設定為變數。 | Do SetVariables(key= 123, email=@“user.email”) |
GetVariable(“k”) | 此函式可用來存取已設定的變數。 如果我們存取從未設定的變數,則會傳回預設值。 | GetVariable(“key”)。AsInt() GetVariable(“email”)。AsString() GetVariable(“key”)。AsDouble() GetVariable(“key”)。AsBool() GetVariable(“key”)。AsDateTime() GetVariable(“key”)。AsJsonObject() GetVariable(“key”)。AsJsonArray() |
注意
全域變數是指定評量的單一交易專屬。 無法從另一筆交易或其他評量擷取某個交易內的變數。
決策函式
決策函式用於規則來指定決策。
決策類型 | 描述 | 範例 |
---|---|---|
核准() | 此類型會指定核准的決策。 它可以包含核准的原因,以及另一個支援訊息。 重載:
|
RETURN Approve() RETURN Approve(“on safe list”) RETURN Approve (“on safe list”, “not not escalate”) |
拒絕() | 此類型指定拒絕的決策。 它可以包含拒絕的原因和另一個支援訊息。 重載:
|
RETURN Reject() RETURN Reject(“禁運國家”) RETURN Reject(“禁運國家”, “不要呈報”) |
評論() | 此類型會指定檢閱的決策。 它可以包含檢閱的原因,以及另一則支援訊息。 重載:
|
RETURN Review() RETURN Review(“watch list 上的使用者”) RETURN Review(“watch list 上的使用者”、“不要呈報”) |
Challenge(String challengeType) | 此類型會指定 「挑戰」和「挑戰」類型的決策。 它也可能包含挑戰的原因和另一個支援訊息。 重載:
|
RETURN 挑戰 (“SMS”) RETURN Challenge (“SMS”, “suspected bot”) RETURN Challenge (“SMS”, suspected bot“, ”do not escalate“) |
觀察函式
觀察函式可用來擷取目前內容中的數據,並將其寫入其他位置。
傳回類型 | 描述 | 範例 |
---|---|---|
Output(k=v) | 此函式可用來將索引鍵/值組傳遞至 API 回應的 CustomProperties 區段。 索引鍵/值組會巢狀於名稱與包含 Output() 語句之子句名稱相同的物件內。 | Output(key=“test”, email=@“user.email”, countryRegion=Geo.CountryRegion(@“device.ipAddress”)) |
Trace(k=v) | 此函式可用來觸發 Trace 事件,並將機碼/值組傳送至 FraudProtection.Trace.Rule 事件追蹤命名空間。 | Trace(key=“Manual Review”, ip=@“device.ipAddress”) |
SetResponse(String sectionName, k=v) | 此函式可用來將索引鍵/值組傳遞至 API 回應的 CustomProperties 區段。 sectionName 是可略過的選擇性參數。 此函式只能在後續決策動作中使用;它無法在決策規則內使用 | SetResponse(“Scores”, bot = Model.Bot(@deviceContextId), risk=Model.Risk()) SetResponse(test=“123”) |
Response.Decision() | 此函式會參考正在評估之目前評量的決定。 | Response.Decision() == “核准” |
彙總函數
函式 | 描述 | 範例 |
---|---|---|
Count() | 此函式會傳回事件發生的次數。 | SELECT Count() AS numPurchases |
DistinctCount(字串 索引鍵) | 此函式會傳回指定之屬性的相異值數目。 如果傳入事件的指定屬性為 Null 或空白,則事件不會參與匯總。 | SELECT DistinctCount(@“device.ipAddress”) AS distinctIPs |
Sum(Double value) | 此函式會傳回指定數值屬性的值總和。 | SELECT Sum(@“totalAmount”) AS totalSpending |
邏輯運算子
Operator | 名稱 | 範例 |
---|---|---|
和 (&&) | 邏輯 和 | Model.Risk()。分數 > 500 & Model.Risk()。分數 < 800 Model.Risk()。評分 > 500 和 Model.Risk()。分數 < 800 |
或 (||) | 邏輯 或 | @“email.isEmailUsername” == false || @"email.isEmailValidated" == false @“email.isEmailUsername” == false 或 @"email.isEmailValidated" == false |
not | 邏輯否定 | @"email.isEmailUsername" not(!) @"email.isEmailUsername" |
比較運算子
詐騙保護支援所有標準 C# 比較 和 相 等作業。 下表包含一些您可能發現有用的運算符範例。 如果您將這些運算符套用至字串,就會進行語彙比較。
Operator | 名稱 | 範例 |
---|---|---|
== | 此運算子會檢查是否相等。 | @"user.countryRegion" == @"shippingAddress.countryRegion" |
!= | 此運算子會檢查是否不相等。 | @"user.countryRegion" != @"shippingAddress.countryRegion" |
> | 這個運算子會檢查第一個值是否大於第二個值。 | Model.Risk()。分數 > 500 |
< | 這個運算子會檢查第一個值是否小於第二個值。 | Model.Risk()。分數 < 500 |
>= | 這個運算子會檢查第一個值是否大於或等於第二個值。 | Model.Risk()。分數 >= 500 |
<= | 這個運算子會檢查第一個值是否小於或等於第二個值。 | Model.Risk()。分數 <= 500 |
X ? Y : Z | 此運算子會檢查條件 X 是否為 true。 如果為 true,則會執行語句 Y 並傳回其結果。 否則,會執行語句 Z 並傳回其結果。 多個邏輯檢查也可以使用括號結合在一起,以定義巢狀 IF <> THEN <> ELSE <> 邏輯 | LET $riskbucket = Model.Risk()。分數 > 500 ? “High” : (Model.Risk()。分數 > 300 ? “Medium” : “Low”) |
數學函數
詐騙保護支援所有標準 C# 數學方法和算術運算符。 下表包含一些您可能會發現有用的方法範例。
Operator | 名稱 | 範例 |
---|---|---|
Math.Min(Double value1,Double value2) | 此運算子會計算兩個值的最小值。 | Math.Min(Model.Risk()。Score,Model.Bot(@“deviceFingerprinting.id”)。分數) |
Math.Max(Double value1, Double value2) | 此運算子會計算兩個值的最大值。 | Math.Max(Model.Risk()。Score,Model.Bot(@“deviceFingerprinting.id”)。分數) |
RandomInt(Integer min,Integer max) | 這個運算符會傳回所提供範圍中的隨機整數,包括最小值和排除最大值。 | RandomInt(0, 100) |
DateTime 運算符
Fraud Protection 支持標準 C# DateTime 屬性、方法和運算符。 下表包含一些您可能會發現有用的函式和屬性範例。
Operator | 名稱 | 範例 |
---|---|---|
UtcNow | 這個運算符會取得設定為計算機上目前日期和時間的 DateTime 物件,以 UTC 表示。 | DateTime.UtcNow |
Today | 這個運算符會取得設定為目前日期的物件,其中時間元件設定為00:00:00:00。 | DateTime.Today |
差集 | 這個運算符會藉由從輸入 DateTime 減去指定的日期和時間,傳回新的 DateTime。 | DateTime.UtcNow.Subtract(@var1.ToDateTime()) |
DaysSince(DateTime date) | 這個運算符會傳回整數,代表在指定的 DateTime 值與目前日期之間傳遞的天數(以國際標準時間 [UTC] 表示)。 | DaysSince(@“user.CreationDate“) |
Year | 這個運算子會取得這個實例所表示日期的年份元件。 | @"user.creationDate".年 |
Date | 這個運算符會取得與這個實例具有相同日期的新物件,但時間值設定為 00:00:00 (午夜)。 | @"user.creationDate".日期 |
類型轉換運算元
如需類型推斷的相關信息,請參閱 本文稍後的屬性類型推斷 一節。
Operator | 名稱 | 範例 |
---|---|---|
Convert.ToDateTime | 這個運算符會將字串轉換成 datetime,並使用指定的格式將 datetime 轉換成字串。 |
Convert.ToDateTime(@“user.creationDate”)。ToString(“yyyy-MM-dd”) |
Convert.ToInt32 | 這個運算子會將指定的值轉換為 Int32。 |
Convert.ToInt32(@var) |
Convert.ToDouble | 這個運算子會將指定的值轉換成 Double。 |
Convert.ToDouble(@var) |
字串函數
Fraud Protection 支援標準 C# 字串類別。 下表包含一些您可能會發現有用的函式和運算符範例。
Operator | 名稱 | 範例 |
---|---|---|
StartsWith() | 這個運算符會檢查字串是否以指定的前置詞開頭。 | @"user.phoneNumber".StartsWith(“1-”) |
EndsWith() | 此運算子會檢查字串是否以指定的後綴結尾。 | @"user.email".EndsWith(“@contoso.com”) |
IsNumeric() | 此運算子會檢查字串是否為數值。 | @"user.email".IsNumeric() |
長度 | 這個運算符會傳回字串中的字元數。 |
@"user.username".Length |
ToDateTime() | 這個運算符會將字串 轉換成 DateTime 物件。 | @"user.creationDate".ToDateTime() |
ToDouble() | 這個運算符會將字串 轉換成 Double 值。 | @"productList.purchasePrice".ToDouble() |
ToInt32() | 這個運算符會將字串 轉換成 Int32 值。 | @"zipcode".ToInt32() |
ToUpper() | 這個運算符會傳回轉換成大寫的這個字串複本。 | @"user.username".ToUpper() |
ToLower() | 這個運算符會傳回轉換成小寫的這個字串複本。 | @"user.username".ToLower() |
IndexOf() | 這個運算符會報告指定字串內第一次出現之指定子字串之以零起始的索引。 | @"user.username".IndexOf(“@”) |
LastIndexOf() | 這個運算符會報告指定字串中最後一次出現之指定子字串的以零起始的索引。 | @"user.username".LastIndexOf(“@”) |
Substring() | 這個運算符會傳回從字串內以零起始的索引開始的子字串,第二個選擇性參數會指定所需子字串串的長度 | @"user.username".Substring(0,5) |
IsNullOrEmpty() | 如果指定的字串為 Null 或空白,則這個運算符會傳回 。 否則會傳回 false。 | @"user.username".IsNullOrEmpty() |
IgnoreCaseEquals() | 如果兩個字串相等,則這個運算符會傳回 true,而不論大小寫差異為何。 否則會傳回 false。 | @"user.username".IgnoreCaseEquals(@“user.email”) |
Contains() | 此運算子會檢查字串是否包含另一個字串。 | @"productList.productName".Contains(“Xbox”) |
ContainsOnly() | 此運算子會檢查字串是否只包含提供的字元集。 | @“zipcode”。ContainsOnly(CharSet.Numeric) |
ContainsAll() | 此運算子會檢查字串是否包含提供的所有字元集。 | @“zipcode”。ContainsAll(CharSet.Numeric|CharSet.Hyphen) |
ContainsAny() | 此運算子會檢查字串是否包含所提供的任何字元集。 | @“zipcode”。ContainsAny(CharSet.Numeric|CharSet.Hyphen) |
在 ContainsOnly、ContainsAll 和 ContainsAny 中使用 CharSet
下列字元類型可用於 ContainsOnly、ContainsAll 和 ContainsAny。
字元類型 | 描述 |
---|---|
字母順序 | a-z、A-Z |
單引號 | ' |
Asperand | @ |
反斜線 | \ |
Comma | , |
Hyphen | - |
數值 | 0-9 |
期間 | . |
斜線 | / |
底線 | _ |
空白 | 單一空間 |
Gibberish 偵測函式
這些函式可透過快速且有效率地偵測關鍵使用者輸入欄位(例如名稱和位址)是否包含 Gibberish 來協助防止詐騙。
函式 | 描述 | 範例 |
---|---|---|
GetPattern(String)。maxConsonants | 未以元音分隔的字串中連續同音符的最大數目。 例如,字串 “01gggyturah” 的 maxConsonants 為 5。 | GetPattern(@“user.email”maxConsonants |
GetPattern(String)。gibberScore | ML 分數介於 0 到 1 之間;0 表示最有可能是巨無一人,1 表示不太可能是吉比。 | GetPattern(@“user.email”“gibberScore |
注意
Gibberish 偵測模型是以公開可用英文檔中兩個連續英數位元的頻率為基礎。 假設公開檔中出現兩個連續英數位元的頻率愈高,不太可能是亂碼。 模型應該為英文文字提供合理的分數,並可用來偵測名稱或位址是否包含 Gibberish。 不過,模型可能不適合縮寫,例如狀態的簡短形式(AZ、TX 等),也無法用來驗證名稱或位址。 最後,模型尚未針對非英文文字進行測試。
模式偵測函式
這些函式可透過快速且有效率地偵測關鍵使用者輸入欄位(例如名稱和位址)是否包含 Gibberish 來協助防止詐騙。
函式 | 描述 | 範例 |
---|---|---|
Patterns.IsRegexMatch(字串模式,字串來源) | 針對字串來源執行字串模式的正則表示式 (regex) 比對。 結果是布爾值,也就是 true (表示指定的字串符合模式) 或 false (表示不相符) | Patterns.IsRegexMatch(“^.com$“, @ ”user.email“) Patterns.IsRegexMatch( ”^.[aAeEiIoOuU]+.*$“, @ ”user.firstname“) |
注意
- 字串模式必須是常數輸入。
- 如果評估時間超過 10 毫秒,函式會傳回 false (預設結果)。
- 不支援 NonBacktracking 的所有 限制 也適用於 IsRegexMatch 函式。
模型函式
模型函式會執行各種詐騙模型,而且當您的評量不會自動執行一或多個詐騙模型時很有用。 當模型函式執行時,規則評估期間所執行模型的相關信息會在詐騙評估 API 呼叫中輸出。 然後,規則會取得模型結果的存取權,包括分數、原因等等,可用於進一步的規則處理和決策。
模型類型 | 描述 | 範例 |
---|---|---|
風險 | 評估會話有風險的可能性。 | Model.Risk() |
機器人 | 評估工作階段起始 Bot 的可能性。 傳入傳送至 Fraud Protection 裝置指紋解決方案的裝置內容識別碼。 | Model.Bot(@deviceContextId) |
地理函式
地理函式會藉由將IP位址轉換成地理位址來提供解析。 只有使用屬於交易承載的IP,或使用裝置指紋保護收集的IP,才能在規則中叫用異地函式。 無法針對任意IP值叫用地理函式。
Operator | 名稱 | 範例 |
---|---|---|
Geo.RegionCode(字串 ip) | 此運算子會將 IPv4 位址轉換為其美國區域代碼(也就是美國州或地區名稱的縮寫)。 例如,針對華盛頓州IP位址,會傳回 「WA」。。 |
Geo.RegionCode(@“device.ipAddress”) |
Geo.Region(字串 ip) | 此操作員會將 IPv4 位址轉換為其美國區域(也就是美國州或地區的名稱)。 例如,針對華盛頓州IP位址,會傳回 「Washington」。。 |
Geo.Region(@“device.ipAddress”) |
Geo.CountryCode(字串 ip) | 此運算子會將 IPv4 位址轉換成其國家/地區代碼。 例如,針對澳大利亞中的IP位址,會傳回 「AU」。。 |
Geo.CountryCode(@“device.ipAddress”) |
Geo.CountryRegion(字串 ip) | 此運算子會將IP位址轉換為區域名稱。 例如,針對澳大利亞中的IP位址,會傳回 「澳大利亞」。。 |
Geo.CountryRegion(@“device.ipAddress”) |
Geo.City(字串 ip) | 此運算子會將IPv4位址轉換為城市名稱。 例如,針對紐約市的IP位址,會傳回「紐約市」。。 |
Geo.City(@“device.ipAddress”) |
Geo.MarketCode(字串 ip) | 此操作員會將IPv4位址轉換為IP位址的市場代碼。 例如,針對來自加拿大的IP位址,會傳回 “NA” (北美洲)。 |
Geo.MarketCode(@“device.ipAddress”) |
裝置屬性函式
Operator | 名稱 | 範例 |
---|---|---|
Device.GetFullAttributes(String sessionId) | 傳回指定裝置指紋會話的完整裝置屬性集。 請參閱 設定裝置指紋 以檢視完整的裝置屬性集 | Device.GetFullAttributes(@“deviceFingerprinting.id”) |
Device.GetAttributes(String sessionId) | 針對指定的裝置指紋會話傳回較小的裝置屬性子集。 子集是由詐騙保護所策劃的清單,其中包含最常用的屬性。 | Device.GetAttributes(@“deviceFingerprinting.id”) |
Device.GetSelectedAttributes(String sessionId, String attributeName) | 針對指定的裝置指紋會話,傳回最多 20 個裝置屬性。 所需的屬性清單會指定為逗號分隔參數 | Device.GetSelectedAttributes(@“deviceFingerprinting.id”, “deviceAsn”,“deviceCountryCode”) |
Device.GetSpeedOfTravel(String sessionId) | 以每小時英里為單位傳回裝置的最大行進速度。 詐騙保護會藉由擷取最後五個連續指紋會話,計算裝置從會話到會話的速度,以決定最大速度,並傳回最大值。 裝置是透過使用 Cookie 識別碼的會話來識別的。 | Device.GetSpeedOfTravel(@“deviceFingerprinting.id”) |
BIN 查閱函式
BIN 查閱功能會根據銀行標識碼 (BIN) 提供付款卡帳戶資訊(例如,卡片網路、卡片類型、卡國碼、卡片類別)。 BIN 查閱的數據來自領先第三方 BIN 數據提供者,然後由詐騙保護策劃。
Operator | 名稱 | 範例 |
---|---|---|
站。Lookup(字串 BIN)。cardNetwork | 此函式會查閱 BIN 並傳回卡片網路(例如 Visa、萬事達卡)。 |
站。Lookup(@“card.bin”cardNetwork |
站。Lookup(字串 BIN)。cardType | 此操作員會查閱 BIN 並傳回卡片類型(例如轉帳、點數)。 |
站。Lookup(@“card.bin”cardType |
站。Lookup(String BIN)。issuer | 此操作員會查閱 BIN 並傳回發行組織。 |
站。Lookup(@“card.bin”issuer |
站。Lookup(String BIN)。countryCode | 此操作員會查閱 BIN,並傳回卡片的 ISO 雙字母國家/地區代碼。 |
站。Lookup(@“card.bin”countryCode |
站。Lookup(String BIN)cardCategory | 此操作員會查閱 BIN 並傳回卡片類別(例如預付、公司、獎勵)。 |
站。Lookup(@“card.bin”cardCategory |
站。Lookup(字串 BIN)。錯誤 | 如果找不到 BIN,此運算符會查閱 BIN 並傳回錯誤訊息。 |
站。Lookup(@“card.bin”error |
清單函式
詐騙保護可讓您上傳自定義清單,並以語言參考它們。 如需如何上傳這些清單的資訊,請參閱 管理清單。 如需如何在規則中使用清單的詳細資訊,請參閱 本文稍後的<在規則 中使用清單>一節。
Operator | 名稱 | 範例 |
---|---|---|
ContainsKey( 字串 listName, String columnName, 字串 索引鍵 ) |
此運算子會檢查金鑰是否包含在詐騙保護 清單中的指定資料行中。 下一個資料行中的範例會檢查 [電子郵件支援清單] 清單中的 [電子郵件] 資料行是否包含 @“user.email” 變數。 |
ContainsKey(“電子郵件支援清單”、“電子郵件”、 @"user.email" |
查閱( 字串 listName, 字串 keyColName, 字串 值ColName) |
此運算子會在詐騙保護清單中查閱索引鍵的值。 必須指定包含索引鍵的數據行名稱,以及包含值的數據行名稱。 值一律會以字串的形式傳回。 如果找不到索引鍵,而且 未指定 defaultValue 參數,則會傳回 “Unknown”。 下一個資料行中的範例會在 [電子郵件支援清單] 清單的 [電子郵件] 資料行中尋找 @“user.email” 變數的值。 如果找到相符專案,函式會從清單中的相符數據列傳回 Status 資料行的值。 如果找不到相符專案,函式會傳回 0。 |
Lookup(“電子郵件支援清單”、“電子郵件”、“ @"user.email"狀態”,0) |
In | 此運算子會檢查索引鍵是否包含在以逗號分隔的值清單中。 | In(@“user.countryRegion”, “US, MX, CA”) |
InSupportList | 此運算子會檢查屬性是否位於支援清單上。 | InSupportList('電子郵件支援列表', @"user.email") |
IsSafe | 此操作員會檢查實體是否在支援清單中標示為安全。 | IsSafe('電子郵件支援列表', @"user.email") |
IsBlock | 此運算子會檢查實體是否在支援清單上標示為 [封鎖]。 | IsBlock('電子郵件支援列表', @"user.email") |
IsWatch | 此運算子會檢查實體是否標示為支援清單中的監看式。 | IsWatch('電子郵件支援清單', @"user.email") |
在規則中使用清單
您可以使用 ContainsKey 和 Lookup 運算符來參考您上傳至詐騙保護的清單。 如需清單的詳細資訊,請參閱 管理清單。
ContainsKey
若要檢查您的其中一個清單是否包含特定值,請使用 ContainsKey 運算符。 指定清單名稱、資料行,以及您要檢查的索引鍵。
例如,您可以上傳具風險電子郵件地址的單欄清單,並將它命名為 Risky 電子郵件清單。
電子郵件 |
---|
Kayla@contoso.com |
Jamie@bellowscollege.com |
Marie@atatum.com |
然後,您可以使用下列語法來拒絕此列表中具風險電子郵件位址的所有交易。
RETURN Reject("risky email")
WHEN ContainsKey("Risky email list", "Email", @"user.email")
這個子句會檢查 「Risky email list」 清單中的 [電子郵件] 資料行是否包含 @email 索引鍵。 如果這樣做,交易就會遭到拒絕。
查詢
針對多欄清單,您可以使用 Lookup 運算子來檢查特定索引鍵的數據行值。
例如,您可以建立一個清單,其中包含一個電子郵件地址數據行,另一個數據行表示這些電子郵件地址的狀態。 您會將此清單 命名為電子郵件清單。
電子郵件 | 狀態 |
---|---|
Kayla@contoso.com |
危險 |
Jamie@bellowscollege.com |
危險 |
Marie@atatum.com |
危險 |
Camille@fabrikam.com |
Safe |
Miguel@proseware.com |
Safe |
Tyler@contoso.com |
Safe |
然後,您可以使用下列語法來拒絕此列表中電子郵件位址中所有狀態為 Risky 的交易。
RETURN Reject("risky email")
WHEN Lookup("Email List", "Email", @"user.email", "Status") == "Risky"
此子句會在 [電子郵件清單] 清單中的 [電子郵件] 資料行中尋找 @“user.email” 索引鍵,並檢查 “Status” 資料行中的值是否為 Risky。 如果是,交易就會遭到拒絕。
如果清單中找不到 @“user.email”金鑰,則詐騙保護會傳回 「未知」。
您也可以將自己的預設值指定為第五個參數。 如需詳細資訊,請參閱 本文稍早的邏輯運算符 一節。
Lookup 運算子一律會傳回 String 值。 若要將此值 轉換成 Int、 Double 或 DateTime 值,請使用 類型轉換運算符。
使用外部呼叫、外部評量和速度
- 若要參考外部呼叫,請輸入 External,後面接著您要參考的外部呼叫。 如需詳細資訊,請參閱 在規則中使用外部呼叫。
- 若要參考外部評定,請輸入 評定,後面接著您想要參考的外部評定。 如需詳細資訊,請參閱 在規則中使用外部評定。
- 若要參考速度,請輸入 Velocity,後面接著您想要參考的速度。 如需詳細資訊,請參閱 在規則中使用速度。
屬性的類型推斷
變數類型是從所使用的內容推斷而來。 以下列出一些範例:
- 在表達式 WHEN @isEmailValidated中,變數會解譯為 布爾 值。
- 在表達式 Model.Risk() 中。分數 > 500,變數會解譯為 Double 值。
- 在表達式 @“user.creationDate” 中。Year < DateTime.UtcNow.Year,變數會解譯為 DateTime 值。
如果沒有足夠的內容來推斷變數的類型,它就會 被視為 String 值。 例如,在表達式 Model.Risk() 中。評分 < 模型.Bot(@“deviceFingerprinting.id”)。分數,這兩個變數都會解譯為字串。
若要指定非字串變數的類型,請使用 類型轉換運算符。
JSON 陣列和物件
FQL 支援將複雜結構化物件建構為局部變數,以 JSON 形式傳遞至外部呼叫或外部評估。 如同 FQL 中所有其他局部變數一樣,一旦建立數位和物件就不可變。
JSON 陣列
陣列是藉由將表達式括在一對括弧中來建立:
LET $arr1 = [ "hello", "world" ]
LET $arr2 = [
"this is also an array",
78.4,
$arr1,
@"user.email",
External.MyExtcall()
]
JSON 物件
物件會以大括弧建立:
LET $obj1 = { isObject: true }
LET $obj2 = {
numberField: 7,
fieldIs: "string",
internalObj: $obj1,
inline: {
innerInnerField: "hello"
}
}
JSON 陣列和物件的 FQL 函式
語法 | 描述 | 範例 |
---|---|---|
myArr[0] | 您可以使用此語法,依索引存取特定數位專案。 | myArr [0].property myArr [0][0] myArr [0][0].property myArr [0].property[ 0]myArr [0].property[0].property[0].property |
上述 範例中的 myArr 是陣列。 此陣列的來源可以是@@payloadProperty、外部評估回應、外部呼叫回應、局部變數或全域變數。
以下是如何根據不同數位來源使用語法的範例:
- 數位來源:P ayload
LET $sample = @@"myArr[0]".AsJsonArray()
RETURN Approve()
WHEN $sample[0].AsString() == "a"
- 數位來源:局部變數
LET $group1 =["a", "b", "c"] LET $group1 =[{ item1: "a", item2: "b"}, { item1: "c", item2: "d"}] LET $group3 =[{ item1: "a", item2: "b", item3: ["c", "d"]}, {{ item1: "e", item2: "f", item3: ["g", "h"]}] RETURN Approve() WHEN $group1[0].AsString() == "a" && $group1[0].item2.AsString() == "b" && $group3[0].item3[0].AsString() == "c"
語法 | 描述 | 範例 |
---|---|---|
Array.GetValue (TargetArray .AsJsonArray(), matchKey, matchValue, lookupKey) | 透過此函式,您可以存取符合條件的第一個數位元素。 傳回值 |
Array.GetValue(@@“payloadProperty”。AsJsonArray(), matchKey, matchValue, lookupKey) |
Array.GetValues(TargetArray .AsJsonArray(), matchKey, matchValue) | 透過此函式,您可以存取一組符合條件的陣列元素。 傳回陣列 |
Array.GetValues(@@“payloadProperty”。AsJsonArray(), matchKey, matchValue) |
以下是一些更詳細的範例,說明如何根據不同的數位來源使用上述語法:
陣列來源 | Array.GetValue | Array.GetValues |
---|---|---|
外部評量 | LET $a = Assessments.myAssessment.evaluate() LET $sample = Array.GetValue($a.ruleEvaluations.AsJsonArray()、“rule”、“Sample Payload Generation”、“”clauseNames“) RETURN Approve() WHEN $sample[0]。AsString() == “TestData” |
LET $a = Assessments.myAssessment.evaluate() LET $sample = Array.GetValues($a.ruleEvaluations.AsJsonArray(), “rule”, “Sample Payload Generation” )RETURN Approve() WHEN $sample[0].clauseNames[0]。AsString() == “TestData” |
承載 | 承載範例: {“group”:[{“item1”: “a”, “item2”: “a1”}, {“item1”: “b”, “item2”: “b1”}]} LET $sample = Array.GetValue(@@“group”。AsJsonArray(), “item1”、“a”、“item2”)RETURN Approve() WHEN $sample。AsString() == “a1” |
承載範例: { “group”:[{“item1”: “a”, “item2”: “a1”}, {“item1”: “b”, “item2”: “b1”}]} LET $sample = Array.GetValues(@@“group”。AsJsonArray(), “item1”, “a”) RETURN Approve() WHEN $sample[0].item2。AsString() == “a1” |
全域變數 | 使用與上述相同的承載範例 Do SetVariables(Var=@@“group”) LET $group = GetVariable(“Var” )AsJsonObject() LET $value = Array.GetValue($group,“item1”、“a”、“item2”) RETURN Approve() WHEN $value。AsString() == “a1” |
使用與上述相同的承載範例 Do SetVariables(Var=@@“group”) LET $group = GetVariable(“Var” )AsJsonObject() LET $arr = Array.GetValues($group.AsJsonArray(), “item1”, “a”) RETURN Approve() |
外部呼叫 | 外部呼叫 (myCall) 回應: {“group”:[{“item1”: “a”, “item2”: “a1”}, {“item1”: “b”, “item2”: “b1”}]} |
外部呼叫 (myCall) 回應: {“group”:[{“item1”: “a”, “item2”: “a1”}, {“item1”: “b”, “item2”: “b1”}]} LET $x = External.myCall()。AsJsonObject() LET $arr = Array.GetValues($x.group[0]。AsJsonObject(), “item1”、“a”) RETURN Approve()WHEN $arr[0].item2。AsString() == “a1” |
JSON 陣列和物件的類型轉換
下列 。JsonObject<支援 Type>():
- AsString()
- AsInt()
- AsDouble()
- AsDateTime()
- AsBool()
- AsJsonArray()
- AsJsonObject()
當您使用兩個數位協助程式方法之一 Array.GetValue 或 Arrays.GetValues 時,您必須使用 來輸入轉換。作為<Type>()。 範例:
LET $arr = {myArr:[{item1: "red", number: 45}, {item1: "blue", number: 56}, {item1: "green", number: 33}]} LET $sample = Array.GetValues($arr.myArr.AsJsonArray(), "item1", "blue")
將資料明確轉換成 JSON 物件或陣列之後,您就可以使用 。視<需要轉換成不同數據類型的 Type>()。 範例:
RETURN Approve() WHEN $sample[0].number.AsInt() == 56
當您使用 @@时,數據會隱含地轉換成 JSON 物件。 如果您接著想要將 JSON 物件轉換成不同的資料類型,則必須使用 。作為<Type>()。 範例:
LET $sample = @@”user.addresses”.AsJsonArray()
當您要以特定格式輸出時,必須使用 。作為<Type>()。 範例:
LET $sample = @@”user.addresses” Output(abc = $sample.AsJsonArray())
注意
類型轉換最佳做法:
- 一律在鏈結結尾輸入轉換。
- 當您不確定時,一律使用 明確類型轉換。作為<Type>()。 範例:
LET $sample = External.myCall().data[0].Item1[0].AsJsonArray()
Or
LET $sample = @@”accommodations[0].rooms”.AsJsonArray()
後續決策動作中可用的函式
下列函式只能在後續決策動作中使用。 這些原則無法在決策規則中取得
語法 | 描述 | 範例 |
---|---|---|
SetResponse(String sectionName, k=v) | 此函式可用來將索引鍵/值組傳遞至 API 回應的 CustomProperties 區段。 sectionName 是可略過的選擇性參數。 | SetResponse(“Scores”, bot = Model.Bot(@deviceContextId), risk=Model.Risk()) SetResponse(test=“123”) |
Response.Decision() | 此函式會參考正在評估之目前評量的決定。 | Response.Decision() == “核准” |