欺诈语言参考
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 子句指定一个布尔表达式,该表达式确定正在处理的评估是否应包含在定义的速度中。 速度集中每个子句最多可以使用一个子句。 |
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 表示双精度值、字符串的空字符串等。 从使用该特性的上下文推断属性的类型。 如果未提供足够的上下文, 则默认使用字符串 类型。 有关类型推理的信息,请参阅 属性的类型推理。 |
@“address.city” |
$ | 美元符号 ($) 用于引用 LET 语句中定义的变量。 有关详细信息,请参阅 定义自己的变量。 | $fullName |
@a[x] | 此变量用于为数组变量编制索引。 如果评估的请求有效负载包含项数组,则可以使用以下语法访问数组的各个元素:@“productList[0]”。 若要访问该元素的属性,请使用以下语法: @“productList[0].productId” |
@“productList[0].productId” @“paymentInstrumentList[3].type” |
Exists | 此运算符检查事件有效负载中是否存在变量。 Exists(字符串变量) |
Exists(@“user.email”) |
Request.CorrelationId() | 此函数引用正在计算的事件的唯一关联 ID。 可以使用此函数访问规则体验中事件的关联 ID,并将其作为参数或标头传递给外部调用。 | External.MyExternalCall(Request.CorrelationId()) |
.GetDiagnostics() | 此函数可用于从外部调用或外部评估响应中发现重要的诊断和调试信息。 对于外部调用,Diagnostics 对象包含请求有效负载、终结点、HttpStatus 代码、错误消息和延迟。 终结点在诊断对象中不可用,无法用于外部评估响应。 使用相应的扩展方法创建诊断对象后,可以在规则中使用这些字段中的任何一个。GetDiagnostics()” | LET $extResponse = 外部。 myCall(@“device.ipAddress”) LET $extResponseDiagnostics = $extResponse.GetDiagnostics() OBSERVE 输出(诊断 = $extResponseDiagnostics) 何时$extResponseDiagnostics。 HttpStatusCode != 200 |
定义自己的变量
可以使用 LET 关键字定义变量。 然后,可以在规则中的其他位置引用该变量。 以美元符号($)为所有变量添加前缀。 例如,声明以下变量。
LET $fullName = @"user.firstName" + @"user.lastName"
LET 语句中声明的变量只能在定义语句的规则或速度集的范围内使用。
例如,若要引用上一示例中的变量,可以编写以下语句。
WHEN $fullName == "Kayla Goderich"
注意
定义变量后,不能使用新值更新该变量。
全局变量函数
可以使用全局变量函数在规则中设置和获取变量。 设置全局变量后,可以在同一环境或子环境中访问决策规则、速度、路由规则和决策后操作。 下表列出了层次结构欺诈保护使用。 例如,如果在根环境中的规则中设置全局变量,则欺诈保护可以在同一环境中的同一评估中的任何其他规则中检索其值,或者检索任何子环境。
运算符 | 说明 | 示例 |
---|---|---|
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”, “do not escalate”) |
拒绝() | 此类型指定拒绝的决定。 它可以包括拒绝的原因和另一条支持消息。 重载:
|
RETURN Reject() RETURN Reject(“禁运国家”) 返回拒绝(“禁运国家”, “不升级”) |
评论() | 此类型指定“审阅”决策。 它可以包括评审的原因和另一条支持消息。 重载:
|
RETURN Review() RETURN Review(“监视列表中的用户”) RETURN Review(“监视列表中的用户”、“请勿升级”) |
Challenge(String challengeType) | 此类型指定质询和 质询 类型的决策。 它还可能包括挑战的原因和另一条支持消息。 重载:
|
RETURN 质询 (“SMS”) RETURN 挑战(“SMS”、“可疑机器人”) 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) | 此函数可用于触发跟踪事件并将键值对发送到 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(双 值) | 此函数返回指定数值属性的值之和。 | SELECT Sum(@“totalAmount”) AS totalSpending |
逻辑运算符
运算符 | 说明 | 示例 |
---|---|---|
和 (&&) | 逻辑 和 | 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# 比较 和 相 等操作。 此表包含一些可能有用的运算符示例。 如果将这些运算符应用于字符串,则会发生词法比较。
运算符 | 说明 | 示例 |
---|---|---|
== | 此运算符检查是否相等。 | @"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 ? “高”:(Model.Risk()。分数 > 300 ? “中等”:“低”) |
数学函数
欺诈保护支持所有标准 C# 数学方法和算术运算符。 此表包含一些可能有用的方法示例。
运算符 | 说明 | 示例 |
---|---|---|
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(整数 最小值、整数 最大值) | 此运算符返回提供的区域中的随机整数,包括最小值和不包括最大值。 | RandomInt(0、100) |
DateTime 运算符
欺诈保护支持标准 C# DateTime 属性、方法和运算符。 此表包含一些可能有用的函数和属性示例。
运算符 | 说明 | 示例 |
---|---|---|
UtcNow | 此运算符获取一个 DateTime 对象,该对象设置为计算机上的当前日期和时间,以 UTC 表示。 | DateTime.UtcNow |
Today | 此运算符获取一个对象,该对象设置为当前日期,其中时间组件设置为 00:00:00。 | DateTime.Today |
减 | 此运算符通过从输入 DateTime 中减去指定的日期和时间来返回新的 DateTime。 | DateTime.UtcNow.Subtract(@var1.ToDateTime()) |
DaysSince(DateTime date) | 此运算符返回一个整数,表示在指定的 DateTime 值和当前日期之间传递的天数(表示为协调世界时 [UTC])。 | DaysSince(@“user.CreationDate“) |
年份 | 此运算符获取此实例所表示日期的年份部分。 | @"user.creationDate".年 |
日期 | 此运算符获取与此实例具有相同日期的新对象,但时间值设置为 00:00:00(午夜)。 | @"user.creationDate".日期 |
类型转换运算符
有关类型推理的信息,请参阅 本文后面的属性 类型推理部分。
运算符 | 说明 | 示例 |
---|---|---|
Convert.ToDateTime | 此运算符将字符串转换为 datetime,并使用给定格式将 datetime 转换为字符串。 |
Convert.ToDateTime(@“user.creationDate”)。ToString(“yyyy-MM-dd”) |
Convert.ToInt32 | 此运算符将指定的值转换为 Int32。 |
Convert.ToInt32(@var) |
Convert.ToDouble | 此运算符将指定的值转换为 Double。 |
Convert.ToDouble(@var) |
字符串函数
欺诈保护支持标准 C# 字符串类。 此表包含一些可能有用的函数和运算符示例。
运算符 | 说明 | 示例 |
---|---|---|
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".子字符串(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 检测函数
这些函数通过快速高效地检测关键用户输入字段(如名称和地址)是否包含巨无奇来帮助防止欺诈。
函数 | 说明 | 示例 |
---|---|---|
GetPattern(String)。maxConsonants | 未用元音分隔的字符串中连续连续的连续连音的最大数量。 例如,字符串“01gggyturah”的 maxConsonants 为 5。 | GetPattern(@“user.email”)。maxConsonants |
GetPattern(字符串)。gibberScore | 基于 ML 的分数介于 0 和 1 之间;0 表示最有可能是胡言乱语,1 表示不太可能是胡言乱语。 | GetPattern(@“user.email”)。gibberScore |
注意
Gibberish 检测模型基于公开提供的英语文档中连续两个字母数字字符的频率。 假定公共文档中出现两个连续字母数字字符的频率越频繁,不太可能是乱字。 该模型应为英语文本提供合理的分数,并可用于检测姓名或地址是否包含乱字。 但是,模型可能不适合缩写,例如状态(AZ、TX 等)的短格式,也不能用于验证名称或地址。 最后,模型尚未针对非英语文本进行测试。
模式检测函数
这些函数通过快速高效地检测关键用户输入字段(如名称和地址)是否包含巨无奇来帮助防止欺诈。
函数 | 说明 | 示例 |
---|---|---|
Patterns.IsRegexMatch(字符串模式,字符串源) | 对字符串源执行字符串模式的正则表达式(正则表达式)匹配。 结果是一个布尔值,即 true(指示给定字符串匹配模式)或 false(表示不匹配) | Patterns.IsRegexMatch(“^.com$“, @ ”user.email“) Patterns.IsRegexMatch(”^.[aAeEiIoOuU]+.*$“, @ ”user.firstname“) |
注意
- 字符串模式必须是常量输入。
- 如果计算时间超过 10 毫秒,则函数返回 false(默认结果)。
- 不支持 NonBacktracking 的所有 限制 也适用于 IsRegexMatch 函数。
模型函数
模型函数运行各种欺诈模型,在评估不会自动运行一个或多个欺诈模型时非常有用。 当模型函数运行时,有关在规则评估期间运行的模型的信息是在欺诈评估 API 调用中输出的。 然后,规则可以访问模型结果,包括分数、原因等,这些结果可用于进一步的规则处理和决策。
模型类型 | 说明 | 示例 |
---|---|---|
风险 | 评估会话有风险的可能性。 | Model.Risk() |
聊天机器人 | 评估机器人启动会话的可能性。 传入发送到欺诈保护设备指纹解决方案的设备上下文 ID。 | Model.Bot(@deviceContextId) |
地理函数
地理函数通过将 IP 地址转换为地理地址来提供解析。 只有使用属于事务有效负载的 IP 或使用设备指纹保护收集的 IP,才能在规则中调用异地函数。 无法为任意 IP 值调用地理函数。
运算符 | 说明 | 示例 |
---|---|---|
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”) |
设备属性函数
运算符 | 说明 | 示例 |
---|---|---|
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 ID 通过会话标识设备。 | Device.GetSpeedOfTravel(@“deviceFingerprinting.id”) |
BIN 查找函数
BIN 查找功能根据银行标识号(BIN)提供支付卡帐户信息(例如卡网、卡类型、卡国家/地区代码、卡类别)。 BIN 查找的数据源自领先的第三方 BIN 数据提供程序,然后由欺诈保护进行策划。
运算符 | 说明 | 示例 |
---|---|---|
站。Lookup(字符串 BIN)。cardNetwork | 此函数查找 BIN 并返回卡片网络(例如 Visa、万事达卡)。 |
站。Lookup(@“card.bin”)。cardNetwork |
站。Lookup(字符串 BIN)。cardType | 此操作员查找 BIN 并返回卡类型(例如借记卡、信用额度)。 |
站。Lookup(@“card.bin”)。cardType |
站。Lookup(字符串 BIN)。颁发者 | 此操作员查找 BIN 并返回发证组织。 |
站。Lookup(@“card.bin”)颁发者 |
站。Lookup(字符串 BIN)。countryCode | 此运算符查找 BIN 并返回卡片的 ISO 双字母国家/地区代码。 |
站。Lookup(@“card.bin”)。countryCode |
站。Lookup(字符串 BIN)。cardCategory | 此操作员查找 BIN 并返回卡类别(例如预付费、公司、奖励)。 |
站。Lookup(@“card.bin”)。cardCategory |
站。Lookup(字符串 BIN)。错误 | 如果找不到 BIN,此运算符将查找 BIN 并返回错误消息。 |
站。Lookup(@“card.bin”)错误 |
列表函数
利用欺诈保护,可以上传自定义列表,并使用语言引用它们。 有关如何上传这些列表的信息,请参阅 “管理列表”。 有关如何在规则中使用列表的详细信息,请参阅 本文后面的“使用规则 ”部分中的列表。
运算符 | 说明 | 示例 |
---|---|---|
ContainsKey( String listName, String columnName, 字符串 键) |
此运算符检查密钥是否包含在欺诈保护 列表中的指定列中。 下一列中的示例检查“电子邮件支持列表”列表中的“电子邮件”列是否包含 @“user.email” 变量。 |
ContainsKey(“电子邮件支持列表”、“电子邮件”, @"user.email") |
查找( String listName, 字符串 keyColName, 字符串 valueColName) |
此运算符在欺诈保护列表中查找密钥的值。 必须指定包含键的列的名称和包含值的列的名称。 该值始终作为字符串返回。 如果未找到密钥,并且 未指定 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")
此子句检查“有风险的电子邮件列表”列表中的“电子邮件”列是否包含 @email 键。 如果这样做,则拒绝事务。
查找
对于多列列表,可以使用 Lookup 运算符检查特定键的列的值。
例如,创建一个列表,其中包含一列用于电子邮件地址,另一列指示这些电子邮件地址的状态。 将此列表 命名为电子邮件列表。
电子邮件 | Status |
---|---|
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” 键,并检查“状态”列中的值是否为 Risky。 如果是,则拒绝事务。
如果在列表中找不到 @“user.email”密钥,则欺诈保护将返回“未知”。
还可以将自己的默认值指定为第五个参数。 有关详细信息,请参阅 本文前面的“逻辑运算符 ”部分。
Lookup 运算符始终返回字符串值。 若要将此值转换为 Int、 Double 或 DateTime 值,请使用 类型强制转换运算符。
使用外部调用、外部评估和速度
- 若要引用外部调用,请键入 External,后跟要引用的外部调用。 有关详细信息,请参阅 在规则中使用外部调用。
- 若要引用外部评估,请键入 评估,然后键入要引用的外部评估。 有关详细信息,请参阅 在规则中使用外部评估。
- 若要引用速度,请键入 “速度”,然后键入要引用的速度。 有关详细信息,请参阅 在规则中使用速度。
属性的类型推理
变量类型是从所使用的上下文推断的。 以下是一些示例:
- 在表达式 WHEN @isEmailValidated中,变量被解释为 布尔 值。
- 在表达式 Model.Risk() 中。评分 > 500,变量被解释为 Double 值。
- 在表达式 @“user.creationDate” 中。Year < DateTime.UtcNow.Year,变量解释为 DateTime 值。
如果没有足够的上下文来推断变量的类型,则它被视为字符串值。 例如,在表达式 Model.Risk() 中。为 Model.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[0].property |
在 上面的示例中,myArr 是一个数组。 此数组的源可以是@@payloadProperty、外部评估响应、外部调用响应、局部变量或全局变量。
下面是如何使用基于不同数组源的语法的示例:
- 数组源:Payload
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 时,需要使用类型转换 。作为<类型>()。 示例:
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 对象转换为其他数据类型,则必须使用 。作为<类型>()。 示例:
LET $sample = @@”user.addresses”.AsJsonArray()
如果要以特定格式输出,则必须使用 。作为<类型>()。 示例:
LET $sample = @@”user.addresses” Output(abc = $sample.AsJsonArray())
注意
类型转换最佳做法:
- 始终在 .chain 的末尾键入强制转换。
- 不确定时,始终使用显式类型强制转换。作为<类型>()。 示例:
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() == “批准” |