내 앱에 통합하기
Xsolla 구독
Xsolla로 구독을 판매하고 자체 백엔드가 없는 앱을 위한 기능입니다. 앱이 API 키와 함께 Xsolla 사용자 ID를 게이트웨이에 보내면, 게이트웨이가 Xsolla API 키로 Xsolla에 물어보고 해당 사용자에게 활성 구독이 있는지 알려 줍니다. 확인은 무료입니다.
#시작하기 전에
- 구독을 판매하는 프로젝트가 있는 Xsolla Publisher Account(Subscriptions → Subscription plans).
- 앱이 결제 토큰에 넣는 사용자 ID(user.id). 같은 사용자에게는 항상 같은 값을 쓰세요. 예를 들어 앱이 한 번 만들어 저장해 두는 ID입니다.
#1. ID와 API 키 준비
- 1
Publisher Account 열기
publisher.xsolla.comAPI 키를 관리할 수 있는 사용자로 로그인하세요.
- 2
판매자 ID와 프로젝트 ID 기록
프로젝트를 열면 주소가 publisher.xsolla.com/<판매자 ID>/projects/<프로젝트 ID> 형식입니다. 예: 746076, 273204.
- 3
API 키 만들기
Company settings → API keys → Create API key 또는 프로젝트의 Settings → API keys바로 복사하세요. Xsolla는 한 번만 보여 줍니다. 이 키가 있으면 구독을 읽을 수 있으므로 앱에 넣지 마세요.
#2. API 키에 설정
- 1
앱이 사용하는 키 열기
콘솔 → API 키 → 편집앱 전용 키를 따로 만들고, 앱이 쓰는 모델로 제한하고 사용 한도를 두세요.
- 2
Xsolla 구독 확인 입력
Xsolla 확인 설정판매자 ID, 프로젝트 ID, API 키를 입력하고 저장하세요. 게이트웨이는 저장하기 전에 그 키로 Xsolla에 확인하며, 키는 암호화되어 저장되고 다시 표시되지 않습니다.
#3. 앱에서 확인
결제 창이 닫힐 때와 앱을 열 때 확인하세요. 앱이 결제 토큰에 넣은 것과 같은 사용자 ID를 보내세요. 응답을 기다리느라 앱 시작을 막지 말고, 마지막으로 저장한 결과를 보여 준 뒤 응답이 오면 갱신하세요. 기본적으로 키마다 분당 120회 확인할 수 있습니다.
import 'dart:convert';
import 'package:http/http.dart' as http;
const apiKey = 'sk-YOUR_KEY';
Future<Map<String, dynamic>?> checkXsolla(String userId) async {
final res = await http.post(
Uri.parse('https://www.aisplice.store/v1/xsolla/verify'),
headers: {
'Authorization': 'Bearer $apiKey',
'Content-Type': 'application/json',
// Request signing on for this key? Then this call must be signed too:
// ...signedHeaders('POST', '/v1/xsolla/verify'),
},
body: jsonEncode({'user_id': userId}),
);
if (res.statusCode != 200) return null; // keep the last saved answer
return jsonDecode(res.body) as Map<String, dynamic>;
}
Future<void> refreshEntitlement(String userId) async {
final status = await checkXsolla(userId);
if (status == null) return;
await saveEntitlement(status); // your local storage
if (status['active'] == true) unlockPaidFeatures();
}#4. 무엇을 열지 결정
| 확인 결과 | 앱의 동작 | 일반적인 원인 |
|---|---|---|
| active: true, in_trial: true | 잠금 해제. expiry_time으로 “체험 종료” 시각을 표시합니다. | 무료 체험, 아직 결제 전 |
| active: true | expiry_time까지 잠금 해제. | 결제됨(자동 갱신을 껐지만 아직 만료되지 않은 구독 포함) |
| subscribed: true, active: false | 잠그고 갱신 화면을 표시합니다. | 취소됨 또는 동결됨 |
| subscribed: false | 잠그고 구독 화면을 표시합니다. | 이 사용자는 아직 구독이 없거나 결제가 끝나지 않았습니다 |
| HTTP 502 / 503 | 마지막으로 저장한 응답을 유지하고 나중에 다시 시도합니다. | Xsolla 또는 API 키가 응답하지 않음 |
응답과 함께 expiry_time을 저장하세요. 확인과 확인 사이에는 그 시각까지 구독을 사용 가능한 것으로 처리하면, 휴대폰이 오프라인이어도 계속 동작합니다.
#5. 앱 안의 키 보호
앱 안의 키는 캡처한 트래픽에서 읽어 낼 수 있습니다. 해당 키에 요청 서명을 켜서 복사된 키만으로는 쓸 수 없게 하고, 빌드를 난독화하며, 키에 한도 상한을 두세요.
#6. 무슨 일이 있었는지 확인
캐시된 응답과 실패를 포함한 모든 확인은 콘솔 → 요청 로그에 키의 무료 xsolla-verify 행으로 표시됩니다.
- 저장할 때 Xsolla가 키를 받지 않는다고 나오면: 키가 일부만 복사되었거나 삭제되었거나 다른 회사의 키입니다. 새로 만드세요.
- xsolla_credentials_invalid: 저장 후 Publisher Account에서 키가 삭제되었습니다. 새 키를 만들어 API 키에 입력하세요.
- 항상 subscribed: false가 나오면: 사용자 ID가 결제 토큰의 값과 다르거나 키의 프로젝트 ID가 다른 프로젝트입니다.
아직 해결되지 않았나요?
요청 ID나 오류 메시지를 보내 주시면 확인해 드리겠습니다.