SA 代客办单流程

1. 流程目标

SA 代客办单覆盖从门店准入到提交审批结果处理的前半段链路:

SA 登录 -> 选品试算 -> 客户验证 -> 资料采集 -> 提交进件 -> 审批结果处理

本流程结束后,订单进入签约、首付和放款阶段,详见 04-签约首付与放款到商户.md

2. 参与方

参与方职责
PocketBuy SA门店销售使用的代客办单前端
bns / bns-gateway前端入口、会话、订单草稿、流程编排
渠道商品域SA、门店、POS、商品 SKU、商户账户、IMEI 辅助能力
crsOTP、BVN/NIN、KYC、活体、人脸、征信等三方接入
res / fds政策预览、审批决策、人审、补件、拒绝、降级
fcs / pfs分期产品、试算、后续借据准备

3. SA 登录与准入

步骤说明MVP 判断
SA 输入账号密码SA 账号不开放注册必做
bns 校验登录态返回 token 和基础档案必做
查询 SA 授权门店校验 SA 是否可在当前门店办单必做
重置密码Settings 内直接改密,不发 OTPMVP 简化

SA 账号创建、禁用、门店授权可以先由渠道中心或人工数据维护完成,完整运营后台后置。

4. 选品、POS 与试算

能力口径
商品列表 / Hot Picks渠道商品域提供 SKU、品牌、型号、建议售价和推荐方案
POS 反查用于确认门店和销售场景
实际售价SA 可录入实际成交价
信贷政策预览风控根据门店、手机型号、售价等信息返回可售边界和金融产品等级,详见下方第 5 节
金融产品查询bns 用风控返回的金融产品等级调用 pfs,获取可选 payment methods 和 payment terms
分期试算SA 确认选择后,按最终 product_fee_id 试算单期应还、总利息和还款计划
IMEI 反查作为辅助能力,不作为试算硬前置

商品中心不承载风控政策语义;政策由 res/fds 动态计算,金融产品配置由 pfs 输出,试算由 fcs/pfs 输出账务口径结果。

4.1 产品匹配与试算

SA 确定门店和手机型号后,先调用风控政策预览。风控政策预览在原有可售边界基础上,需要额外返回一个金融产品等级;pfs 暂将该金融产品等级按“用户等级”处理,用于查询 pfs_cust_level_product 下的可售产品配置。

步骤调用输入输出 / 处理
1. 确定销售上下文PocketBuy SA门店、POS、手机型号、售价得到商品和渠道上下文
2. 风控政策预览bns -> res/fds门店、POS、手机型号、售价等返回可售边界和 financial_product_level
3. 查询金融产品bns -> pfsfinancial_product_level、商品价格、可选频率约束返回可用 product_id / product_fee_idpayment_methodspayment_terms、利率和费用配置
4. 前端展示bns -> PocketBuy SApfs 产品配置结果展示 payment methods 和 payment terms
5. SA 代客户确认PocketBuy SA客户选择的 payment method、payment term、首付确认最终 product_fee_id
6. 产品试算bns/fcs -> pfs最终 product_fee_id、售价、首付、分期本金返回单期应还、总利息、还款计划摘要、罚息配置
7. 草稿保存bns客户选择方案和试算结果保存最终产品配置和试算快照,继续客户验证和进件流程

SA 代客户确认选择后,product_fee_id 即为后续流程使用的最终金融产品配置。后续审批、签约、合同、还款计划、计罚息和贷后处理均以该 product_fee_id 对应配置为准。

4.2 草稿订单内的产品快照

草稿订单必须保存 pfs 返回并经 SA 确认的产品快照,用于后续审批提交、签约和账务建借据。

字段说明
financial_product_level风控政策预览返回的金融产品等级,pfs 暂按用户等级使用
payment_methodSA 代客户选择的还款频率或支付方式,如 weekly / monthly
payment_termSA 代客户选择的期限,如 16 / 24 / 32 / 3 / 6 / 9
product_idpfs 返回并最终确认的主产品 ID
product_fee_idpfs 返回并最终确认的子产品 ID,后续全链路锁定使用
pricing_snapshot利率、费用、单期应还、总利息、还款计划摘要、罚息配置、报价版本
pricing_confirmed_atSA 代客户确认最终产品方案的服务端时间

5. 信贷政策预览

5.1 业务目的

信贷政策预览发生在客户正式 OTP 和建单之前,用于告诉 SA 当前商品和售价下“是否可做、可怎么做”。它不是最终审批,也不生成授信结果。

