跨境地址场景的难点不在地址本身,而在一笔业务里同时存在好几个国别角色。谁付钱、谁收货、商品从哪里发出、身份由哪一国签发,这四个答案经常不一样,而它们各自需要不同的格式、不同的校验、不同的单据。只留一个国别字段,分歧一出现就没有依据可查。
一笔订单里可能同时存在几个国别?
至少这几个角色可以两两不同。
- 付款方所在的国家和地区。
- 收货地址所在的国家和地区。
- 下单者注册或常住的国家和地区。
- 证件或身份信息的签发国家。
再加上商品发出地与结算主体所在地,一笔看似普通的订单可以同时牵涉好几个国家和地区。
这些角色之所以要分开,是因为它们驱动不同的下游动作:配送要看收货地,单据与费用要看付款方,身份核验要看证件签发国,而业务归属判断往往要看注册地。
把它们压成一个「国家」字段,短期看不出问题,直到出现第一个角色不一致的真实场景——那时系统只能靠猜。这类角色在国家和地区维度上的差别,可以先看国家与语言的区别,那里区分了跟着国家走的数据层与跟着语言走的呈现层。
账单方、收货方与注册地:三个不能合并的角色
三个角色各自负责什么,值得写清楚。
收货方决定物理投递:地址结构、行政区层级、邮编是否需要、末端可达性,都跟着它走。
账单方决定单据与费用:发票抬头、金额与货币的呈现、单据上的地址格式,跟着它走。
注册地决定业务归属:账号归属、可用的支付方式、适用的服务条款,通常跟着它走,而且它往往比前两者稳定得多。
一旦合并,最常见的后果是「用户改了收货地址,账单信息也被改掉」,或者「账单地址被当成了收货地址」。这两种都很难在事后修复,因为原始信息已经丢失了。
稳妥的做法是:默认让三者一致以减少填写负担,但存储时分开,并且允许用户显式地把它们拆开。
三个角色的稳定性也不一样:注册地通常最稳定,收货地每次下单都可能变化,账单方介于两者之间。稳定性差异会影响哪些字段可以被缓存、哪些必须每次重新采集,也会影响历史数据能不能被复用。
地址格式该跟哪个国家走?
这是跨境场景里最常被问到的问题,答案取决于字段的用途。
用于投递的地址,格式应当跟收货地走,因为格式存在的意义就是让最后一公里的处理方看懂。
用于单据展示的地址,格式应当跟账单方走,因为它要符合单据使用地的阅读习惯。
用于记录的地址,最好保留原始输入的样子,另存一份标准化结果。原始值用于对账与申诉,标准值用于比对与去重。
把这三者分开之后,「同一份地址在不同地方看起来不一样」就不再是缺陷,而是预期内的行为。跨国家的地址写法差异,跨主题里有逐地区的一般性说明,见国际地址格式。
要特别小心的是别用收货地的规则去校验账单地址——那会在用户什么都没做错的情况下把他拦下来。
跨境时哪些字段最容易对不上?
有几类字段在跨境时会集中出问题。
- 行政区:两端的层级可能名称相同而含义不同,映射时容易错位。
- 邮编:并非每个国家和地区都有邮编,有邮编的地方也不一定都是同样的长度与组成,把它设成必填会在部分收货地直接卡死流程。
- 电话:区号与实际所在地可以不一致,用它来判断国别会误判。
- 货币与计量:呈现货币与结算货币可以是两个概念,合并之后退款金额最容易出错。
- 姓名:不同地区姓与名的排列习惯不同,跨境单据上按一种习惯书写,可能在另一端被读反。
这些字段的验证要按各自所属的国别角色分别做,而不是全站一套规则。各国家和地区分别有哪些字段需要覆盖,可以从国家和地区索引按地区对照着看。
单据与通知按谁的语言和格式
到了这一步,问题从数据变成了呈现:给谁看,就用谁的习惯。
单据通常按账单方的国家和地区习惯生成,包括日期写法、数字与货币的书写、地址的排列顺序。通知类内容则更适合按收件人的语言与使用习惯来写,因为它要被人直接读懂,而不是被存档。
两者不一致是可以接受的,甚至经常是必须的。测试时要验证的是它们各自的依据明确,而不是验证它们看起来一致。
还有一种情况要单独处理:收件地址偏远或属于特殊地区时,通知里的地址可能无法完整呈现。这时宁可显示成可读的摘要,也不要截断成一个看起来完整却错误的地址。小地区与编码的特殊情况,见小型地区与特殊代码。
给开发者:把国别角色建成一组字段而不是一个
实现上建议把「国家」从一个字段拆成一组有名字的角色字段,每个角色都独立可空、独立校验。
取数据时按用途取对应角色:要格式化投递地址就取收货角色,要生成单据就取账单角色,不要写一个全局的「当前国家」。
校验规则挂在角色上,而不是挂在字段名上。这样同一份表单里两类地址可以各自合规,不会因为规则冲突而互相让步。
默认值可以联动,但必须是一次性的填充动作,用户改动之后不能被覆盖回去,否则后续所有判断都会建立在一个被系统改过的值上。
另外,跨境的失败往往出现在角色缺失而不是角色错误上。一个为空但语义明确的角色,比一个被填了相近值的角色要好排查得多。
下一步
先列出业务里实际存在的国别角色,给每个角色起一个不会混淆的名字,再逐个核对每个下游动作取的是哪一个。凡是现在还靠「当前国家」这一个值撑住的地方,都值得标出来。
角色拆清之后,再回头看校验规则是不是挂在角色上。规则跟着角色走,跨境场景才不会因为两端习惯不同而互相打架。
文中出现的订单、国别角色与地址都是为说明结构而虚构的合成数据,与任何真实交易、真实用户或真实企业无关,请勿据此推断任何实际业务中的处理方式。