尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

看广告激励积分兑换系统设计与实战:从架构到防刷

看广告激励积分兑换系统设计与实战:从架构到防刷 看广告激励积分兑换说白了就是用户看一条广告你给他账户里加点积分攒到一定数量就能换礼品、换现金红包、换平台券。听起来简单但真要把这套东西从零搭起来还要同时跑通APP端、PC管理后台再对接多家广告联盟里面可以踩的坑比想象中多得多。这篇文章我就以一个实际做过的项目为主线把这类系统的整体设计思路、广告联盟对接细节、积分与兑换的落地实现以及管理后台该做什么功能原原本本梳理一遍。不管你是准备自己开发一套还是公司要立项做类似的积分激励产品这都算一份可以直接拿来做技术方案参考的实战笔记。1. 系统整体架构与核心模块拆解1.1 为什么选择“APPPC管理后台”双端模式很多人在规划这类系统时容易犯一个错一开始只做了APP端觉得用户看广告、积分增长、兑换礼品都能在手机里完成后台暂时用个简易网页顶一顶。等真上线就会发现运营人员每天要盯的数据、要调的配置、要处理的异常订单根本不是简易后台能扛住的。我这边最终确定的方案是双端并行开发APP端负责用户交互PC管理后台负责业务管理和数据监控。这两个端不是简单的“手机版网页版”而是各司其职。APP端核心职责有三个承载广告播放、展示任务列表、处理积分兑换流程。用户在APP里能看到今天有哪些广告任务可以看看完一条广告金币到账然后去积分商城挑东西兑换。整个链路要在APP内闭环完成尽量不跳转第三方页面减少用户流失。PC管理后台则承担完全不同的工作广告位配置、联盟渠道参数下发、积分规则调整、用户列表与风控、兑换订单审核、财务报表导出。这些操作在手机上做非常痛苦尤其是批量导入商品、批量审核订单、查看多维度的数据报表必须用PC端才能高效完成。补充一点这两个端的数据必须通过一套统一的服务端API来交互千万不能APP直连数据库也不能在管理后台里写死业务逻辑。我见过一些小团队图省事把积分规则写在APP本地结果每次改规则都要发版运营被折腾得够呛用户也在旧版本上看到和新版本不一致的任务价格。1.2 多广告联盟支持的设计思路为什么系统要支持多广告联盟很简单单一联盟的广告填充率、单价波动会直接影响你的收益。今天某家联盟eCPM高明天可能就掉得厉害如果只接入一家只能被动接受。而同时接入多家联盟就可以根据广告位的实时收益情况做流量分配哪个联盟出价高就把流量多分给它一点。具体到架构设计上多联盟支持不是简单地在APP里塞几个SDK而是要做一层广告聚合管理层。我采用的是“服务端下发客户端回调”的方案管理后台维护一个广告渠道池每个渠道对应一家广告联盟包含渠道名称、AppKey、广告位ID、状态、权重等字段。APP端启动时或进入任务页时从服务端拉取当前可用的广告位配置拿到广告位ID后再去请求对应联盟SDK。广告播放完成后联盟SDK回调给APPAPP再调用自己的服务端接口上报这次广告观看事件服务端完成积分发放。这层抽象最大的好处是新增一家广告联盟时不需要改动APP端的业务主流程只需要在服务端加渠道配置在APP端适配新SDK的桥接层即可。而且可以通过后台调整权重决定流量优先走哪家联盟这在运营上非常实用。1.3 积分体系和兑换闭环积分是整个系统的血液。我把它设计成一套独立的账户子系统而不是和用户表耦合在一起。每个用户对应一个积分账户账户里记录总积分、可用积分、累计获得、累计消耗四个关键数字。所有积分变动都写入流水表每一笔流水都有唯一的流水号、变动类型、关联订单号或广告记录ID。积分变动类型我分了几类广告奖励、签到奖励、兑换扣减、后台补偿、异常扣回。为什么非要分这么细因为后面排查问题、对账、做风控都要依赖流水。举个实际例子有用户投诉说看完了广告积分没到账如果你只有总积分字段根本查不出来问题到底出在哪一步但如果你有一条广告观看记录和一条积分流水把时间戳、广告ID、联盟回调ID摆出来问题很快就能定位到是联盟没回调还是自己服务端逻辑出了问题。兑换闭环则涉及商品管理、兑换订单、发货处理、售后回退。用户在APP端提交兑换申请生成订单进入待审核状态管理后台审核通过后如果是实物礼品就走发货流程如果是话费或红包就调对应供应商接口如果是虚拟卡密就直接展示卡密信息。每一步订单状态的变化都要有记录方便后续追溯。2. 广告联盟接入关键流程与回传校验2.1 移动端广告SDK接入流程接入广告联盟SDK是整条链路中技术细节最多、最容易出问题的一环。不同联盟的SDK接入方式大同小异但绝对没有一个能让你十分钟搞完的。我以国内常用的一家联盟为例说明完整接入流程第一步在联盟官网创建应用填写APP名称、包名、签名MD5等信息平台审核通过后会生成一个AppKey。这里提醒一下签名MD5一定要用正式签名文件来算不能用debug签名不然后面上线后广告拉不到或者收益不计排查起来非常痛苦。第二步下载对应SDK按照官方文档把aar或jar包引入项目。如果APP工程是使用Gradle构建的直接在build.gradle里添加依赖即可。要注意SDK版本尽量使用最新稳定版旧版本可能存在已知崩溃或广告加载失败的问题。第三步在AndroidManifest.xml里声明必要的权限和组件。广告SDK一般需要INTERNET权限、网络状态权限有些还会申请定位权限或设备信息权限。这里要特别注意隐私合规如果APP的目标用户在国内必须按照相关要求做隐私弹窗说明并且在用户同意之前不要初始化广告SDK。第四步在Application的onCreate里初始化SDK传入AppKey。初始化完成后再去加载广告。有些联盟提供“初始化后自动加载广告”的配置但实际建议不要依赖这个功能最好是自己控制预加载逻辑在用户进入任务列表前就提前加载好几条广告减少用户的等待时间。第五步实现广告展示和回调监听。激励视频广告的核心回调有加载成功、加载失败、展示成功、播放完成、发放奖励、关闭广告。其中“播放完成”和“发放奖励”是关键前者代表用户看完后者代表联盟认可这次观看。我通常会在发放奖励回调里触发服务端上报为了保险还会在播放完成时也上报一次服务端做去重。第六步测试与审核。每个联盟都有测试模式可以在后台设置测试设备用测试广告位进行调试。等到正式发布前再切到正式广告位。2.2 服务端回调验证与防抖逻辑这一段是整个系统防刷的核心也是很多新手容易忽略的地方。如果APP端点击“上报观看完成”就直接加积分那刷子能通过伪造请求或者Hook SDK回调来无限刷积分。我的做法是服务端必须对每次广告完成事件做二次验证。具体拆成两层第一层是本地签名参数校验。APP端在上报广告完成时携带以下参数用户ID、广告位ID、联盟渠道ID、联盟返回的交易ID、播放时长毫秒、客户端时间戳、加密签名。加密签名用AppSecret对上述参数按约定规则拼接后做HMAC-SHA256生成。服务端收到请求后先验签验签通过再进入下一步。第二层是联盟服务端回调验证。几乎所有主流广告联盟都支持服务端到服务端的回调也就是广告完成后联盟服务器会直接调用你配置的回调URL把交易信息和奖励信息推送过来。我强烈建议不要只信客户端上报一定要做S2S回调服务端以S2S回调为准发放积分。这里有个实际经验S2S回调的配置非常容易漏有些广告平台的回调URL需要去后台单独配置而且回传的字段名各家不一样有的是trans_id有的是out_trade_no有的是order_id。建议在开发阶段用一个统一的映射层把所有联盟的回调字段归一化存到一张广告回调记录表里。关于防抖我设置了几个规则同一用户对同一广告位的播放冷却时间比如至少间隔30秒。同一交易ID只能成功使用一次重复上报直接拒绝。单用户每日广告奖励次数上限比如普通用户每天最多50次超过后不再为该用户发放广告奖励。这个可以在管理后台灵活配置。通过这两个维度基本能挡住大多数基础的刷量行为。至于更高级的设备指纹风控可以放到后面迭代再考虑但核心的签名和S2S验证一定是最开始就要做的。2.3 广告位与任务类型设计广告位不是随便建一个就行的。在管理后台我为每个广告位做了独立配置包含广告位名称、所属渠道、广告类型、奖励分值、每日次数上限、是否启用、权重等信息。实际项目中我把广告位和“任务”这个概念区分开了。用户看到的是任务列表每个任务背后绑定一个广告位。比如“看视频赚5积分”这个任务实际上绑定的广告位是A联盟激励视频广告位A01。这样做的好处是运营可以在不开发的情况下自由组合任务。举个例子任务A看激励视频得5积分绑定A联盟广告位权重60%。任务B看激励视频得5积分绑定B联盟广告位权重40%。如果某天A联盟的广告填充率有问题运营直接把A任务停用用户看到的任务自动切到B不会中断广告收益。这就是多联盟支持在运营上的灵活优势。任务类型上主要有两种固定奖励任务和阶梯奖励任务。固定奖励就是看一次给固定积分适合大部分广告位。阶梯奖励则适合做活动运营比如当天看第一条广告得5积分第5条得15积分第10条得30积分。阶梯规则在管理后台配置好后下发到APPAPP根据用户当日已完成的任务次数动态展示奖励数值这种玩法对提升用户完成任务量的效果非常明显。3. 积分兑换系统的核心实现与风控策略3.1 积分账户与流水表设计积分账户表结构看起来简单但设计时需要考虑的东西不少。我的核心表结构如下关键字段用户积分账户表user_points_accountuser_id用户ID主键total_points累计获得积分available_points可用积分used_points累计消耗积分frozen_points冻结积分兑换申请提交后先扣减可用积分并冻结订单取消则返还updated_at更新时间积分流水表points_logid流水IDuser_id用户IDchange_type变动类型ad_reward、sign_reward、redeem_deduct、redeem_refund、admin_compensate、admin_deductchange_amount变动值正负号区分增加减少before_balance变动前可用积分after_balance变动后可用积分ref_id关联业务ID广告观看记录ID或兑换订单IDremark备注created_at创建时间这套设计解决了一个非常关键的问题任何积分变动都可追溯且可用积分永远等于总积分减去累计消耗这类衍生计算一眼可见。线上出现过一次用户反馈金币数量不对运维通过流水表一查发现是某个旧版本APP有并发请求导致同一广告重复发放了积分后来加了幂等键才解决。没有流水表这种问题查一个月都查不出来。3.2 兑换规则与商品管理兑换商城想做好不能只挂几个商品就完事。我建议在开发前就把商品类型、上下架逻辑、库存扣减方式定清楚。商品类型我分了三类虚拟卡密类话费卡、视频会员卡、电商购物卡。这类商品在后台录入卡密库存用户兑换后系统自动展示卡密信息同时标记该卡密已被使用。直充类话费充值、话费红包。这类需要对接供应商接口用户兑换后系统调用供应商API把手机号和面额传过去供应商完成充值后回调结果。实物类实物礼品。用户在APP端填写收货地址后台审核后走物流发货商家在后台填写快递单号。商品表字段基本都有商品名称、图片、所需积分、库存总量、已兑换数量、商品类型、供应商接口配置、状态上架/下架、排序权重、限兑数量每人/每时段。兑换规则的设置上有几个细节值得注意下单锁定库存用户点击兑换时系统先判断可用积分是否足够再判断库存是否充足最后生成预下单。预下单会锁定当前库存和积分如果用户未在有效期内支付或取消则自动释放。我选择的是“积分实时扣减”的方式即提交兑换申请时立即扣减可用积分避免后续环节积分不足的纠纷。防超卖每次扣库存都是在数据库层做条件更新即“UPDATE goods SET stock stock - 1 WHERE id ? AND stock 0”影响行数为0则提示库存不足。不要用先查询再更新的方式并发场景下会超卖。用户协议里还要写清楚兑换时效和售后政策比如“虚拟商品一经兑换概不退换”“实物商品七天无理由退货质量问题除外”等。这些提前说明可以省掉后续大量的客服压力。3.3 防刷与安全控制要点做积分激励系统防刷是上线前就必须考虑清楚的问题而不是上线后遇到问题了再打补丁。根据我的实践以下几块是必做的设备维度记录设备的IMEI需要权限、OAID、Android ID等标识同一设备注册多个账号会被风控标记。但要注意隐私合规不能在未经授权的情况下收集过多设备信息需要在隐私政策里明确说明收集内容和用途。行为维度监控用户的操作频率。比如一个用户一天之内完成广告任务的次数远超正常水平或者每次广告观看时长都精确地刚过最低时长这些都是风控信号。系统可以设置自动规则当用户单日累计积分获取超过阈值自动转入人工审核名单管理员确认无异常后再解除限制。请求维度接口层面做好限流。同一用户对积分发放接口的请求频率控制在合理范围比如每10秒最多1次。超过直接拒绝并记录日志。再叠加前面说的签名校验和服务端S2S回调刷子基本无从下手。我当时还做了一个比较有用的小功能管理后台的风控日志。把每一条被拦截的请求记录下来包括请求参数、来源IP、设备信息、拦截原因。这样运营和开发拿到日志就能快速判断是误拦截还是真实攻击不需要翻各种服务日志拼线索。4. PC管理后台的功能规划与落地细节4.1 数据看板核心指标怎么定义管理后台的数据看板是整个系统的“仪表盘”运营人员每天打开后台第一眼就要看到的关键数据我总结下来有这几个今日活跃用户数DAU当天有登录或任务行为的用户数。今日广告观看次数所有用户当天完成的广告观看总数。今日广告收益预估根据联盟后台的单价估算出的收益这个数字会有延迟但可以作为趋势参考。今日新增积分发放量广告奖励积分总和。今日兑换订单数及消耗积分用户总共兑换了多少单花了多少积分。这些数据要支持按时间维度筛选今日/近7日/近30日最好还能按广告渠道维度拆解。比如运营想比较A联盟和B联盟今天的收益表现就要能看到横向对比。对于收益数据我有两个建议。第一不要对接联盟后台的实时收益API因为大部分联盟的收益数据都有数小时或一天的延迟实时拿到的数据本身就不准。第二自己服务端统计的收益只能作为参考最终结算以联盟后台为准管理后台和联盟后台的数据差异是正常现象关键是每周或每月做一次整体对账。运营看板之外还要给开发者或系统管理员留一个“时间趋势图”。比如展示每小时广告观看次数和积分发放量发现异常波峰时可以去排查是否存在刷量。4.2 用户管理与兑换订单审核用户管理模块除了基础的搜索、查看用户详情、禁用用户更重要的是人工干预能力。我常用的操作包括调整用户积分后台可以手动给用户增加或减少积分但要填备注原因。所有调整都会生成一条积分流水。用户拉黑对确认的刷子用户一键禁用广告任务和兑换功能但保留登录权限。查看用户明细将用户的注册时间、设备信息、广告观看记录、积分流水、兑换记录整合到一个页面方便客服处理投诉时快速了解用户全貌。兑换订单审核是管理后台的高频操作。对于虚拟卡密和直充类商品一般配置成“自动发货”用户兑换后系统即时处理但对于实物类商品必须人工审核。审核页要把订单信息、用户信息、收件地址放在一屏内审核员看到之后直接点通过或驳回。驳回时必须选择原因地址不完整、疑似刷单、库房缺货等这个原因会推送给用户APP端的通知中心。这里还要提一个细节订单状态的定义要清晰。我用的状态机是待支付→已扣积分/备货中→已发货→已完成或者是已取消。任何状态下系统都要能回滚积分特别是“发货失败”的场景例如供应商接口报错需要自动把积分退还给用户并生成退款流水。4.3 广告渠道与财务结算模块广告渠道管理是PC后台的重头戏。每个联盟渠道在后台都对应一条记录字段包括渠道名称、AppKey、结算周期、今日预估收入、本月累计收入、状态等。财务结算模块要解决的问题比较实际如何知道你这个月从联盟平台收了多少钱应该给多少积分对应的商品/现金出去毛利是多少所以我做了一张“月度结算报表”自动从广告观看记录里汇总出当月的广告收入预估再汇总出当月积分兑换消耗情况。运营人员月底拿着这份报表去和联盟后台的金额做比对误差在合理范围内就没问题。报表导出的功能一定不能少。运营每天都有导出数据的需求Excel格式是最稳妥的。我实现了按时间范围导出广告数据明细、用户积分明细、兑换订单明细三个功能格式统一为xlsx且列字段经过仔细排列直接就能用透视表分析。5. 常见问题与线上排查技巧实录5.1 广告加载失败与eCPM过低广告加载失败是最常见的问题而且原因五花八门。我总结下来大概有几类网络问题用户所在网络环境无法访问广告联盟的广告服务器比如某些地区网络限制较多或者是用户开了某种网络代理工具。这类问题可以通过APP端的网络诊断信息辅助判断。SDK初始化失败AppKey错误、包名不匹配、签名不对都会导致初始化失败。这类问题在开发阶段很容易发现上线后如果出现大概率是渠道包和正式包混淆时签名配置没处理好。广告位冲突同一广告位ID在后台配置了多种广告类型或者同一个广告位ID被多个APP使用也会导致请求失败。排查时先确认广告位ID在联盟后台的配置和应用内配置一致。关于eCPM过低我要说一句实在话eCPM和用户群、广告类型、投放地区、时间周期都有很大关系系统能做的优化有限。但可以从运营层面想办法比如把任务列表里的广告位做成混合类型激励视频插屏开屏通过实时收益监控把流量倾向于eCPM更高的联盟。5.2 用户操作被风控误伤这里想多说一句风控系统不能只做“猎人”也要给“误伤”留退路。我就遇到过真实用户因为网络波动导致单日完成了大量广告任务被系统自动限制兑换功能。用户一脸懵地来找客服。处理这类问题的思路是风控不直接处罚用户只做标记。系统判定异常时先把用户加入观察列表同时限制高价值的兑换比如现金红包但正常的日常任务加成不受影响。运营人员看到标记后通过后台核查具体流水如果确认是误判一键解除标记即可。另外所有风控规则在后台都要支持动态配置比如单日广告奖励上限、兑换门槛、异常行为触发条件等。不要把这些规则写死在代码里否则每次调整都要发版灵活性就很差。5.3 积分兑换并发与订单支付问题并发问题最典型的场景是用户同时提交多个兑换申请或者同一商品在多人抢兑时出现库存和积分扣减不一致。解决思路是依赖数据库事务和锁。我在兑换接口中使用了数据库行锁或乐观锁确保同一用户的积分操作串行执行。具体做法是在积分扣减时使用“UPDATE user_points_account SET available_points available_points - cost, used_points used_points cost WHERE user_id ? AND available_points cost”这样的条件更新如果影响行数为0说明积分不足或账户不存在则直接返回失败。在库存扣减时同样用条件更新。两个更新都成功后再插入兑换订单全部放在一个事务里。如果其中任一步失败事务回滚保证不会出现“积分扣了但订单没生成”或者“库存减了但积分没扣”的脏数据。还有一点是关于支付通道的。如果系统涉及“付费抽奖”或“积分充值”这类需要真实支付的功能最好别自己开发支付模块直接接入成熟第三方支付SDK。我之前见过有人自己攒了个简易支付模块结果在等保测评和合规审查时花了很多精力补齐资质得不偿失。写在最后的实战建议这套系统从立项到上线整个周期大概是两个半月投入的开发人力是两名后端、一名Android开发、一名前端再加上我兼职做了一部分产品设计。对于一个没有历史包袱的新项目来说这个节奏算是比较顺利的。我个人在实操过程中最大的体会是看广告激励积分兑换本身并不复杂真正花时间的是那些“看不见的边角”。比如广告联盟的S2S回调对接、积分账户的幂等设计、兑换订单的状态回滚、后台报表的字段梳理这些内容在需求文档里往往只有一句话但开发起来特别耗费精力。所以如果你正在规划类似项目我的建议很简单先把积分账户和流水表设计好这是所有业务的地基第二个就是把广告回调验证做成端到端闭环这决定了系统会不会被薅羊毛第三个就是把PC管理后台当成一个正经产品来做别把它当成一个“临时工具”运营效率的提升全看这里。最后再分享一个小技巧不管接入哪家广告联盟一定要把测试环境的数据和生产环境的数据从MySQL层面就隔离开千万别混着用。广告联盟的测试广告位和生产广告位是独立的后端配置的渠道参数也要跟着环境走。我就是早期因为测试环境和生产环境共用了同一套配置结果在测试环境里点了好几次广告居然把生产环境的广告预算消耗了一部分虽然金额不大但排查了很久才定位到问题。
返回列表