首付区间、分期期数、价格上限不是商品固有属性,而是 (商品 + 价格 + 客户 + 渠道) 在当下风控策略下的动态计算结果。商品中心只提供商品属性和商品标识,不承载 min_dp_ratio / max_dp_ratio / price_cap / promo_term 等政策语义。

说明
触发页面PocketBuy SA 的 Calculate 页
调用方向PocketBuy SA -> bns -> res/fds
核心作用返回价格上限、首付区间、首付档位、可售边界和金融产品等级
不做事项不返回最终审批结论,不替代 fcs/pfs 费率试算,不创建订单

5.2 调用场景和触发时机

场景触发位置说明
catalog 选品商品选定 + 价格 onBlurproduct_id + price 取 DP 区间和 term 选项,渲染 Calculate 页
IMEI 扫码IMEI 反查回填品牌/型号 + 价格 onBlurproduct_id 时,用 device.brand + device.model + price 计算政策
商品变更SA 切换商品清空已渲染的首付和期数,重新触发政策预览
渠道变更SA 切换门店或 POS 场景变化重新触发政策预览,渠道分层参与策略计算

价格输入建议在 onBlur 时触发,不在 onChange 中做高频防抖调用。

5.3 入参与来源

入参来源必填说明
product_id商品目录路径二选一catalog 选品路径有;与 device 二选一
device.brandIMEI 反查二选一IMEI 路径必填
device.modelIMEI 反查二选一IMEI 路径必填
priceSA 输入现场实际售价,单位 NGN,不一定等于商品参考价
customer_id客户绑定结果已绑定客户时传;未绑定时为空,按默认策略计算
payment_method / frequencySA 选择或空weekly / monthly;可为空,由 pfs 产品配置返回可选项
channel_idPOS / 门店上下文渠道或门店标识,用于渠道分层

5.4 出参与页面使用

出参页面用途
policy_id本次政策计算记录 ID,保存到草稿,后续提交审批时关联追溯
policy_version政策版本号,用于审批追溯和防止口径漂移
price_cap价格上限;若售价超限,CTA 不可达
dp_min / dp_max控制首付输入范围
dp_tiers展示可选首付百分比档位,如 [30, 40, 50, 60, 70]
suggested_dp推荐首付,前端首次默认带入
financial_product_level传给 pfs 的金融产品等级;pfs 暂按用户等级处理
term_options可选分期期数边界;最终展示以 pfs 返回的 payment_terms 为准
promo_term推荐分期期数,前端首次默认带入

policy_idpolicy_version、入参回显、出参回显和命中的分层标签需要在风控侧形成 credit_policy_preview_log,供后续审批和问题追溯使用。

5.5 政策决策维度

维度说明
商品分层品类、品牌、型号、价格档位等商品属性
价格层级价格段决定首付区间倾向和期数上限
客户分层新户/复借、评分段、历史履约;MVP 可先按新户固定档位
渠道分层重点门店、一般门店、新接入门店等渠道策略

5.6 与 fcs/pfs 试算的关系

风控政策预览给“可售边界 + 金融产品等级”,pfs 根据该等级给出可选产品配置,fcs/pfs 再基于 SA 最终确认的 product_fee_id 生成账务报价。

步骤调用结果
1. SA 选品并输入售价PocketBuy SA -> bns获得商品、门店、SA、客户上下文
2. 政策预览bns -> res/fds返回首付范围、价格上限、政策追溯 ID 和 financial_product_level
3. 产品配置查询bns -> pfsfinancial_product_level 查询可用 payment_methods / payment_terms 和产品配置
4. SA 选择方案PocketBuy SASA 代客户选择 payment method、payment term、首付,确认最终 product_fee_id
5. 产品试算bns/fcs -> pfs按最终 product_fee_id 返回利率、单期应还、总利息、还款计划摘要和罚息配置
6. 草稿保存bns保存客户选择方案、政策版本、政策预览日志 ID、最终 pfs 产品配置和报价快照

pfs 匹配产品配置时,只使用风控政策预览返回的 financial_product_level 和商品金额等上下文。SA 代客户确认后,product_fee_id 即成为后续流程的最终金融产品配置。正式提交审批时,bns 传给风控的是“客户选择方案 + 政策预览结果 + 最终 pfs 产品配置和试算快照”,而不是只传前端草稿。

5.7 异常处理

