[flutter] 플러터 앱의 인앱 결제 (In-App Purchase) 처리 방법

앱 내에서 인앱 결제를 처리하는 것은 모바일 앱 개발에서 중요한 요소 중 하나입니다. 이를 통해 사용자들은 앱 내에서 추가 기능이나 디지털 상품을 구매할 수 있습니다. Flutter에서는 인앱 결제를 처리하기 위해 in_app_purchase 패키지를 사용할 수 있습니다.

1. in_app_purchase 패키지 설치하기

프로젝트의 pubspec.yaml 파일에 아래와 같이 in_app_purchase 패키지를 추가해줍니다:

dependencies:
  in_app_purchase: ^0.3.7+2

그리고 패키지를 적용하기 위해 터미널에서 아래 명령어를 실행해줍니다:

$ flutter pub get

2. 인앱 결제 기능 구현하기

2.1. 초기화

인앱 결제를 사용하기 위해선 먼저 in_app_purchase 패키지를 초기화해야 합니다. 이는 앱의 시작 시점에서 딱 한 번만 호출하면 됩니다. 아래는 초기화 코드의 예시입니다:

import 'package:in_app_purchase/in_app_purchase.dart';

void initInAppPurchase() async {
  final bool available = await InAppPurchase.instance.isAvailable();
  if (available) {
    await InAppPurchase.instance.initConnection();
    // 커넥션 초기화가 성공적으로 완료되면 결제 기능을 구현합니다.
  } else {
    // 인앱 결제를 지원하지 않는 기기나 환경에 대한 처리 로직을 작성합니다.
  }
}

2.2. 상품 정보 가져오기

앱 내에서 판매할 상품 정보를 가져오려면 ProductDetailsResponse 객체를 사용해야 합니다. 아래는 상품 정보를 가져오고 출력하는 예시 코드입니다:

import 'package:in_app_purchase/in_app_purchase.dart';

void fetchProducts() async {
  final Set<String> identifiers = {'com.example.app.product1', 'com.example.app.product2'};
  final ProductDetailsResponse response = await InAppPurchase.instance.queryProductDetails(identifiers);

  if (response.notFoundIDs.isNotEmpty) {
    // 찾을 수 없는 상품의 처리 로직을 작성합니다.
  }

  for (ProductDetails product in response.productDetails) {
    // 상품 정보를 이용하여 화면에 출력하거나 결제 요청에 사용할 수 있습니다.
    print('Title: ${product.title}');
    print('Description: ${product.description}');
    print('Price: ${product.price}');
  }
}

2.3. 결제 요청하기

실제로 결제를 진행하기 위해서는 ProductDetails 객체와 함께 InAppPurchase.instance.buyNonConsumable() 메소드를 호출해야 합니다. 아래는 결제 요청 코드의 예시입니다:

import 'package:in_app_purchase/in_app_purchase.dart';

void initiatePurchase(ProductDetails product) async {
  final PurchaseParam purchaseParam = PurchaseParam(productDetails: product);
  InAppPurchase.instance.buyNonConsumable(purchaseParam: purchaseParam);
}

2.4. 구매 완료 처리

사용자가 결제를 완료하면 앱은 이를 감지하고 처리해야 합니다. 이를 위해 InAppPurchase.instance.purchaseStream을 사용합니다. 아래는 구매 완료 처리의 예시 코드입니다:

import 'package:in_app_purchase/in_app_purchase.dart';

void listenToPurchaseUpdated() {
  InAppPurchase.instance.purchaseStream.listen((List<PurchaseDetails> purchaseDetailsList) {
    for (PurchaseDetails purchaseDetails in purchaseDetailsList) {
      if (purchaseDetails.status == PurchaseStatus.purchased) {
        // 구매 완료 처리 로직을 작성합니다.
        // 사용자에게 제품을 제공하거나 추가 기능을 활성화하는 등의 행동을 수행합니다.
      } else if (purchaseDetails.status == PurchaseStatus.error) {
        // 구매 실패 처리 로직을 작성합니다.
        // 사용자에게 에러 메시지를 표시하거나 다른 대체 행동을 수행합니다.
      }
    }
  });
}

3. 결론

Flutter의 in_app_purchase 패키지를 사용하면 간단하게 플러터 앱에서 인앱 결제 기능을 구현할 수 있습니다. 위의 코드 예시를 참고하여 앱에 맞는 인앱 결제 시나리오를 구현해보세요.

더 많은 자세한 정보와 기능에 대해서는 in_app_purchase 패키지의 공식 문서를 참고하시기 바랍니다.