{"id":32270558,"url":"https://github.com/portone-io/portone_flutter","last_synced_at":"2026-01-11T13:34:37.726Z","repository":{"id":35066025,"uuid":"202646508","full_name":"portone-io/portone_flutter","owner":"portone-io","description":"Flutter App에서 포트원 V1 결제서비스 연동을 위한 모듈입니다.","archived":false,"fork":false,"pushed_at":"2025-07-07T05:58:37.000Z","size":16548,"stargazers_count":74,"open_issues_count":46,"forks_count":45,"subscribers_count":22,"default_branch":"main","last_synced_at":"2025-10-22T22:38:54.277Z","etag":null,"topics":["certification","flutter","iamport","payment","portone"],"latest_commit_sha":null,"homepage":"","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/portone-io.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":"SUPPORT.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-08-16T02:45:37.000Z","updated_at":"2025-09-29T06:09:42.000Z","dependencies_parsed_at":"2024-01-05T02:39:34.504Z","dependency_job_id":"e0887daf-f268-4bb2-ad9d-ee056e0aaafe","html_url":"https://github.com/portone-io/portone_flutter","commit_stats":null,"previous_names":["portone-io/portone_flutter","iamport/iamport_flutter"],"tags_count":49,"template":false,"template_full_name":null,"purl":"pkg:github/portone-io/portone_flutter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/portone-io%2Fportone_flutter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/portone-io%2Fportone_flutter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/portone-io%2Fportone_flutter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/portone-io%2Fportone_flutter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/portone-io","download_url":"https://codeload.github.com/portone-io/portone_flutter/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/portone-io%2Fportone_flutter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":280528608,"owners_count":26345642,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-22T02:00:06.515Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["certification","flutter","iamport","payment","portone"],"created_at":"2025-10-22T22:39:17.376Z","updated_at":"2025-10-22T22:39:21.341Z","avatar_url":"https://github.com/portone-io.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"# portone_flutter\n[![pub package](https://img.shields.io/pub/v/portone_flutter.svg)](https://pub.dev/packages/portone_flutter)\n\n---\n포트원 V1 플러터 모듈입니다.\n\n## 목차\n- [버전정보](CHANGELOG.md)\n- [지원정보](SUPPORT.md)\n- 설치하기\n- 설정하기\n  - 공통 사항\n  - IOS 설정하기\n  - Android 설정하기\n  - [실시간 계좌이체 설정하기](example/manuals/TRANS.md)\n- [예제](example/README.md)\n- [콜백 함수 설정하기](example/manuals/CALLBACK.md)\n\n## 버전정보\n최신버전은 [v0.12.0](https://github.com/portone-io/portone_flutter/tree/main) 입니다. 버전 히스토리는 [버전정보](CHANGELOG.md)를 참고하세요.\n\n## 지원정보\n포트원 V1 플러터 모듈은 일반/정기결제 및 휴대폰 본인인증 기능을 지원합니다. 결제 모듈이 지원하는 PG사 및 결제수단에 대한 자세한 내용은 [지원정보](SUPPORT.md)를 참고해주세요.\n\n## 설치하기\n`pubspec.yaml` 파일에 `portone_flutter` 모듈을 추가해 귀하의 프로젝트에 포트원 V1 플러터 모듈을 설치할 수 있습니다.\n\n```\ndependencies:\n  portone_flutter: ^0.12.0\n```\n\n## 설정하기\n\n### IOS 설정하기\nIOS에서 포트원 V1 결제연동 모듈을 사용하기 위해서는 `info.plist` 파일에 아래 3가지 항목을 설정해주셔야 합니다. `[프로젝트 이름]/ios/Runner.xcworkspace` 파일을 열어 왼쪽 프로젝트 패널 \u003e Runner \u003e info.plist 파일을 클릭합니다.\n\n#### 1. App Scheme 등록\n외부 결제 앱(예) 페이코, 신한 판 페이)에서 결제 후 돌아올 때 사용할 URL identifier를 설정해야합니다.\n\n![](assets/images/app-scheme-registry.gif)\n\n1. `URL types` 속성을 추가합니다.\n2. item `0`를 확장하여 `URL schemes` 속성을 추가합니다.\n3. item `0`에 App URL Scheme 값(EX. example)을 작성합니다.\n\n```html\n...\n\u003ckey\u003eCFBundleURLTypes\u003c/key\u003e\n\u003carray\u003e\n  \u003cdict\u003e\n    \u003ckey\u003eCFBundleTypeRole\u003c/key\u003e\n    \u003cstring\u003eEditor\u003c/string\u003e\n    \u003ckey\u003eCFBundleURLSchemes\u003c/key\u003e\n    \u003carray\u003e\n      \u003c!-- URL Scheme 값 설정 --\u003e\n      \u003cstring\u003eexample\u003c/string\u003e\n    \u003c/array\u003e\n  \u003c/dict\u003e\n\u003c/array\u003e\n...\n```\n\n#### 2. 외부 앱 리스트 등록\n3rd party앱(예) 카드사 앱, 간편결제 앱 등)을 실행할 수 있도록 외부 앱 리스트를 등록해야합니다. \n\n1. [LSApplicationQueriesSchemes](https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/LaunchServicesKeys.html#//apple_ref/doc/uid/TP40009250-SW14) 속성을 추가합니다.\n2. 외부 앱 URL Scheme 값을 하나씩 추가합니다.\n\n```html\n...\n\u003ckey\u003eLSApplicationQueriesSchemes\u003c/key\u003e\n\u003carray\u003e\n  \u003cstring\u003ekftc-bankpay\u003c/string\u003e \u003c!-- 계좌이체 --\u003e\n  \u003cstring\u003eispmobile\u003c/string\u003e \u003c!-- ISP모바일 --\u003e\n  \u003cstring\u003eitms-apps\u003c/string\u003e \u003c!-- 앱스토어 --\u003e\n  \u003cstring\u003ehdcardappcardansimclick\u003c/string\u003e \u003c!-- 현대카드-앱카드 --\u003e\n  \u003cstring\u003esmhyundaiansimclick\u003c/string\u003e \u003c!-- 현대카드-공인인증서 --\u003e\n  \u003cstring\u003eshinhan-sr-ansimclick\u003c/string\u003e \u003c!-- 신한카드-앱카드 --\u003e\n  \u003cstring\u003esmshinhanansimclick\u003c/string\u003e \u003c!-- 신한카드-공인인증서 --\u003e\n  \u003cstring\u003ekb-acp\u003c/string\u003e \u003c!-- 국민카드-앱카드 --\u003e\n  \u003cstring\u003empocket.online.ansimclick\u003c/string\u003e \u003c!-- 삼성카드-앱카드 --\u003e\n  \u003cstring\u003eansimclickscard\u003c/string\u003e \u003c!-- 삼성카드-온라인결제 --\u003e\n  \u003cstring\u003eansimclickipcollect\u003c/string\u003e \u003c!-- 삼성카드-온라인결제 --\u003e\n  \u003cstring\u003evguardstart\u003c/string\u003e \u003c!-- 삼성카드-백신 --\u003e\n  \u003cstring\u003esamsungpay\u003c/string\u003e \u003c!-- 삼성카드-삼성페이 --\u003e\n  \u003cstring\u003escardcertiapp\u003c/string\u003e \u003c!-- 삼성카드-공인인증서 --\u003e\n  \u003cstring\u003elottesmartpay\u003c/string\u003e \u003c!-- 롯데카드-모바일결제 --\u003e\n  \u003cstring\u003elotteappcard\u003c/string\u003e \u003c!-- 롯데카드-앱카드 --\u003e\n  \u003cstring\u003ecloudpay\u003c/string\u003e \u003c!-- 하나카드-앱카드 --\u003e\n  \u003cstring\u003enhappcardansimclick\u003c/string\u003e \u003c!-- 농협카드-앱카드 --\u003e\n  \u003cstring\u003enonghyupcardansimclick\u003c/string\u003e \u003c!-- 농협카드-공인인증서 --\u003e\n  \u003cstring\u003ecitispay\u003c/string\u003e \u003c!-- 씨티카드-앱카드 --\u003e\n  \u003cstring\u003eciticardappkr\u003c/string\u003e \u003c!-- 씨티카드-공인인증서 --\u003e\n  \u003cstring\u003ecitimobileapp\u003c/string\u003e \u003c!-- 씨티카드-간편결제 --\u003e\n  \u003cstring\u003ekakaotalk\u003c/string\u003e \u003c!-- 카카오톡 --\u003e\n  \u003cstring\u003epayco\u003c/string\u003e \u003c!-- 페이코 --\u003e\n  \u003cstring\u003elpayapp\u003c/string\u003e \u003c!-- (구)롯데 L페이 --\u003e\n  \u003cstring\u003ehanamopmoasign\u003c/string\u003e \u003c!-- 하나카드 공인인증앱 --\u003e\n  \u003cstring\u003ewooripay\u003c/string\u003e \u003c!-- (구) 우리페이 --\u003e\n  \u003cstring\u003enhallonepayansimclick\u003c/string\u003e \u003c!-- NH 올원페이 --\u003e\n  \u003cstring\u003ehanawalletmembers\u003c/string\u003e \u003c!-- 하나카드(하나멤버스 월렛) --\u003e\n  \u003cstring\u003echaipayment\u003c/string\u003e \u003c!-- 차이 --\u003e\n  \u003cstring\u003ekb-auth\u003c/string\u003e \u003c!-- 국민 --\u003e\n  \u003cstring\u003ehyundaicardappcardid\u003c/string\u003e  \u003c!-- 현대카드 --\u003e\n  \u003cstring\u003ecom.wooricard.wcard\u003c/string\u003e  \u003c!-- 우리WON페이 --\u003e\n  \u003cstring\u003elmslpay\u003c/string\u003e  \u003c!-- 롯데 L페이 --\u003e\n  \u003cstring\u003elguthepay-xpay\u003c/string\u003e  \u003c!-- 페이나우 --\u003e\n  \u003cstring\u003eliivbank\u003c/string\u003e  \u003c!-- Liiv 국민 --\u003e\n  \u003cstring\u003esupertoss\u003c/string\u003e \u003c!-- 토스 --\u003e\n  \u003cstring\u003enewsmartpib\u003c/string\u003e \u003c!-- 우리WON뱅킹 --\u003e\n  \u003cstring\u003enaversearchthirdlogin\u003c/string\u003e \u003c!-- 네이버페이 앱 로그인 --\u003e\n\u003c/array\u003e\n...\n```\n\n#### 3. App Transport Security 설정\n\n![](assets/images/allow-arbitrary.gif)\n\n1. `App Transport Security Settings` 속성에 [Allow Arbitrary Loads in Web Content](https://developer.apple.com/documentation/bundleresources/information_property_list/nsapptransportsecurity/nsallowsarbitraryloadsinwebcontent) 속성을 추가합니다.\n2. 그 값을 `true`로 설정합니다.\n\n```html\n...\n\u003ckey\u003eNSAppTransportSecurity\u003c/key\u003e\n\u003cdict\u003e\n  \u003c!-- Allow Arbitrary Loads in Web Content 속성을 true로 설정 --\u003e\n  \u003ckey\u003eNSAllowsArbitraryLoadsInWebContent\u003c/key\u003e\n  \u003ctrue/\u003e\n  \u003ckey\u003eNSAllowsArbitraryLoads\u003c/key\u003e\n  \u003ctrue/\u003e\n\u003c/dict\u003e\n...\n```\n\n#### 4. PASS 앱 Universal Link 설정 (선택 사항)\nPush 알림 없이 PASS 앱(SKT PASS, KT 인증, U+인증)을 실행해 본인인증을 진행하기 위해서는 `mRedirectUrl` 파라미터 설정이 필요합니다.\n\n##### 4.1 mRedirectUrl 설정\n본인인증 요청 시 `CertificationData` 객체의 `mRedirectUrl` 파라미터에 `UrlData.redirectUrl` 값을 설정해 주세요. 다날의 경우, `mRedirectUrl` 설정 시 `carrier` 파라미터로 전달한 통신사 선택을 사용자가 변경할 수 없으므로 주의해주세요.\n\n```dart\nimport 'package:portone_flutter/model/certification_data.dart';\nimport 'package:portone_flutter/model/url_data.dart'; // UrlData import 추가\n\n// ...\n\nCertificationData data = CertificationData(\n  mRedirectUrl: UrlData.redirectUrl\n  // ... 기타 본인인증 데이터\n);\n\n// ...\n```\n\n### Android 설정하기\n안드로이드 API 레벨 30에서 특정 카드사로 결제 시도시 `net::ERR_CLEARTEXT_NOT_PERMITTED` 오류가 발생한다는 버그가 보고되었습니다. 이를 해결하기 위해서는 [AndroidManifest.xml](https://github.com/portone-io/portone_flutter/blob/develop/example/android/app/src/main/AndroidManifest.xml#L13) 파일에 아래와 같이 [usesclearTextTraffic](https://developer.android.com/guide/topics/manifest/application-element#usesCleartextTraffic) 속성을 `true`로 설정해주셔야 합니다.\n\n```xml\n\u003cmanifest ...\u003e\n    ...\n    \u003capplication\n        ...\n        android:usesCleartextTraffic=\"true\"\n    \u003e\n    \u003c/application\u003e\n\u003c/manifest\u003e\n```\n\n### 실시간 계좌이체 설정하기\n웹 표준 이니시스와 나이스 정보통신은 뱅크페이 앱을 통해 실시간 계좌이체를 진행합니다. 뱅크페이에서 결제 인증 후 본래의 앱으로 복귀 해 다음단계로 진행을 하려면 별도 설정이 요구됩니다. 자세한 내용은 [실시간 계좌이체 설정하기](example/manuals/TRANS.md)를 참고해주세요.\n\n\n## 예제\n포트원 V1 플러터 모듈로 아래와 같이 일반/정기결제 및 휴대폰 본인인증 기능을 구현할 수 있습니다. 보다 자세한 내용은 [예제](example/README.md)를 참고하세요.\n\n#### 일반/정기결제 예제\n```dart\nimport 'package:flutter/material.dart';\n\n/* 포트원 V1 결제 모듈을 불러옵니다. */\nimport 'package:portone_flutter/iamport_payment.dart';\n/* 포트원 V1 결제 데이터 모델을 불러옵니다. */\nimport 'package:portone_flutter/model/payment_data.dart';\n\nclass Payment extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return IamportPayment(\n      appBar: new AppBar(\n        title: new Text('포트원 V1 결제'),\n      ),\n      /* 웹뷰 로딩 컴포넌트 */\n      initialChild: Container(\n        child: Center(\n          child: Column(\n            mainAxisAlignment: MainAxisAlignment.center,\n            children: [\n              Image.asset('assets/images/iamport-logo.png'),\n              Padding(padding: EdgeInsets.symmetric(vertical: 15)),\n              Text('잠시만 기다려주세요...', style: TextStyle(fontSize: 20)),\n            ],\n          ),\n        ),\n      ),\n      /* [필수입력] 가맹점 식별코드 */\n      userCode: 'iamport',\n      /* [필수입력] 결제 데이터 */\n      data: PaymentData(\n        pg: 'html5_inicis',                                          // PG사\n        payMethod: 'card',                                           // 결제수단\n        name: '포트원 V1 결제데이터 분석',                                  // 주문명\n        merchantUid: 'mid_${DateTime.now().millisecondsSinceEpoch}', // 주문번호\n        amount: 39000,                                               // 결제금액\n        buyerName: '홍길동',                                           // 구매자 이름\n        buyerTel: '01012345678',                                     // 구매자 연락처\n        buyerEmail: 'example@naver.com',                             // 구매자 이메일\n        buyerAddr: '서울시 강남구 신사동 661-16',                         // 구매자 주소\n        buyerPostcode: '06018',                                      // 구매자 우편번호\n        appScheme: 'example',                                        // 앱 URL scheme\n        cardQuota : [2,3]                                            //결제창 UI 내 할부개월수 제한\n      ),\n      /* [필수입력] 콜백 함수 */\n      callback: (Map\u003cString, String\u003e result) {\n        Navigator.pushReplacementNamed(\n          context,\n          '/result',\n          arguments: result,\n        );\n      },\n    );\n  }\n}\n```\n\n\n#### 본인인증 예제\n\n이니시스 통합인증의 경우 다날 휴대폰 본인인증과 달리 `mRedirectUrl` 파라미터를 필수로 설정해주셔야 합니다.\n\n##### 다날 휴대폰 본인인증\n```dart\nimport 'package:flutter/material.dart';\n\n/* 포트원 V1 휴대폰 본인인증 모듈을 불러옵니다. */\nimport 'package:portone_flutter/iamport_certification.dart';\n/* 포트원 V1 휴대폰 본인인증 데이터 모델을 불러옵니다. */\nimport 'package:portone_flutter/model/certification_data.dart';\n\nclass Certification extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return IamportCertification(\n      appBar: new AppBar(\n        title: new Text('포트원 V1 본인인증'),\n      ),\n      /* 웹뷰 로딩 컴포넌트 */\n      initialChild: Container(\n        child: Center(\n          child: Column(\n            mainAxisAlignment: MainAxisAlignment.center,\n            children: [\n              Image.asset('assets/images/iamport-logo.png'),\n              Padding(padding: EdgeInsets.symmetric(vertical: 15)),\n              Text('잠시만 기다려주세요...', style: TextStyle(fontSize: 20)),\n            ],\n          ),\n        ),\n      ),\n      /* [필수입력] 가맹점 식별코드 */\n      userCode: 'iamport',\n      /* [필수입력] 본인인증 데이터 */\n      data: CertificationData(\n        pg: 'danal',                                                  // PG사\n        merchantUid: 'mid_${DateTime.now().millisecondsSinceEpoch}',  // 주문번호\n        company: '포트원 V1',                                           // 회사명 또는 URL\n        carrier: 'SKT',                                               // 통신사\n        name: '홍길동',                                                // 이름\n        phone: '01012341234',                                         // 전화번호\n      ),\n      /* [필수입력] 콜백 함수 */\n      callback: (Map\u003cString, String\u003e result) {\n        Navigator.pushReplacementNamed(\n          context,\n          '/result',\n          arguments: result,\n        );\n      },\n    );\n  }\n}\n```\n##### 이니시스 통합인증\n```dart\nimport 'package:flutter/material.dart';\n\n/* 포트원 V1 휴대폰 본인인증 모듈을 불러옵니다. */\nimport 'package:portone_flutter/iamport_certification.dart';\n/* 포트원 V1 휴대폰 본인인증 데이터 모델을 불러옵니다. */\nimport 'package:portone_flutter/model/certification_data.dart';\n\nclass Certification extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return IamportCertification(\n      appBar: new AppBar(\n        title: new Text('포트원 V1 본인인증'),\n      ),\n      /* 웹뷰 로딩 컴포넌트 */\n      initialChild: Container(\n        child: Center(\n          child: Column(\n            mainAxisAlignment: MainAxisAlignment.center,\n            children: [\n              Image.asset('assets/images/iamport-logo.png'),\n              Padding(padding: EdgeInsets.symmetric(vertical: 15)),\n              Text('잠시만 기다려주세요...', style: TextStyle(fontSize: 20)),\n            ],\n          ),\n        ),\n      ),\n      /* [필수입력] 가맹점 식별코드 */\n      userCode: 'iamport',\n      /* [필수입력] 본인인증 데이터 */\n      data: CertificationData(\n        pg: 'inicis_unified',                                         // PG사\n        merchantUid: 'mid_${DateTime.now().millisecondsSinceEpoch}',  // 주문번호\n        mRedirectUrl: 'https://example.com',                          // 본인인증 후 이동할 URL\n      ),\n      /* [필수입력] 콜백 함수 */\n      callback: (Map\u003cString, String\u003e result) {\n        Navigator.pushReplacementNamed(\n          context,\n          '/result',\n          arguments: result,\n        );\n      },\n    );\n  }\n}\n```\n\n## 콜백 함수 설정하기\n콜백 함수는 필수입력 필드로, 결제/본인인증 완료 후 라우트 이동을 위해 아래와 같이 로직을 작성할 수 있습니다. 콜백 함수에 대한 자세한 설명은 [콜백 설정하기](example/manuals/CALLBACK.md)를 참고하세요.\n\n```dart\n...\ncallback: (Map\u003cString, String\u003e result) {\n  Navigator.pushReplacementNamed(\n    context,\n    '/result',\n    arguments: result,\n  );\n},\n...\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fportone-io%2Fportone_flutter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fportone-io%2Fportone_flutter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fportone-io%2Fportone_flutter/lists"}