제휴사 연동
AI로 구현하기
Claude·ChatGPT·Cursor 같은 AI 코딩 도구에 붙여넣으면 규약대로 구현하도록 만든 통합 프롬프트와 AI용 문서 경로입니다.
AI 코딩 도구로 연동을 구현한다면 이 페이지부터 쓰세요. 아래 통합 프롬프트 하나에 연동 규약, 틀리기 쉬운 점, 완료 기준을 모두 담았습니다. 문서를 일일이 읽히지 않아도 AI 가 같은 기준으로 구현합니다.
사용 방법
프롬프트 복사
아래 코드 블록 오른쪽 위의 복사 버튼을 누릅니다.
맨 위 "우리 환경" 채우기
언어·프레임워크, 로그인 방식(ⓐ/ⓑ), 회원·구매 테이블 이름을 적습니다. 모르는 칸은 비워 두면 AI 가 먼저 물어봅니다.
AI 도구에 붙여넣기
Claude Code·Cursor·Codex 처럼 저장소를 읽는 도구라면 저장소 루트에서 실행하세요. AI 가 기존 회원·주문 코드를 찾아 거기에 맞춰 구현합니다.
통합 프롬프트
# 과제: 쏠브(Solve) 제휴사 연동 구현
## 우리 환경 (채워서 사용)
- 언어/프레임워크:
- 로그인 방식: ⓐ 자격증명 API / ⓑ 호스팅 로그인 페이지 (소셜 로그인이 하나라도 있으면 ⓑ)
- 회원 테이블과 불변 회원번호 컬럼:
- 구매(주문) 테이블과 "현재 이용 가능" 판정 기준(환불·만료 제외):
## 배경
쏠브는 전자책 학습 앱이다. 우리 사이트에서 책을 산 회원이 쏠브 앱에서 우리 계정으로 로그인하면,
쏠브 서버가 우리 API 를 호출해 구매 목록을 받아 책장에 책을 넣는다.
**쏠브가 호출하는 쪽이고, 우리가 API 를 구현하는 쪽**이다.
전체 규약 원문: https://developers.solve.im/llms-full.txt (필요하면 읽어라)
## 구현할 것
1. 로그인 (둘 중 하나)
ⓐ 자격증명 로그인 API — POST, JSON 요청 {"id": string, "password": string}
- 성공: 200 {"user_key": string}
- 아이디·비밀번호 불일치: 4xx (쏠브 앱이 "비밀번호 불일치"로 안내, 재시도 안 함)
- 서버 오류: 5xx (쏠브가 최대 2번 재시도)
ⓑ 호스팅 로그인 페이지 — 쏠브 앱 웹뷰가 우리 "쏠브 전용 로그인 URL"을 쿼리 파라미터 없이 연다
- 회원이 로그인에 성공하면 우리 **서버에서** 쏠브 콜백 호출:
POST {SOLVE_CALLBACK_URL} JSON {"id": string, "platform_type": number}
헤더 Authorization: Bearer {SOLVE_CALLBACK_SECRET} (쏠브 발급, 401 이면 재시도 금지)
- 응답 200 {"redirect_url": string} → 같은 웹뷰에서 그 URL 로 302 이동 (새 창·외부 브라우저 금지, URL 수정 금지 — 서명 포함)
- 소셜 로그인으로 외부에 다녀오는 경우 세션에 "쏠브 연동 중" 표시를 유지했다가 완료 시 콜백
- SOLVE_CALLBACK_URL, SOLVE_PLATFORM_TYPE, SOLVE_CALLBACK_SECRET 은 쏠브가 전달하는 값 → 환경변수로
2. 구매내역 API — POST, JSON 요청 {"user_key": string}
- 200 {"item_list": [{"item_code": string, "item_name": string(선택)}]}
- 선택 필드 (v1.1, 없어도 된다 — v1.0 대로 구현한 응답은 수정 없이 유효): 항목마다 price · paid_at · valid_from · valid_until 을 더 담을 수 있다
· price: 0 이상 정수(숫자) 또는 숫자만으로 된 문자열(1~12자리), 원 단위
· paid_at: ISO 8601. 오프셋(Z, +09:00)이 있으면 그대로, 없으면 한국 시간(+09:00), 날짜만이면 그날 00:00 한국 시간
· valid_from, valid_until: 1~32자 문자열 (쏠브는 해석하지 않고 그대로 기록)
· 형식이 틀리면 그 필드만 무시한다 (책 지급에는 영향 없음)
· price 를 안 보내거나 0 이면 파트너 어드민에 등록한 가격으로 정산한다
· valid_until 이 지나도 책은 자동으로 빠지지 않는다 — 회수는 목록에서 빼는 것뿐이다
- **현재 이용 가능한 구매만** 담는다. 환불·만료는 뺀다
- 구매가 없거나 회원이 없으면 200 {"item_list": []}
- 조회 실패·장애는 반드시 5xx. 예외를 삼키고 200 을 보내지 마라 (일부만 조회된 목록이면 빠진 책이 회수된다)
- 페이지네이션 없이 한 번에 전부
3. 공통
- HTTPS, Content-Type: application/json, 10초 안에 응답 (쏠브 타임아웃 10초)
- 쏠브는 우리가 발급한 시크릿을 헤더에 담아 보낸다. 헤더 이름은 우리가 정한다 (기본값: X-Solve-Secret)
- 시크릿은 환경변수로 두고(비어 있으면 서버 시작 실패) 상수 시간 비교로 확인, 불일치면 `401` 또는 `403`
- 쏠브는 `401` 과 `403` 을 구분하지 않고 같은 인증 실패로 처리한다 (둘 다 재시도 없음)
- 같은 요청이 재시도로 여러 번 와도 데이터가 바뀌면 안 된다 (조회 전용)
- 응답 본문은 1MB(1,048,576바이트) 이하. 쏠브는 1MB 를 넘는 응답을 받지 않는다 (넘으면 그 호출은 실패, 재시도 없음 — 구매내역이면 기존 책장 유지). 구매내역·ⓐ 로그인 모두 해당, 필요한 필드만 담는다
## 반드시 지킬 것 (틀리기 쉬움)
- user_key(ⓑ 의 id)는 **절대 바뀌지 않는 내부 회원번호**. 로그인 아이디·이메일·소셜 계정 ID 금지
- 탈퇴 회원의 user_key 를 다른 회원에게 재사용 금지
- item_code 는 상품 단위 코드이며, 쏠브 파트너 어드민에 입력한 "연동코드"와 같아야 한다. 쏠브는 item_code 의 앞뒤 공백을 떼고 비교하고, 그 밖은 대소문자까지 글자 그대로 같아야 한다 (연동코드 앞뒤에 공백을 넣지 않는다)
- 비밀번호·시크릿을 로그에 남기지 않는다
- 예외를 삼키고 200 을 보내지 않는다
## 결정 기본값 (모호하면 이렇게)
- 엔드포인트 경로: POST /solve/login (ⓐ), POST /solve/purchases
- 아이디·비밀번호 불일치 401, 시크릿 불일치 `401` 또는 `403` (기본은 403), 요청 형식 오류 400, 그 외 예외 500
- 에러 응답 본문: {"error": "<snake_case 코드>"}
## 산출물
1. 위 API 구현 코드 (기존 회원·주문 코드를 찾아서 재사용)
2. 테스트: 구매 회원 200, 없는 회원 200+빈 배열, 환불 상품 제외, 틀린 시크릿 `401` 또는 `403`, DB 오류 500
(ⓐ 는 맞는/틀린 비밀번호도)
3. 쏠브가 보낼 요청을 재현하는 curl 명령
4. 쏠브에 전달할 값 목록: 각 URL, 시크릿 헤더 이름, 테스트 계정
5. 구현 뒤 `solve-selfcheck.mjs`(https://developers.solve.im/tools/solve-selfcheck.mjs)로 확인한다 — `--init` 으로 설정 틀을 만들고 값을 채워 실행하며, FAIL 이 0개일 때까지 고친다 (ⓑ 는 `solve-callback-mock.mjs` 로 콜백을 시험)
작업 전에 우리 코드베이스에서 회원·구매 관련 코드를 먼저 찾아보고, 구현 계획을 짧게 보여준 뒤 진행해라.저장소에 규칙으로 넣기
같은 저장소에서 AI 에게 여러 번 일을 시킨다면, 프롬프트를 규칙 파일로 넣어 두면 매번 붙여넣지 않아도 됩니다.
| 도구 | 파일 위치 |
|---|---|
| Claude Code | 저장소 루트 CLAUDE.md 에 추가 |
| Codex, 기타 에이전트 | 저장소 루트 AGENTS.md 에 추가 |
| Cursor | .cursor/rules/solve-integration.mdc |
| GitHub Copilot | .github/copilot-instructions.md |
AI 도구용 문서 경로
| 경로 | 내용 | 쓰는 곳 |
|---|---|---|
/llms.txt | 전체 문서 목차 | AI 에게 "여기서 필요한 문서를 찾아 읽어" |
/llms-full.txt | 전체 문서를 한 파일로 | 한 번에 모든 규약을 넘길 때 |
각 페이지 URL 뒤에 .md | 그 페이지만 마크다운으로 | 특정 페이지만 넘길 때 (예: /docs/partner-integration/purchase-history-api.md) |
각 페이지 제목 아래의 마크다운 복사·AI로 열기 버튼으로도 그 페이지를 바로 넘길 수 있습니다.
AI 가 만든 코드도 셀프 점검을 거쳐 주세요
특히 "예외를 삼키고 200 응답"과 "로그인 아이디를 user_key 로 사용"은 AI 가 자주 만드는 실수입니다. 테스트와 출시의 셀프 점검 도구(solve-selfcheck.mjs)로 확인한 뒤 쏠브에 전달해 주세요.