토스 결제수단의 PG 고정 선언( 전환)은 develop 의 선행 커밋이 이미 반영했다. 이 커밋은 그 전환에서 남은 뒷정리와, 같은 결함이 다시 나지 않게 하는 장치를 담는다. AdjustEcommercePaymentMethodsLayoutListener 는 코어 레이아웃 표현식의 no-PG 리스트 리터럴을 정규식으로 재작성해 표시를 바꾸던 리스너인데, 에서 코어가 그 리터럴을 버리면서 매치 대상이 사라져 이미 사문화된 상태였다. 단위 테스트가 그 리터럴을 합성 레이아웃에 직접 넣어 검증한 탓에 계속 통과해 사문화가 드러나지 않았다. 리스너와 그 테스트, 시나리오 매니페스트의 관련 effects 를 함께 걷어낸다. 런타임 병합은 정의값으로 자가 치유되지만 저장된 주문설정 파일에는 pg_provider=null 이 그대로 남는다. 자기 접두사 수단만 정정하는 멱등 업그레이드 스텝을 추가했다. 능력 선언 규약이 어디에도 문서화돼 있지 않아 4개 PG 플러그인 중 토스만 어긋난 채 남았으므로, 규약을 명문화하고 미선언을 검출하는 audit 룰을 신설했다(수정 전 코드에 red 확인 후 전수 스캔 green). 1.0.0 이 공개 발행되었으므로 발행 섹션에 누적하지 않고 1.0.1 로 올렸다.
131 lines
4.5 KiB
PHP
131 lines
4.5 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Upgrades\Data\Ext\Plugins\SirsoftTosspayments\V1_0_1\Migrations;
|
|
|
|
use App\Extension\Helpers\FilePermissionHelper;
|
|
use App\Extension\Upgrade\DataMigration;
|
|
use App\Extension\UpgradeContext;
|
|
use Illuminate\Support\Facades\File;
|
|
|
|
/**
|
|
* 저장된 이커머스 주문설정의 토스 주문서형 결제수단 항목에 PG 고정 선언을 백필한다.
|
|
*
|
|
* 배경:
|
|
*
|
|
* 주문서형 결제수단(toss_*)은 과거 `pg_provider: null` 로 등록되어 저장 파일에 그대로
|
|
* 영속화됐다. 그 결과 관리자 주문설정 화면이 다른 간편결제(KG 이니시스 등)와 달리
|
|
* "PG 고정" 배지 대신 빈 PG 선택 셀렉트(---)를 그렸다.
|
|
*
|
|
* 현재 코드는 결제수단 카탈로그를 병합할 때 능력 선언(pg_provider / pg_locked / needs_pg /
|
|
* refund_method)을 플러그인 정의에서 가져오므로 런타임 표시는 이미 정상이다(자가 치유).
|
|
* 본 마이그레이션은 저장 파일 자체를 현재 선언과 일치시켜 설정 화면과 파일 내용이
|
|
* 어긋나 보이지 않게 한다.
|
|
*
|
|
* V-1 안전 격리 (docs/extension/upgrade-step-guide.md §13):
|
|
* - 파일 시스템 + FilePermissionHelper 만 사용 (이전 버전에도 존재하던 표면)
|
|
* - Service / Manager / Repository 컨테이너 해석 없음
|
|
*/
|
|
final class BackfillTossPgProvider implements DataMigration
|
|
{
|
|
/**
|
|
* 이커머스 모듈의 주문설정 저장 경로.
|
|
*/
|
|
private const SETTINGS_PATH = 'app/modules/sirsoft-ecommerce/settings/order_settings.json';
|
|
|
|
/**
|
|
* 이 플러그인이 등록하는 주문서형 결제수단의 ID 접두사.
|
|
*/
|
|
private const METHOD_PREFIX = 'toss_';
|
|
|
|
/**
|
|
* 이 플러그인이 제공하는 PG 식별자.
|
|
*/
|
|
private const PG_PROVIDER_ID = 'tosspayments';
|
|
|
|
/**
|
|
* 마이그레이션 식별자 (로그용).
|
|
*
|
|
* @return string 사람이 읽을 수 있는 짧은 식별자
|
|
*/
|
|
public function name(): string
|
|
{
|
|
return 'BackfillTossPgProvider';
|
|
}
|
|
|
|
/**
|
|
* 저장된 주문설정의 토스 결제수단 항목에 PG 고정 선언을 백필한다. idempotent.
|
|
*
|
|
* @param UpgradeContext $context 업그레이드 컨텍스트 (로거 등)
|
|
*/
|
|
public function run(UpgradeContext $context): void
|
|
{
|
|
$path = storage_path(self::SETTINGS_PATH);
|
|
|
|
if (! File::exists($path)) {
|
|
$context->logger->info('[tosspayments] 이커머스 주문설정 파일 없음 — 기본값으로 동작하므로 skip');
|
|
|
|
return;
|
|
}
|
|
|
|
$settings = json_decode(File::get($path), true);
|
|
if (! is_array($settings) || ! is_array($settings['payment_methods'] ?? null)) {
|
|
$context->logger->warning('[tosspayments] 주문설정 JSON 형식 비정상 — 결제수단 PG 백필 skip');
|
|
|
|
return;
|
|
}
|
|
|
|
$updated = 0;
|
|
foreach ($settings['payment_methods'] as $index => $method) {
|
|
if (! is_array($method)) {
|
|
continue;
|
|
}
|
|
|
|
$id = (string) ($method['id'] ?? '');
|
|
if (! str_starts_with($id, self::METHOD_PREFIX)) {
|
|
continue;
|
|
}
|
|
|
|
$before = [
|
|
$method['pg_provider'] ?? null,
|
|
$method['pg_locked'] ?? null,
|
|
$method['needs_pg'] ?? null,
|
|
$method['refund_method'] ?? null,
|
|
];
|
|
|
|
$method['pg_provider'] = self::PG_PROVIDER_ID;
|
|
$method['pg_locked'] = true;
|
|
$method['needs_pg'] = true;
|
|
$method['refund_method'] = 'pg';
|
|
|
|
$after = [
|
|
$method['pg_provider'],
|
|
$method['pg_locked'],
|
|
$method['needs_pg'],
|
|
$method['refund_method'],
|
|
];
|
|
|
|
if ($before !== $after) {
|
|
$updated++;
|
|
}
|
|
|
|
$settings['payment_methods'][$index] = $method;
|
|
}
|
|
|
|
if ($updated === 0) {
|
|
$context->logger->info('[tosspayments] 결제수단 PG 선언이 이미 최신 — 변경 없음');
|
|
|
|
return;
|
|
}
|
|
|
|
File::put($path, json_encode($settings, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT));
|
|
FilePermissionHelper::inheritOwnershipFromParent($path);
|
|
|
|
$context->logger->info('[tosspayments] 주문서형 결제수단 PG 고정 선언 백필 완료', [
|
|
'pg_provider' => self::PG_PROVIDER_ID,
|
|
'updated_methods' => $updated,
|
|
]);
|
|
}
|
|
}
|