ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Flutter - 안드로이드 인앱 결제
    flutter 2025. 1. 8. 17:14
    반응형

    안녕하세요 오늘은 flutter 에서 안드로이드 인앱 결제를 구현한 내용을 작성해 볼게요.

    in_app_purchase: 3.2.0 를 설치해줍니다.

    https://pub.dev/packages/in_app_purchase

     

    in_app_purchase | Flutter package

    A Flutter plugin for in-app purchases. Exposes APIs for making in-app purchases through the App Store and Google Play.

    pub.dev

     

    먼저 상품을 등록해 줍니다.

     

    구글 플레이 콘솔 접속 -> 설정 탭이동

    탬플릿을 만들어 줍니다. (안만들어줘도 됨. 하지만 외국에서도 결제 서비스를 넣어주기 위해 탬플릿을 만들어 줍니다.)

     

     

     

    상품 이름을 작성해줍니다. 사용자들에게 보이는 이름은 아닙니다.

    이후 가격을 설정해줍니다.

    한국금액을 설정합니다.

    환율로 자동 등록 되지만 국가마다 금액을 다르게 설정할수 있도록 원하는 국가에 금액을 변경해줍니다.

     

    이후 저장을 눌러주면 아래와 같이 만들어 집니다.

     


    이후 설정에서 수익창출에 결제 프로필로 이동합니다.

     

    결제 프로필 선택시 아래와 같이 이미지가 나옵니다.

    결제 프로필을 만들어 볼텐데 

    프로필란에 회사 정보를 입력해줍니다. 추가로 지급받을 방법에 대해 설정합니다.

    결제 받을 계좌 등을 입력해줍니다.

     

    이후 계좌 인증이 이루어 질텐데요

    등록 계좌에 구글이 돈을 넣어줄거에요

    그돈이 인증 번호 이며

     

    [Web발신] 2025/01/04 07:10 입금 192원 KR-GOOGLE 600******* 기업

     

    아래와 같이 입급이 192원 되면 인증 번호는 192이고 인증후 계좌 등록이 완료 됩니다.

     


     

     

    이후 인앱 상품을 등록할 앱으로 이동합니다.

    앱 이동후 paly를 통한 수익 창출에서 제품 - 인앱 상품으로 이동합니다.

     

     

    만약 아직 인앱 상품이 없다고 뜬다면 안드로이드 스튜디오에서 aab 파일을 새로 업로드 해줍니다.

    특별한 것없이 기존에 있는 파일을 빌드해서 올려줍니다.

    그러면 인앱 상품을 추가 할수 있게 화면이 아래와 같이 바뀌게 됩니다.

     

     

     

    만약 상품을 만들수 apk파일 업로드라고 뜬다면 

     

    상품 만들기 선택후 

    먼자 제품 ID 를 입력하라고 뜹니다.

     

    해당 ID는 코드에서 상품을 불러오게 되는 PK입니다,

    이후 이름과 상픔 설명을 간략히 입력해줍니다.

     

    가장 중요한 가격을 선택할텐데요

    아래처럼 가격을 설정할수 있습니다.

    1. 위에서 작성한 템플릿 가격 선택

    2. 일반 가격 설정

    두가지 중에 고르면 됩니다.

    가격 템플릿 선택시 

    해당 이미지 처럼 템플릿 목록이 나옵니다.

    일반 가격 설정시 

    보시는 것처럼 커다란 팝업이 뜹니다

     

    세금및 규정 준수 설정은 제품에 맞게 선택해 줍니다.

     

    등록이 끝나면 아래처럼 나옵니다. 비활성화 시 활성화를 해주세요!

     


     

    초기화 설정

    // 인앱 결제 객체 초기화
      @override
      void onInit() async {
        iap = InAppPurchase.instance;
        // 판매 중인 상품 정보 가져오기
        getProducts();
        // 구매 업데이트 이벤트 감지
        purchaseUpdatedSubscription = iap.purchaseStream.listen((purchaseDetailsList) {
          // 인앱 결제 상태 업데이트 이벤트 처리
          purchaseDetailsList.forEach((PurchaseDetails purchaseDetails) async {
            if (purchaseDetails.status == PurchaseStatus.purchased) {
              // 구매가 성공했을 때 검증 및 처리
              bool isVerified = await verifyPurchase(purchaseDetails);
              if (isVerified && purchaseDetails.pendingCompletePurchase) {
                SlackApi().sendMessage("*** 후원 성공 [name: ${name.value} : user_seq: ${user_seq.value}] *** : ${purchaseDetails.productID}", true);
                await InAppPurchase.instance.completePurchase(purchaseDetails);
                AllService().addPayment(purchaseDetails, donationPrice.value, donationPriceEn.value);
              }
            } else if (purchaseDetails.status == PurchaseStatus.error) {
              // 에러가 발생한 경우 처리
              if (purchaseDetails.pendingCompletePurchase) {
                SlackApi().sendMessage("*** 후원 에러 [name: ${name.value} : user_seq: ${user_seq.value}] *** : ${purchaseDetails.productID}", false);
                await InAppPurchase.instance.completePurchase(purchaseDetails);
              }
            }
          });
        });
        super.onInit();
        
        
        @override
      void dispose() {
        // 구매 업데이트 이벤트 감지 스트림 중지
        purchaseUpdatedSubscription?.cancel();
        super.dispose();
      }

     

    상품 목록 가져오기

     // 판매 중인 상품 정보 읽기
      Future<void> getProducts() async {
        const Set<String> kIds = {
          'donation_500',
        };
    
        final ProductDetailsResponse response = await iap.queryProductDetails(kIds);
        if (response.notFoundIDs.isNotEmpty) {}
        products = response.productDetails;
      }

     

    상품 구매하기

     Future<void> buyProduct(ProductDetails product) async {
        final PurchaseParam purchaseParam = PurchaseParam(productDetails: product);
        try {
          await iap.buyConsumable(purchaseParam: purchaseParam, autoConsume: true);
          Get.back();
        } catch (e) {
        }
      }

     

    코드 작성이 끝났다면


     

    테스트

     

    다시 콘솔 홈으로 와서 설정으로 이동

    수익창출에서 라이선스 테스트를 입력합니다.

     

    접속후 이메일 목록에서 라이선스 테스터 선택을 합니다

     

    테스트 폰에 등록되어있는 구글 계정을 넣어준다.

    이후 테스트를 하면 

    정상적으로 나온다.

    반응형

    'flutter' 카테고리의 다른 글

    Flutter - ios 인앱 결제  (0) 2025.01.09
    bootpay flutter 결제 연동  (0) 2025.01.03
    paypal 결제 시스템 연동 (1)  (0) 2025.01.02
    Stripe 결제 Flutter 와 연동하기  (2) 2025.01.02
    flutter 네이버 로그인 구현  (2) 2024.12.05

    댓글

Designed by Tistory.