애플사 결제를 통한 콘텐츠 과금하는 방법 In App Purchase
http://blog.naver.com/kimysaptec/130095894390
다음은 아이폰용 콘텐츠 과금에 관한 프로그램 구현 방법 설명 입니다.
제목: 애플사 결제를 통한 콘텐츠 과금하는 방법 In App Purchase
==============================================================
###(중요) 은행계좌가 사전에 등록 필수 --- 없으면 테스트 확인불가
(중요) 아이폰 설정/store의 계정 로그아웃(반드시) ---- 테스트 계정 사용을 위함
(중요) 상품 판매 지역 언어 일치 필수 --- 개발어플과 애플 iTunes Connect 사이트의 Manage Your Applications에서
(중요)애플 결제 얼럿창은 지연시간이 발생하여 느리게 표시 될 수 있음.(이유는 네트워크와 애플 서버의 영향인듯 함).
최대 15초까지 지연 발생 가능 확인 됨.
1. App ID 등록
가. http://developer.apple.com/ 접속 iOS Dev Center. 클릭
http://developer.apple.com/devcenter/ios/index.action
나. 로그인
다. 오른 쪽의 iOS Provisioning Portal 클릭하여 어플 인증파일을 만든다.
- New App ID 버튼 클릭
- 여기서 생성한 bundle ID가 중요하다. 반드시 생성 이름 기억한다.
예) com.testman.inappdemo
틀린예) com.testman.*
붙임) Enable In App Purchase는 기본으로 설정 됨<--- 2010년도에 정책이 바뀜
2. Provisioning Profile 생성
가. 왼쪽 메뉴 중에서 provisioning 선택
나. new Profile 버튼 클릭
-프로파일 이름을 생성하여 다운로드하고 더블클릭하여 Xcode에 등록 한다.
확인방법: Xcode에서 Window > Organizer 선택
provisioning profiles선택
마우스 오른쪽 버튼 클릭 > Reveal in finder
3. Xcode setting--개발 어플에서
위에서 작업한 App ID로 설정 함
4.. iTunes Connect 사이트에 환경 등록
(참고)iTunes Connect Developer Guide.
가. Manage Your Applications에서 어플등록
-테스트 동안에는 실행파일은 업로드 하지 않아도 됨
- 단지 Bundle ID는 위에서 생성한 App ID임
예) com.testman.inappdemo
나. 판매상품 등록 Manage Your In App Purchases
- 주의할것은 Product ID 임. --- 이 것은 프로그램에서 사용됨.(중요)
예) com.testman.inappdemo.001 또는 com.testman.inappdemo.itemone
단지 app ID + 상품코드 형식으로 해주면 된다.
-판매 상품 유형은 아래 3가지 유형중 하나 선택
보충 불가능 이 응용 프로그램 내 구입 기능은 한 번만 구입해야 하고, 동일한 iTunes Store 계정으로 인증된 여러 장비에 전송할 수 있는 항목입니다.
- 보너스 게임 레벨
- 도시 안내 지도
보충 가능 이 응용 프로그램 내 구입 기능은 매번 구입해야 하고 무료로 다시 다운로드할 수 없는 항목입니다.
- 추가 체력
- 추가 경험치
구독은 구독 기간이 만료될 경우 다시 구입해야 하는 일회성 서비스입니다.
- 한 달 구독
- 위치 서비스 구독
- Display Detail의 언어 선택과 Display Name 입력항목은 아이폰 결제화면 얼럿 창에 보여지므로
상품명으로 입력함. 그리고 Add This language 버튼을 클릭하여 등록해야 저장 됨
다. 상품테스트 유저 등록 Manage Users
- 아이폰에서 결제하는 방식이므로 로그인 이메일 계정으로 임으로 생성 함.
단지, 이미 iTunes 계정으로 등록 된 계정은 생성 하면 안됨.
실제 결제될 수 있음.
5. 코딩
참고) In App Purchase Programming Guide 에서 “Adding a Store to Your Application” 내용
가. Xcode 개발 편집기에서 다음 프레임워크를 개발어플에 추가
StoreKit.framework
나. 결제 코딩파일에 추가(헤더와 델리게이트)
#import <StoreKit/StoreKit.h>
@interface : <SKProductsRequestDelegate, SKPaymentTransactionObserver> {
}
다. 다음은 애플결제 이용가능 상태를 확인할 때 사용 함
if ([SKPaymentQueue canMakePayments]) |
{ |
... // Display a store to the user. |
} |
else |
{ |
... // Warn the user that purchases are disabled. |
} |
라. 다음은 상품정보 유무확인시 사용함. 예)com.testman.inappdemo.001이 상품코드
- (void) requestProductData |
{ |
SKProductsRequest *request= [[SKProductsRequest alloc] initWithProductIdentifiers: [NSSet setWithObject: @"com.testman.inappdemo.001"]]; |
request.delegate = self; |
[request start]; |
} |
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response |
{ |
NSArray *myProduct = response.products; |
// populate UI |
[request autorelease]; |
} |
마. (중요) 실제 상품결제 진행에 따른 결과 델리게이트 발생 시킴(프로그램 초기화나 로드시, 또는 결제버튼 클릭시 사용가능 함.) [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; |
바. (중요) 실제 상품결제 요청 ----결제 버튼과 연동해도 됨.
SKPayment *payment = [SKPayment paymentWithProductIdentifier:@"com.testman.inappdemo.001"]; |
[[SKPaymentQueue defaultQueue] addPayment:payment]; |
사. 다음은 결제 결과에 따른 델리게이트 임.
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions |
{ |
for (SKPaymentTransaction *transaction in transactions) |
{ |
switch (transaction.transactionState) |
{ |
case SKPaymentTransactionStatePurchased: |
[self completeTransaction:transaction]; |
break; |
case SKPaymentTransactionStateFailed: |
[self failedTransaction:transaction]; |
break; |
case SKPaymentTransactionStateRestored: |
[self restoreTransaction:transaction]; |
default: |
break; |
} |
} |
} |
- (void) completeTransaction: (SKPaymentTransaction *)transaction |
{ |
// Your application should implement these two methods. |
//생략가능 [self recordTransaction: transaction]; |
//생략가능 [self provideContent: transaction.payment.productIdentifier]; |
// Remove the transaction from the payment queue. |
[[SKPaymentQueue defaultQueue] finishTransaction: transaction]; |
} |
- (void) restoreTransaction: (SKPaymentTransaction *)transaction |
{ |
//생략 가능[self recordTransaction: transaction]; |
//생략가능 [self provideContent: transaction.originalTransaction.payment.productIdentifier]; |
[[SKPaymentQueue defaultQueue] finishTransaction: transaction]; |
} |
- (void) failedTransaction: (SKPaymentTransaction *)transaction |
{ |
if (transaction.error.code != SKErrorPaymentCancelled) |
{ |
// Optionally, display an error here. |
} |
[[SKPaymentQueue defaultQueue] finishTransaction: transaction]; |
} |
이상으로 애플결제를 정리 합니다.