diff --git a/solution/backend/router/v1/agent/kakao_bot.py b/solution/backend/router/v1/agent/kakao_bot.py index 51809b6..4d71470 100644 --- a/solution/backend/router/v1/agent/kakao_bot.py +++ b/solution/backend/router/v1/agent/kakao_bot.py @@ -176,11 +176,21 @@ async def _push(callback_url: str, utterance: str, speaker: str) -> None: async def _handle(body: dict, tasks: BackgroundTasks) -> dict: request = body.get("userRequest") or {} utterance = request.get("utterance") or "" - speaker = (request.get("user") or {}).get("id") or "" + user = request.get("user") or {} + speaker = user.get("id") or "" if not speaker: # 발화자를 모르면 누구의 가게인지도 모른다. 여기서 끝낸다. return _reply("사용자를 확인하지 못했어요.") + # ★ 카카오 로그인 매칭 가능성 확인용(2026-09-30). user.properties.appUserId 는 봇 설정에 + # 앱키가 물려 있을 때만 오고, 그 값이 **카카오 로그인으로 받는 값과 같다**(공식 문서). + # 오면 6자리 코드 절차 없이 사장님을 바로 알아볼 수 있다. + # ★ 값 자체는 남기지 않는다 — 사용자 식별자다. 어떤 키가 왔는지와 길이만 본다. + props = user.get("properties") or {} + if isinstance(props, dict): + LOG.i(f"[agent/kakao] 발화자 키 — properties={sorted(props)} " + f"appUserId={'있음(%d자)' % len(str(props['appUserId'])) if props.get('appUserId') else '없음'}") + # ★ [승인] 버튼(action: block)의 extra 는 그 블록의 스킬 요청에 action.clientExtra 로 돌아온다. # 글 ID 값은 남기지 않고 어떤 키가 왔는지만 남긴다. extra = (body.get("action") or {}).get("clientExtra") or {}