错误码含义SA 端处理
POLICY_PRICE_OVER_CAP价格超出上限CTA 不可达,引导调价或走人工通道
POLICY_PRODUCT_NOT_ELIGIBLE商品不在政策范围内引导手动选品或拒单
POLICY_CUSTOMER_REJECTED客户层面已拒引导拒单或走人工
POLICY_UPSTREAM_UNAVAILABLE政策引擎不可达可按全局兜底默认展示,并标记降级;正式受理时必须再次校验
POLICY_PREVIEW_EXPIRED政策预览过期提交审批前重新调用政策预览
PRICING_FAILEDfcs/pfs 试算失败不允许进入 OTP / 建单,提示重试

6. 客户验证与草稿订单

步骤说明
发送客户 OTPbns 调 crs 发送短信验证码
校验 OTPcrs 校验结果回传 bns
检查手机号存量订单按客户手机号查询是否已有手机分期订单,并按订单状态判断是否允许继续
创建草稿订单bns 创建 Drafting 订单,绑定 SA、门店、商品和客户手机号
采集 BVN/NINbns 调 crs 做实时核验

手机号验证和订单创建建议拆成后端原子能力,避免一个接口同时承担 OTP 校验、客户建档、活跃订单检查和订单创建,降低失败补偿复杂度。

6.1 手机号存量分期订单检查(可申请分期能力的判断)

客户手机号 OTP 校验通过后、创建新草稿订单前,bns 必须按规范化手机号查询该客户是否已有手机分期订单。查询口径使用统一的国际格式手机号,例如 +234...,避免同一号码因 0 开头、本地 10 位、11 位或带国家码格式不同而绕过检查。

检查目标是阻止同一手机号在不合适的状态下重复办单,同时允许 SA 恢复尚未完成的草稿或补件流程。

已有订单状态是否允许继续新流程SA 端处理说明
无存量订单允许创建新的 Drafting 订单正常继续
Drafting不新建;允许恢复弹窗提示已有未提交订单,提供继续原订单入口避免重复草稿;进入原订单继续录入
FixRequired不新建;允许恢复弹窗提示已有待补件订单,提供补件入口补件重提后回到 Reviewing
Reviewing阻断弹窗阻塞,提示订单正在审批中,暂不能重复申请审批中不可重复进件
Approved阻断弹窗阻塞,提示已有审批通过订单,请先完成签约或取消原订单已通过待签约,不允许新申请
Signed阻断弹窗阻塞,提示已有已签约订单,等待首付或后续处理已签约,不能重复申请
Paid阻断弹窗阻塞,提示已有待交机/放款完成订单,不能重复申请交机前或放款完成后仍属于未完成订单
Completed允许创建新的 Drafting 订单历史订单已完成,可再次申请
Closed允许创建新的 Drafting 订单拒绝、取消、超时或异常关闭后可重新申请;是否因黑名单拒绝由风控决定

若同一手机号查到多笔订单,bns 先按“阻断优先”处理:只要存在 Reviewing / Approved / Signed / Paid 中任一订单,即弹窗阻断;否则存在 Drafting / FixRequired 时引导恢复对应订单;只有全部为 Completed / Closed 时才允许新建。

阻断弹窗必须是强阻塞弹窗,不允许 SA 关闭后继续当前新办单流程。弹窗至少展示:客户手机号、已有订单号、当前订单状态、下一步动作。对于可恢复状态,按钮文案使用 Continue ApplicationUpdate Application;对于阻断状态,仅提供 Got ItView Order

6.2 存量订单弹窗样式与英文文案

弹窗出现位置:客户手机号 OTP 校验通过后、创建新草稿订单前。若命中可恢复或阻断订单,页面停留在客户验证页,不继续创建新订单。

弹窗样式:

规范
弹窗类型居中 modal,强阻塞;遮罩层点击、返回键、右上角关闭均不允许绕过
图标可恢复订单使用 info 图标;阻断订单使用 warning 图标
标题18px / semibold,英文标题不换行优先;窄屏可两行展示
正文14px,展示客户手机号、已有订单号、当前状态和下一步动作
主按钮使用品牌主色;可恢复场景跳转原订单,阻断场景返回客户验证页
次按钮线框按钮;用于查看订单详情
底部提示12px 灰色说明,不展示技术错误码

通用信息字段:

字段展示文案
Customer phoneCustomer phone: {phone}
Existing orderExisting order: {order_no}
Current statusCurrent status: {status}
Next stepNext step: {next_action}

弹窗英文文案:

