焦小花同学

当移动支付遇上风控系统:实时反欺诈的实现

Image

点击蓝字 关注我们

Image

SUBSCRIBEto us

今天系统突然给报了个警,说是线上那个阿三的支付请求被拒了。运营小姑娘吓得赶紧打电话给我:“喂,老王啊,这单子咋被拒了啊?客户可是贵宾,搞坏了关系咋整啊?”

一打开监控面板,马上就明白了。这笔5万的订单,用的是个刚注册3小时的账号,IP还从印度蹦到了新加坡,这不明显是个高危单嘛。风控系统直接给切了,省了不少事。

风控系统的实时决策

说白了,风控系统就是给每笔交易打分,看看这笔钱该不该让它过。咱们支付场景风控最重要的就是实时性,必须在几百毫秒内拿出结论。就跟打王者荣耀似的,你反应慢了,这钱就被人薅走了。

def risk_score(transaction):

score = 0

# 账号维度

if transaction.account_age < timedelta(hours=24):

score += 50

# IP维度

if transaction.ip_country != transaction.register_country:

score += 30

# 行为维度

if transaction.amount > 10000:

score += 20

return score >= 80 # True表示高危

特征工程才是硬核

光有规则可不够,得把特征工程做好。比方说一个IP,你得知道它是不是代理IP、是不是数据中心IP,这都需要提前准备好数据。

class IPFeature:

def __init__(self):

self.proxy_ips = redis_client.smembers('proxy_ips')

def get_ip_risk(self, ip):

if ip in self.proxy_ips:

return 100

return self._check_datacenter(ip)

温馨提示:特征数据要定期更新,不然容易被黑产钻空子。咱们一般是每天凌晨更新一次IP库。

实时计算引擎

实时计算说起来容易做起来难。一个用户一秒内可能发起好几笔交易,这时候就得用流式计算了。

from pyflink.datastream import StreamExecutionEnvironment

from pyflink.table import StreamTableEnvironment

env = StreamExecutionEnvironment.get_execution_environment()

t_env = StreamTableEnvironment.create(env)

def process_transaction(transaction_stream):

return transaction_stream \

.key_by(lambda x: x.user_id) \

.window(TumblingProcessingTimeWindows.of(Time.seconds(1))) \

.process(RiskWindowFunction())

规则引擎的设计

规则多了就乱,得有个好设计。咱用决策树的思路,把规则分层。

class RuleEngine:

def __init__(self):

self.rules = {

'account': AccountRules(),

'transaction': TransactionRules(),

'device': DeviceRules()

}

def evaluate(self, context):

results = []

for rule_type, rule_engine in self.rules.items():

score = rule_engine.run(context)

results.append((rule_type, score))

return max(results, key=lambda x: x[1])

现在再来看开头那个案例。系统发现这是个新账号(+50分),IP和注册地不一致(+30分),交易金额还不小(+20分),总分100分,妥妥的高危。这种单子要是放过去,搞不好第二天钱就不见了。

这套系统上线后,欺诈率下降了60%,误杀率只有2%。最爽的是,再也不用半夜被运营打电话了,可以安心睡大觉了。

Image

轻触「在看」,推荐至看一看

在看