diff --git a/addons/shopro_huifu/library/onboard/HuifuOnboardAreaHelper.php b/addons/shopro_huifu/library/onboard/HuifuOnboardAreaHelper.php index 53a704f..a5339b5 100644 --- a/addons/shopro_huifu/library/onboard/HuifuOnboardAreaHelper.php +++ b/addons/shopro_huifu/library/onboard/HuifuOnboardAreaHelper.php @@ -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; + } } diff --git a/addons/shopro_huifu/library/onboard/HuifuOnboardBankBranch.php b/addons/shopro_huifu/library/onboard/HuifuOnboardBankBranch.php index e76c8da..c1d8866 100644 --- a/addons/shopro_huifu/library/onboard/HuifuOnboardBankBranch.php +++ b/addons/shopro_huifu/library/onboard/HuifuOnboardBankBranch.php @@ -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) { diff --git a/addons/shopro_huifu/library/onboard/HuifuOnboardBusiOpen.php b/addons/shopro_huifu/library/onboard/HuifuOnboardBusiOpen.php index 3da9f34..86089ab 100644 --- a/addons/shopro_huifu/library/onboard/HuifuOnboardBusiOpen.php +++ b/addons/shopro_huifu/library/onboard/HuifuOnboardBusiOpen.php @@ -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'], diff --git a/addons/shopro_huifu/library/onboard/HuifuOnboardValidator.php b/addons/shopro_huifu/library/onboard/HuifuOnboardValidator.php index 0f463f4..30fea04 100644 --- a/addons/shopro_huifu/library/onboard/HuifuOnboardValidator.php +++ b/addons/shopro_huifu/library/onboard/HuifuOnboardValidator.php @@ -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';