feat(shopro_huifu): 添加汇付地区编码转换和银行支行查询功能

- 新增 HuifuOnboardAreaHelper::toHuifuCityCode 方法,将区县级编码转换为地级市编码
- 新增 HuifuOnboardBankBranch::findByBranchCode 方法,支持按联行号精确查找银行信息
- 在业务开通流程中使用地区编码转换方法确保汇付银行卡信息正确
- 在验证器中添加根据联行号自动填充省市信息的功能
- 修复区域ID为空时省份ID的自动推导逻辑
```
这个提交包含在:
可乐加冰
2026-10-08 13:40:06 +08:00
父节点 1182faca30
当前提交 fd14b701c3
共有 4 个文件被更改,包括 77 次插入 和 2 次删除

查看文件

@@ -31,4 +31,20 @@ class HuifuOnboardAreaHelper
}
return str_pad($id, 6, '0', STR_PAD_RIGHT);
}
/**
* 汇付银行卡 card_info.area_id 要求地级市编码(如安顺 520400),
* 小程序省市区选到区县时可能是 520402,需上提为 XXYY00。
*/
public static function toHuifuCityCode($code)
{
$code = self::toCode($code);
if ($code === '' || strlen($code) !== 6) {
return $code;
}
if (substr($code, 4, 2) !== '00') {
return substr($code, 0, 4) . '00';
}
return $code;
}
}

查看文件

@@ -264,6 +264,40 @@ class HuifuOnboardBankBranch
return substr($cityCode, 0, 2) . '0000';
}
/**
* 按联行号精确查找(用于手动填联行号时回填省市)
*/
public static function findByBranchCode($branchCode)
{
$branchCode = trim((string) $branchCode);
if ($branchCode === '') {
return null;
}
try {
$row = Db::name('shopro_huifu_bank_branch')
->where('status', 1)
->where('branch_code', $branchCode)
->find();
if ($row) {
return [
'branch_code' => (string) $row['branch_code'],
'branch_name' => (string) $row['branch_name'],
'bank_name' => (string) ($row['bank_name'] ?? ''),
'prov_id' => (string) ($row['prov_id'] ?? ''),
'area_id' => (string) ($row['area_id'] ?? ''),
];
}
} catch (\Throwable $e) {
// ignore
}
foreach (self::loadJson() as $item) {
if ((string) ($item['branch_code'] ?? '') === $branchCode) {
return $item;
}
}
return null;
}
protected static function loadJson()
{
if (self::$jsonCache !== null) {

查看文件

@@ -111,7 +111,7 @@ class HuifuOnboardBusiOpen
'prov_id' => $form['prov_id'],
'area_id' => $form['area_id'],
'area_id' => HuifuOnboardAreaHelper::toHuifuCityCode($form['area_id'] ?? ''),
'mp' => $form['mp'],

查看文件

@@ -141,8 +141,30 @@ class HuifuOnboardValidator
}
}
protected static function resolveBranchByCode(array &$data)
{
$code = trim((string) ($data['branch_code'] ?? ''));
if ($code === '') {
return;
}
$found = HuifuOnboardBankBranch::findByBranchCode($code);
if (!$found) {
return;
}
if (!empty($found['branch_name']) && empty(trim((string) ($data['branch_name'] ?? '')))) {
$data['branch_name'] = $found['branch_name'];
}
if (!empty($found['prov_id'])) {
$data['prov_id'] = $found['prov_id'];
}
if (!empty($found['area_id'])) {
$data['area_id'] = $found['area_id'];
}
}
protected static function resolveBranch(array &$data)
{
self::resolveBranchByCode($data);
if (!empty($data['branch_code'])) {
return;
}
@@ -192,8 +214,11 @@ class HuifuOnboardValidator
$data['branch_code'] = trim($data['branch_code'] ?? '');
$data['branch_name'] = trim($data['branch_name'] ?? '');
$data['prov_id'] = HuifuOnboardAreaHelper::toCode($data['prov_id'] ?? '');
$data['area_id'] = HuifuOnboardAreaHelper::toCode($data['area_id'] ?? '');
$data['area_id'] = HuifuOnboardAreaHelper::toHuifuCityCode($data['area_id'] ?? '');
$data['district_id'] = HuifuOnboardAreaHelper::toCode($data['district_id'] ?? '');
if ($data['prov_id'] === '' && $data['area_id'] !== '') {
$data['prov_id'] = substr($data['area_id'], 0, 2) . '0000';
}
foreach (['cert', 'license', 'legal_cert'] as $prefix) {
$beginKey = $prefix . '_begin_date';