命中状态弹窗类型TitleBodyPrimary buttonSecondary buttonNext step
Drafting可恢复Continue existing application?This customer already has an unfinished application. Continue the existing order instead of creating a new one.Continue ApplicationView OrderContinue the existing draft application.
FixRequired可恢复Additional information requiredThis customer has an application that needs additional information. Please update the existing order and resubmit it.Update ApplicationView OrderUpdate the existing application and resubmit.
Reviewing阻断Application under reviewThis customer's application is currently under review. A new application cannot be created until the review is completed.Got ItView OrderWait for the review result.
Approved阻断Approved application existsThis customer already has an approved application. Please complete signing or cancel the existing order before starting a new one.Got ItView OrderComplete signing or cancel the existing order.
Signed阻断Signed application existsThis customer already has a signed application. Please complete the down payment or follow the existing order process.Got ItView OrderComplete the down payment or continue the existing order.
Paid阻断Order awaiting deliveryThis customer already has a paid order awaiting merchant payout, device delivery, or final confirmation. A new application cannot be created.Got ItView OrderComplete delivery and order confirmation first.

按钮行为:

按钮行为
Continue Application跳转到已有 Drafting 订单的下一待办步骤
Update Application跳转到已有 FixRequired 订单的补件步骤
View Order打开已有订单详情页,只读或按当前状态展示可操作入口
Got It关闭弹窗并停留在客户验证页;不得继续创建新草稿

7. 资料采集

资料类型MVP 处理
个人信息必填,支持分步保存
地址信息必填,字段按现有进件要求收口
工作与收入必填,作为风控输入
紧急联系人必填,至少保留姓名、关系、手机号;前端原型中的 Guarantor 在 MVP 内统一改为“紧急联系人”,不表达担保责任
照片 / 活体先做人脸照片质量检查,通过后再通过 crs 做活体和人脸比对,结果给风控消费
征信授权在进件提交前完成授权确认

草稿保存需要支持重复提交幂等。正式提交后,订单从 Drafting 进入 Reviewing

资料有效期口径:

资料MVP 口径
人脸/活体结果当天有效,按采集地业务日计算;跨日继续办单、补件或签约中断后重进时,需要重新采集客户人脸
其他资料本期不做自动复用;30 天内复用基本信息、收入、地址等资料放到 Phase 2 再考虑
照片来源全流程只允许实时拍摄或扫码,不允许从相册上传照片

如果用户二次申请订单,基本信息、收入、地址等信息都有的话,用户完成 OTP 验证后输入身份信息(BVN 或 NIN)后,直接进入活体验证 —— 本期不用实现,后续迭代时再考虑。

7.1 照片质量、活体与人脸比对

对应前端页面:/pocketbuy_sa/application/sign?orderId=preview&signStep=2&docs=0

活体认证入口采用“先质量、后比对”的顺序,避免把明显不可用的自拍照提交给活体或人脸比对供应商。

步骤处理通过条件失败处理
1. 自拍采集SA 引导客户现场拍摄自拍视频或自拍照,前端生成 selfie_ref;禁止从相册选择或上传已有照片图片可读取,分辨率和文件大小满足上传要求提示重拍,不消耗活体/比对次数
2. 人脸照片质量检查前端或 bns 使用本地检测能力先判断是否存在单人脸、脸部是否完整、姿态是否正向、眼睛是否睁开、脸部占比是否足够仅检测到 1 张主脸;脸部检测框未贴边;脸部像素满足阈值;头部偏转角在阈值内;眼睛睁开概率满足阈值提示“请保持正脸、光线充足、完整露出面部后重拍”,不进入比对
3. 照片基础质量评估对清晰度、亮度、过曝/欠曝、遮挡、模糊做质量闸门清晰度、亮度和曝光评分达到阈值提示针对性重拍,不进入比对
4. 活体检测bns 调 crs 对接活体供应商liveness_status=PASSED返回失败原因,允许在限额内重试
5. 人脸比对活体通过后,bns 调 crs 将现场自拍与 KYC/BVN/NIN 返回的证件照或 photo_ref 比对face_match_status=PASSEDface_match_score 达到风控阈值阻断或进入人审,按风控策略处理
6. 结果沉淀crs 返回质量、活体和比对结果引用,bns 保存到草稿订单结果可追溯,正式提交审批时纳入 third_party_results缺失时返回资料补齐

人脸/活体有效期:

规则说明
有效期录入的人脸/活体结果仅当天有效
跨日处理订单仍在 Drafting / FixRequired / Approved 等未完成阶段时,若人脸结果跨日,继续提交审批或签约前必须重新采集
签约中断签约流程中断后重新进入签约,必须重新采集客户人脸;合照也必须重新拍摄
其他资料个人信息、地址、工作收入、紧急联系人等 30 天内复用放到 Phase 2,本期不实现自动跳过

