当移动支付遇上风控系统:实时反欺诈的实现
点击蓝字 关注我们
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%。最爽的是,再也不用半夜被运营打电话了,可以安心睡大觉了。
轻触「在看」,推荐至看一看
在看