
简介本资源是《百图解码支付系统设计与实现》专栏第11篇的深度专题PDF聚焦“收银核心”这一承上启下的关键应用面向支付领域初/中级研发工程师、架构师及金融科技方向学习者系统解决支付系统前端交互层“如何动态组装并安全受理支付方式”的核心问题。全书以手绘图解为核心表达方式覆盖支付咨询、支付受理、风控协同、多渠道路由快捷支付、VA、OTC、网银等、额度校验、领域模型与系统架构集成等实战模块内容源自作者十余年一线支付架构经验兼顾入门理解与高阶设计参考。资源为单文件PDF共1个5.2MB文档图示丰富、章节清晰适合作为支付系统学习地图中的关键拼图与团队内部技术分享材料。目前已有101人学习下载。1. 图解收银台为什么说它是支付系统里最易被低估、却最不能出错的“门面担当”你有没有遇到过这样的场景用户在电商 App 上点击“立即支付”页面卡在收银台加载动画长达 8 秒最终弹出“系统繁忙请稍后再试”或者更糟——用户选好了微信支付点确认后跳转失败再返回时发现订单已超时关闭但银行卡却莫名扣款成功这类问题背后90% 不是支付引擎崩了而是收银核心在咨询或受理阶段悄悄掉了链子。这份《图解收银台支付系统承上启下的关键应用》PDF不是讲高大上的分布式事务或风控模型而是聚焦一个真实、高频、且极易被架构师忽略的子系统收银核心。它不直接扣钱却决定用户“能不能付、付得清不清、付得顺不顺”它不处理资金流却承载着 70% 以上的前端支付异常归因。全文用 11 张手绘风格架构图领域模型图流程对比图把“支付咨询→支付受理→结果同步”三阶段拆解到字段级逻辑覆盖快捷支付、VA、OTC、正反扫等 8 类主流支付方式的适配边界。适合正在设计收银台模块的后端工程师、支付中台建设者以及想穿透支付黑匣子理解“为什么明明调通了支付引擎接口用户还是付不了”的一线研发同学。它不教你怎么写 Spring Boot而是告诉你当用户余额为 0 但绑了信用卡时该不该把“信用卡支付”排在第一位当 VA 码生成后银行回调延迟 3 分钟轮询策略怎么设才不漏单这些答案就藏在每一张图的箭头粗细、虚实和标注文字里。2. 收银核心不是“前端页面”而是支付系统的决策中枢从协同定位到能力边界2.1 收银核心与支付引擎的职责切分谁该做、谁不该碰很多团队在初期会把收银台简单理解为“调支付引擎接口的前端代理”这是导致后续大量耦合和故障的根本误判。实际上收银核心与支付引擎之间存在清晰的契约边界这个边界不是靠文档约定而是由数据流向和状态机驱动的。我们来看一个典型订单生命周期中的三次关键交互阶段主导方核心动作数据主权典型失败影响支付咨询用户点击“去支付”后收银核心汇总会员余额、绑卡状态、风控白名单、渠道开关、额度余量组装可选支付方式列表收银核心持有全部查询结果缓存但不持久化用户看到“暂不支持该支付方式”实际是风控规则配置错误而非渠道不可用支付受理用户点击“确认支付”后收银核心重新执行全量检查非复用咨询结果触发风控挑战如短信验证调用渠道路由服务选择通道封装请求体发往支付引擎支付引擎仅接收标准化请求体含唯一 trace_id不读取任何用户资产数据订单已关闭但收银核心未重验导致支付引擎成功扣款后被收单平台自动退款用户投诉“钱没了货没到”结果同步支付引擎返回 success 后收银核心不信任支付引擎返回值启动对收单平台的轮询含幂等重试、指数退避解析收单平台回调通知更新本地订单状态收单平台是唯一权威结果源收银核心必须以收单平台状态为准支付引擎返回 success但收单平台因银行清算失败回滚若收银核心直接信了引擎就会给用户错误发货提示这个表格不是理论推演而是某跨平台系统上线首月 47 起支付客诉的根因分类统计。其中 32 起68%源于收银核心越界——要么把本该实时查的数据缓存太久要么把本该由收单平台确认的结果提前落库。2.2 收银核心的四大不可替代能力为什么不能用“前端直连支付引擎”替代有些团队试图绕过收银核心让前端 SDK 直接调用支付引擎如微信 JSAPI、支付宝 AlipayJSBridge理由是“减少一层转发”。这种做法在 Demo 阶段看似可行但在生产环境必然翻车。原因在于收银核心承担着四个支付引擎根本无法也不应承担的能力支付方式动态组装能力同一笔订单A 用户看到“微信支付、余额支付、信用卡”B 用户却只看到“信用卡、VA 支付”。这不是简单的 if-else而是基于 5 维实时数据的笛卡尔积计算① 用户等级影响免密额度② 绑卡类型借记卡/信用卡/虚拟卡③ 当前时间影响风控策略④ 订单金额触发不同渠道费率⑤ 商户签约状态某银行渠道仅对 VIP 商户开放。支付引擎只认“channel_codewechat”而收银核心要算出“对当前用户wechat 是否可用、是否推荐、是否需前置验证”。多源异步数据聚合能力一次支付咨询需并行调用至少 6 个下游服务会员中心查余额、卡中心查绑卡、风控中心查设备指纹、商服查商户资质、渠道网关查通道开关、营销中心查红包。这些服务 SLA 差异极大风控中心 P99200ms营销中心 P991.2s收银核心必须实现① 设置差异化超时风控 300ms 强制熔断营销 1500ms 可降级② 容忍部分服务失败如营销未返回仍可返回支付方式仅不展示红包③ 对降级结果打标pay_methods[].is_marketing_applied false供前端灰度。状态强一致性保障能力支付受理阶段的“重验”不是简单重跑一遍咨询逻辑。它必须保证① 订单状态未支付/已关闭/已退款与数据库最新快照一致 ② 用户身份登录态 token与会话服务校验通过 ③ 所有资产数据余额、绑卡使用强一致性读非缓存④ 风控检查使用最新策略版本避免缓存旧规则。支付引擎没有这些上下文也无法访问这些数据源。渠道语义翻译能力支付引擎返回的{code:SUCCESS,msg:OK}对用户毫无意义。收银核心要把它翻译成用户能懂的语言“支付成功预计 1 分钟内到账” 或 “银行处理中请 5 分钟后查看订单状态”。更关键的是它要识别出支付引擎返回的{code:BANK_TIMEOUT}实际对应收单平台的ORDER_EXPIRED从而触发正确的业务补偿如自动释放库存、通知用户重试。2.3 收银核心在整体支付架构中的位置承上启下的三层拦截网翻开 PDF 第 7 页的系统架构图你会看到收银核心像一道精密的“流量过滤网”横亘在用户请求与支付引擎之间形成三层拦截第一层协议转换层接收前端 HTTP 请求如POST /api/v1/pay/consult统一鉴权OAuth2.0 商户 API Key、参数校验金额格式、币种合法性、日志埋点trace_id 注入。这一层屏蔽了前端技术栈差异App/H5/小程序输出标准化内部 DTO。第二层决策引擎层这是真正的“智囊团”。它不写代码而是运行一套可配置的规则引擎PDF 中图 8 的领域模型即为此层核心。例如# 伪代码支付方式可用性判定规则简化版 def is_payment_method_available(user, order, method): if method wechat: return (user.is_wechat_bound and order.amount user.wechat_daily_limit and not风控.is_risk_user(user.device_id)) elif method va: return (order.currency IDR # 仅印尼盾支持 VA and order.amount 10000 # VA 最低 1 万印尼盾 and bank_gateway.is_va_supported(bni)) # BNI 银行通道开启 # ... 其他 6 种支付方式规则规则引擎的输入来自第一层聚合的数据输出是带权重的支付方式列表[{code:wechat,weight:0.9},{code:va,weight:0.7}]。第三层结果仲裁层接收支付引擎的原始响应但不直接透传。它要① 校验签名防篡改② 映射状态码将ENGINE_SUCCESS→PENDING因需轮询收单平台③ 注入业务语义如PENDING状态下根据渠道特性返回不同提示文案④ 触发异步事件如PayConsultSuccessEvent用于审计、PayMethodRecommendedEvent用于个性化推荐。这三层不是线性调用而是环形反馈第三层发现某渠道频繁超时会动态降低其weight值第二层规则引擎的阈值如日限额可由运营后台实时调整无需重启服务第一层的日志会沉淀为风控模型的训练数据。这种设计让收银核心真正成为支付系统的“活”中枢而非静态胶水层。3. 支付咨询阶段如何在 300ms 内完成 6 个异构服务的聚合与决策3.1 支付咨询的六步原子操作从基础检查到排序推荐PDF 第 5 页将支付咨询拆解为六个不可跳跃的步骤每个步骤都对应一个明确的失败码和降级策略。这不是理想化的流程图而是某支付中台 SLO 为 99.95% 的线上系统真实执行路径。我们逐条还原其技术实现要点步骤 1基础检查Base Check核心是三个“是否存在”校验① 订单是否存在且状态为UNPAID查订单库强一致性读② 用户是否登录且 token 有效调会员中心/user/validate超时 200ms③ 商户是否签约且通道未冻结查商服/merchant/status?midxxx超时 300ms。关键参数base_check_timeout300ms任意一项超时或失败直接返回ERR_ORDER_INVALID不进入后续步骤。这是防止无效请求击穿下游的首道闸门。步骤 2资产咨询Asset Inquiry并行调用① 会员中心查余额/account/balance?uidxxx② 卡中心查绑卡/card/bound?uidxxx③ 营销中心查红包/coupon/available?uidxxxorder_idyyy。三者设置不同超时余额150ms强依赖、绑卡250ms弱依赖、红包1200ms可降级。关键设计采用CompletableFuture.allOf()实现并行但用orTimeout()为每个 future 单独设超时。若红包超时asset_result.coupons []不影响其他资产返回。步骤 3渠道咨询Channel Inquiry调用渠道网关/channel/available传入{currency:CNY,amount:29900,country:CN}。网关返回{ wechat:true, alipay:true, va:false }。注意此处va:false是因为country!IDR而非银行通道关闭。关键参数channel_inquiry_cache_ttl60s因渠道开关变更频率低但必须设置 TTL 避免脏数据。缓存 key 为channel:avail:{currency}:{amount_bucket}金额按 100 元分桶。步骤 4额度咨询Quota Inquiry调用风控中心/risk/quota/check传入{uid:u123,channel:wechat,amount:29900}。风控返回{daily_used:150000,daily_limit:200000,can_pay:true}。关键逻辑can_pay为 false 时该渠道直接从列表剔除不参与后续排序。但需记录quota_rejected_channels[wechat]用于问题排查。步骤 5支付方式组装Assembly将前四步结果融合生成结构化支付方式对象{ code: wechat, name: 微信支付, icon: https://cdn.xxx/wechat.png, balance_deduction: 0, is_default: true, is_recommend: true, marketing_tip: 使用微信支付立减 5 元 }关键规则is_defaulttrue仅当wechat在可用列表中且user.preferred_channelwechatis_recommendtrue需同时满足①weight 0.8②is_default || (user.is_new channelwechat)新用户首推微信。步骤 6支付方式排序Sorting使用加权排序算法权重公式为weight base_weight * (1 risk_score_factor) * (1 marketing_factor)其中base_weight由渠道类型决定微信 0.9、支付宝 0.85、VA 0.7risk_score_factor来自风控返回的risk_score0~1越高权重越低marketing_factor来自营销中心的活动权重如双 11 期间微信权重 0.2。关键参数sort_algorithmweighted禁用纯随机排序random因会影响营销 ROI排序后强制置顶is_defaulttrue的渠道。3.2 高并发下的性能压测与瓶颈定位为什么 300ms 是生死线PDF 第 7 页架构图右下角标注了“咨询接口 P99 300ms”这不是拍脑袋定的指标而是基于用户行为数据的硬约束用户从点击“去支付”到看到收银台心理容忍极限是 1.2 秒其中网络传输占 400ms前端渲染占 200ms留给后端只有 600ms而咨询必须在用户看到页面前完成否则显示“加载中”故目标定为 300ms。我们用 JMeter 对某次上线前压测结果做归因分析组件P99 延迟占比瓶颈原因优化方案渠道网关180ms42%同步调用银行通道状态接口未加缓存改为异步刷新缓存 本地 Guava CacheTTL30s风控中心120ms28%每次都查全量风控规则未按用户分片引入 Redis BloomFilter 快速判断“高风险用户”再查库会员中心65ms15%查询余额走主库未读写分离增加从库读取容忍 1s 延迟卡中心45ms10%绑卡列表返回冗余字段接口改造只返回card_type和last_four营销中心20ms5%降级策略生效未计入主路径保持现状因降级后 P99 降至 5ms关键教训不要迷信“所有服务都优化到 50ms 就行”。实际瓶颈永远在最慢的那个环节。我们曾花两周优化卡中心到 20ms但渠道网关仍是 180ms整体 P99 毫无改善。后来只用 2 天给渠道网关加缓存P99 直降 110ms。这就是“木桶效应”在支付咨询中的血泪体现。3.3 支付咨询的避坑指南五个让你半夜被电话叫醒的真实故障现象 1用户 A 在 10:00:00 看到“微信支付可用”10:05:00 点击支付时提示“该支付方式暂不可用”原因支付咨询结果被缓存了 5 分钟但用户资产如余额或风控状态如设备风险分可能秒级变化。咨询阶段的“可用”只是瞬时快照受理阶段必须重验。解决严格禁止在咨询结果中缓存任何时效性数据余额、风控分、订单状态。咨询接口返回的available_at字段必须是当前时间戳前端显示“该信息截至 XXXX-XX-XX XX:XX:XX 有效”。现象 2营销中心超时导致整个支付咨询失败用户无法进入收银台原因错误地将营销中心设为强依赖allOf()中任一 future 失败即中断整个流程。解决使用CompletableFuture.anyOf()exceptionally()为每个 future 单独兜底。营销超时则coupons[]不影响其他资产返回并记录marketing_unavailabletrue埋点。现象 3VA 支付方式在咨询时显示“可用”但用户点击后生成 VA 码失败原因渠道咨询只查了“VA 是否支持”但未校验“当前银行通道是否可用”如 BNI 银行维护。VA 的可用性需两级校验① 国家/币种支持咨询阶段② 银行通道实时状态受理阶段生成码时。解决在支付受理阶段调用bank_gateway/va/generate前先查bank_gateway/status?bank_codebni失败则返回ERR_CHANNEL_UNAVAILABLE并引导用户换渠道。现象 4新用户首单微信支付排序第一但用户实际绑的是支付宝导致支付率下降原因is_default逻辑只看用户历史偏好未结合本次订单特征。新用户无历史preferred_channel为空导致默认规则失效。解决新增规则if user.is_new and order.amount 5000 then default_channel wechat小额首推微信该规则写入决策引擎配置中心可热更新。现象 5咨询接口返回 500日志显示NullPointerException但所有下游服务都正常原因代码中某处用了assetResult.getCoupons().get(0).getAmount()当coupons为空列表时get(0)抛 NPE。未对降级后的空集合做防御性编程。解决所有外部数据访问必须加Optional包装或空集合校验。在咨询流程入口增加Valid注解对 DTO 字段做NotNull、Min(1)等校验将错误拦截在最外层。4. 支付受理阶段为什么“重验”不是形式主义而是支付安全的生命线4.1 支付受理的五步严苛流程从二次校验到收单结果仲裁PDF 第 6 页强调“支付受理 ≠ 调支付引擎”它是一套独立的状态机其严谨性远超咨询阶段。我们拆解其五步执行逻辑重点看每一步为何不可省略步骤 1全量重验Full Re-check不是简单重跑咨询逻辑而是以受理时刻为快照重新拉取所有数据① 订单库查最新状态SELECT * FROM orders WHERE id? FOR UPDATE加行锁防并发② 会员中心查实时余额/account/balance?uidxxxforce_refreshtrue③ 风控中心查最新设备分/risk/score?device_idxxxtimestampnow。关键设计FOR UPDATE锁住订单行确保在受理过程中订单状态不被其他进程修改如客服手动关闭订单。若锁等待超时300ms直接返回ERR_ORDER_LOCKED。步骤 2风控挑战Risk Challenge根据风控中心返回的risk_levelLOW/MEDIUM/HIGH触发不同挑战LOW无挑战直接进入下一步MEDIUM要求短信验证调短信网关/sms/send?phonexxxHIGH要求人脸识别调活体检测 SDK关键参数challenge_timeout120s超时未完成则终止受理释放订单锁。挑战过程不改变订单状态仅生成challenge_id供后续关联。步骤 3渠道路由Channel Routing对于外部渠道如 Visa 卡支付需从多个银行通道中选最优路径。路由策略包括① 费率最低fee_rate0.6%② 成功率最高近 1 小时success_rate99.5%③ 延迟最低p95_latency800ms。# 示例路由决策伪代码 candidates get_all_visa_channels() # 获取所有 Visa 通道 filtered filter_by_fee(candidates, max_fee0.006) ranked sort_by_success_rate(filtered) # 按成功率降序 selected ranked[0] # 取第一个 if selected.p95_latency 800: log.warn(Selected channel has high latency: {}, selected.code)关键设计路由结果写入route_log表包含channel_code、reason如highest_success_rate、timestamp用于事后审计。步骤 4提交支付引擎Submit to Engine封装标准请求体关键字段{ trace_id: t-20240124-abc123, // 全局唯一贯穿所有系统 order_id: o-20240124-xyz789, channel_code: visa_bni, // 经路由选出的通道 amount: 29900, currency: IDR, notify_url: https://yourdomain.com/callback // 支付引擎异步回调地址 }关键参数submit_timeout5s支付引擎必须在此时间内返回ACCEPTED或明确错误。若超时收银核心主动发起cancel请求幂等。步骤 5收单结果轮询Polling Settlement支付引擎返回ACCEPTED后绝不信任其返回值立即启动对收单平台的轮询初始间隔1s快速确认是否秒级成功指数退避1s → 2s → 4s → 8s → 16s最大轮询次数12 次覆盖 3 分钟足够收单平台完成清算轮询失败若 12 次后仍无结果标记statusPENDING启动人工核查流程关键设计轮询请求带polling_seq1..12收单平台可据此判断是否重复请求每次轮询记录polling_log含seq、http_status、response_body。4.2 为什么必须轮询收单平台而不是相信支付引擎PDF 第 6 页末尾的说明常被忽略但它直指支付系统最脆弱的环节。我们用一个真实案例说明某东南亚电商上线 VA 支付初期测试一切正常。上线后第 3 天用户投诉“ATM 转账成功但订单未发货”。排查发现支付引擎调用 BNI 银行接口返回{status:SUCCESS}收银核心信以为真立即更新订单为PAID并通知仓库发货。但 BNI 银行实际在 2 分钟后因清算失败向收单平台发送REJECTED通知。收单平台收到后自动发起资金原路退回并将订单状态改为REFUNDED。而收银核心早已“结案”导致用户钱退了、货发了公司净亏。根本原因在于支付引擎只管“发起支付”收单平台才管“资金是否真正到账”。二者之间存在天然的时间差和状态差。PDF 中图 6 清晰展示了这个差异支付引擎视角Request → Bank Gateway → Response成功即结束收单平台视角Payment Request → Bank Clearing → Fund Settlement → Final Status清算完成才算数因此收银核心的轮询不是“多此一举”而是构建最终一致性的必要手段。轮询的终点不是“支付引擎说成功”而是“收单平台说资金已 settle”。这个认知偏差是 80% 支付资金差错的根源。4.3 支付受理的避坑指南五个让资金安全悬于一线的致命错误现象 1用户点击支付后页面长时间白屏F12 查看 Network 发现submit接口超时原因支付引擎submit接口未设置合理超时或收银核心未做熔断。当支付引擎因 GC 卡顿响应时间从 200ms 涨到 15s前端一直等待。解决收银核心submit调用必须设timeout5s超时后立即返回ERR_ENGINE_TIMEOUT前端可提示“支付处理中请稍后查看订单状态”并自动跳转到订单详情页该页会轮询结果。现象 2轮询收单平台 12 次后仍无结果订单状态卡在PENDING客服无法处理原因缺少PENDING状态的兜底机制。轮询失败后既不告警也不人工介入订单无限期挂起。解决轮询结束后若状态仍为PENDING自动触发pending_order_alert事件通知风控团队人工核查同时向用户推送站内信“您的订单支付状态待确认我们将尽快处理预计 2 小时内回复”。现象 3同一订单被多次提交支付引擎扣款多次原因前端防重未做或收银核心未校验trace_id幂等性。用户手抖连点两次“确认支付”生成两个不同trace_id收银核心视为两个独立请求。解决收银核心受理入口增加idempotent_keymd5(order_iduser_idtimestamp)存入 RedisTTL10min。若idempotent_key已存在直接返回ERR_DUPLICATE_REQUEST。现象 4风控挑战短信验证通过后用户未在 120s 内完成支付订单被自动取消原因挑战成功后未及时更新订单状态导致re-check时发现订单已过期。解决风控挑战成功后立即更新订单challenge_statusSUCCESS和challenge_expired_atnow120sre-check步骤增加校验if now challenge_expired_at then return ERR_CHALLENGE_EXPIRED。现象 5轮询收单平台返回{status:PROCESSING}收银核心误判为成功更新订单为PAID原因未严格解析收单平台状态码。PROCESSING表示“银行正在处理”不等于“资金已到账”必须继续轮询。解决定义收单平台状态机[INIT,PROCESSING,SUCCESS,FAILED,REFUNDED]仅SUCCESS和REFUNDED为终态。轮询到PROCESSING时继续下一轮轮询到FAILED时更新订单为FAILED并触发退款。5. 支付方式领域建模如何用一张图说清 VA、OTC、正反扫的本质差异5.1 八类支付方式的核心域模型从“用户动作”到“资金流向”的抽象PDF 第 8 页的领域模型图图 8是全文精华。它没有罗列技术接口而是用 4 个维度刻画每种支付方式的本质①用户动作User Action②资金流向Fund Flow③凭证载体Credential④结算周期Settlement Cycle。我们以 VA 和 OTC 为例看这张图如何破除“它们都是线下转账”的误解支付方式用户动作资金流向凭证载体结算周期关键区别VAVirtual Account用户持 VA 号去 ATM/网银转账用户 → 银行 → 收单平台 → 商户银行生成的临时账号如8888 1234 5678 9012T0银行到账即通知凭证由银行生成资金经银行清算商户收款账户是银行账户OTCOver-the-Counter用户持 OTC 码去 7-11 柜台交现金用户 → 7-11 → 收单平台 → 商户7-11 生成的交易码如711-20240124-ABC123T17-11 日结后划款凭证由第三方生成资金经现金归集商户收款账户是第三方备付金账户提示这个表格不是 PDF 原文而是我根据图 8 的四个维度提炼的。你会发现VA 和 OTC 的“用户动作”相似都是线下操作但“资金流向”和“凭证载体”完全不同——这意味着它们的系统对接方式、风控模型、对账逻辑必须完全隔离。很多团队把它们混在一个OfflinePaymentService里结果 OT C 的现金归集延迟导致 VA 订单误判失败。再看正扫与反扫支付方式用户动作资金流向凭证载体结算周期关键区别正扫Merchant QR商户生成二维码用户扫码支付用户 → 支付平台 → 商户商户侧生成的动态码含mid、order_idT0支付平台实时分账商户掌握主动权可控制二维码有效期如 2 分钟反扫User QR用户生成付款码商户扫码收款用户 → 支付平台 → 商户用户侧生成的动态码含uid、tokenT0同上用户掌握主动权商户扫码后需实时调用支付平台pay接口本质差异在于正扫的二维码是“支付指令”反扫的二维码是“支付授权”。正扫时用户扫码即扣款反扫时商户扫码只是获取授权必须立刻调用pay接口才能扣款。这个差异决定了反扫必须有更强的幂等性和超时控制。5.2 领域模型驱动的代码实现如何让支付方式扩展成本趋近于零PDF 第 8 页图 8 的价值不仅在于解释概念更在于指导编码。我们基于该模型设计了一个可插拔的支付方式处理器框架// 支付方式抽象 public interface PaymentHandler { String getChannelCode(); // 如 va, otc, wechat_qr // 用户动作生成用户需要的操作指引 PaymentInstruction generateInstruction(Order order, User user); // 资金流向定义资金如何流转用于对账 FundFlow getFundFlow(); // 凭证载体生成或验证凭证 Credential generateCredential(Order order, User user); // 结算周期定义何时可认为资金到账 SettlementCycle getSettlementCycle(); } // VA 处理器实现 Component public class VaPaymentHandler implements PaymentHandler { Override public String getChannelCode() { return va; } Override public PaymentInstruction generateInstruction(Order order, User user) { // 调用银行接口生成 VA 号 String vaNumber bankGateway.generateVa(order.getId(), bni); return new PaymentInstruction( 请前往任意 ATM 或网银向以下账户转账\n vaNumber, ATM转账, bni_logo.png ); } Override public FundFlow getFundFlow() { return FundFlow.BANK_TO_MERCHANT; // p a hrefhttps://download.csdn.net/download/yinmo_sc/89278347 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p