ML Kit 人脸检测能力调研结论:

评估项ML Kit 人脸检测是否直接支持MVP 使用建议
是否有人脸 / 人脸数量支持。API 可检测图片中的人脸并返回检测框可用于判断自拍是否有人脸、是否只有一张主脸
人脸完整度部分支持。可用人脸检测框、脸部轮廓点、关键点是否存在来间接判断可作为前置规则:检测框不得贴边,脸部轮廓点完整度达到阈值
姿态是否适合比对支持。返回 Euler X/Y/Z 角度可限制侧脸、仰头、歪头,要求正脸采集
眼睛是否睁开支持。分类能力可返回左右眼睁开概率可用于自拍质量提示,但不要等同于活体检测
清晰度不直接支持。官方只提示焦点差会影响准确性需要端上或服务端另做模糊检测,例如拉普拉斯方差、供应商质量分
明亮程度 / 过曝欠曝不直接支持需要另做图像亮度、曝光检测,或使用供应商照片质量能力
照片质量综合评分不直接支持crs 需沉淀内部质量结果;ML Kit 只作为人脸结构检测输入之一
人脸识别 / 人脸比对不支持。ML Kit 该 API 只做人脸检测,不识别具体人员比对必须走 crs 对接的人脸比对供应商
活体检测不支持完整活体认证活体仍走 crs 供应商;ML Kit 只做提交前质量闸门

24 小时重试规则:

规则说明
限额口径同一客户、同一草稿订单、同一活体认证场景,24 小时内最多发起 3 次活体/人脸比对尝试
不计入限额仅照片质量检查失败、未调用 crs 活体或比对供应商的重拍,不计入 3 次
计入限额已调用 crs 活体检测或人脸比对供应商,无论通过、失败、超时,都计入尝试次数;供应商明确未受理且无计费时可按配置不计入
超限处理返回 LIVENESS_ATTEMPT_LIMIT_EXCEEDED,前端提示 24 小时后再试或转人工处理
前端展示展示剩余可尝试次数,例如“今日还可认证 2 次”;每次进入活体前先查询当前限额
后端控制bns 以 customer_id + installment_order_id + scene 查询限额,crs 记录 attempt_countattempt_window_start_atnext_retry_at

8. 审批提交与结果处理

本节把审批业务口径、提交接口和回调处理放在一起。审批不同于第 5 节的信贷政策预览:政策预览只判断商品和价格可售边界,不改变订单状态;正式审批发生在客户资料采集完成后,会推动订单从 Drafting 进入 Reviewing,并最终进入 Approved / FixRequired / ClosedFixRequired 表示风险明确退回补充材料,SA 必须在原订单补件后重提。

8.1 正式提交审批

以@文哲提供文档为准。

8.2 审批结果回调

内容
调用方向res/fds -> bns
触发时点自动审批或人审完成
幂等键approval_request_id + decision_version
状态前置订单必须处于 ReviewingFixRequired 重提后的 Reviewing

回调字段:

字段必填说明
approval_request_id审批流水
decision_result见结果枚举
decision_at决策时间
reason_codes拒绝、补件、降级原因码,用来对SA展示
return_reason条件必填FIX_REQUIRED 时的 SA 可见总补充原因
required_materials条件必填FIX_REQUIRED 时的待补材料、每项补充原因和采集指引

结果枚举:

结果订单状态说明
APPROVEDApproved原方案通过
REVISED_APPROVED`Approved降级/调价通过,需要客户确认新方案
FIX_REQUIREDFixRequired需要 SA 在原订单补充风险指定材料后重提
REJECTEDClosed拒绝
EXPIREDClosed审批超时或方案失效

本期启用 APPROVEDFIX_REQUIREDREJECTED;降级报价仍不启用。

状态映射:

当前状态回调结果目标状态处理
ReviewingAPPROVEDApproved保存审批结果和报价快照引用
ReviewingREVISED_APPROVEDApproved标记 offer_type=revised,等待客户确认新方案
ReviewingFIX_REQUIREDFixRequired保存总补充原因、待补材料及其原因;置订单补件客户标记和轮次
ReviewingREJECTEDClosed保存拒绝原因
FixRequiredSA 补齐并重提Reviewing生成 submission_type=SUPPLEMENT 审批请求,携带补件客户标记、轮次和材料版本引用
Reviewing任意不变记录异常回调,不推进