对接不同直接借记提供商时,如何处理字段名映射问题?
解决不同直付提供商API字段映射问题
核心思路:统一内部字段 + 提供商专属映射
你需要先定义一套内部标准化字段名,比如用account_name作为通用标识,然后让每个提供商的实现类负责把内部字段映射到各自API要求的字段名上。
具体实现步骤
定义接口规范
先在接口里统一更新方法的参数,接收内部标准字段的数组,而非直接传递提供商的字段:interface DirectDebitInterface { public function updateAccount(string $reference, array $internalFields): void; }每个提供商实现映射逻辑
每个提供商类继承接口后,维护自己的字段映射数组(你提到的常量方式属于硬编码字段映射的一种,本质是绑定内部与外部字段,但数组更适合批量维护多字段映射,扩展性更好),在update方法里完成转换:- Provider 1 示例:
class Provider1 implements DirectDebitInterface { // 内部字段 => 提供商API字段的映射 private const FIELD_MAPPING = [ 'account_name' => 'AccountHolderName', // 可添加其他字段映射... ]; public function updateAccount(string $reference, array $internalFields): void { // 转换内部字段为提供商要求的格式 $apiFields = []; foreach ($internalFields as $internalKey => $value) { if (isset(self::FIELD_MAPPING[$internalKey])) { $apiFields[self::FIELD_MAPPING[$internalKey]] = $value; } } // 调用SOAP API提交数据(若需完整对象,需先拉取当前记录再合并) $this->soapClient->updateAccount([ 'reference' => $reference, 'account' => $apiFields ]); } } - Provider 2 示例:
class Provider2 implements DirectDebitInterface { private const FIELD_MAPPING = [ 'account_name' => 'AccountName', // 可添加其他字段映射... ]; public function updateAccount(string $reference, array $internalFields): void { $apiFields = []; foreach ($internalFields as $internalKey => $value) { if (isset(self::FIELD_MAPPING[$internalKey])) { $apiFields[self::FIELD_MAPPING[$internalKey]] = $value; } } $this->soapClient->modifyAccount($reference, $apiFields); } }
- Provider 1 示例:
调用层统一使用内部字段
上层代码只需用内部标准字段调用,无需关心具体提供商:// 假设通过依赖注入获取当前提供商实例 /** @var DirectDebitInterface $directDebitInterface */ $directDebitInterface->updateAccount('REF123', [ 'account_name' => 'NEW ACCOUNT NAME' ]);
补充:处理"需传入完整对象"的问题
由于SOAP API要求提交完整对象,你需要在update方法中先调用提供商的查询接口,拉取当前账户的完整数据,再覆盖要更新的字段,最后提交完整对象:
public function updateAccount(string $reference, array $internalFields): void { // 1. 拉取当前完整账户数据 $currentAccount = $this->soapClient->getAccount($reference); // 2. 转换内部更新字段为提供商字段 $apiUpdateFields = []; foreach ($internalFields as $internalKey => $value) { if (isset(self::FIELD_MAPPING[$internalKey])) { $apiUpdateFields[self::FIELD_MAPPING[$internalKey]] = $value; } } // 3. 合并更新字段到完整对象 $fullAccountData = array_merge($currentAccount, $apiUpdateFields); // 4. 提交完整对象到API $this->soapClient->updateAccount($fullAccountData); }
内容的提问来源于stack exchange,提问作者Craig Lovelock
相关产品推荐
相关产品推荐

