@portone/mcp-server 0.15.0-alpha.5 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/assets/docs/blog/posts/2025-12/portone-chatbot.md +116 -0
  2. package/assets/docs/help/admin-console/analytics/content32.md +0 -32
  3. package/assets/docs/help/admin-console/console-account/content31.md +2 -10
  4. package/assets/docs/help/admin-console/console_home/content34.md +5 -44
  5. package/assets/docs/help/admin-console/integration/content28.md +9 -21
  6. package/assets/docs/help/admin-console/payment-service/content29.md +7 -153
  7. package/assets/docs/help/admin-console/pg-settlement/content30.md +2 -13
  8. package/assets/docs/help/admin-console/pg-settlement-history/content35.md +2 -9
  9. package/assets/docs/help/admin-console-2025-10-17.md +47 -0
  10. package/assets/docs/help/content61.md +1 -1
  11. package/assets/docs/help/core-service/channel-setting/danal.md +5 -5
  12. package/assets/docs/help/core-service/channel-setting/daou.md +5 -0
  13. package/assets/docs/help/core-service/channel-setting/galaxia.md +93 -0
  14. package/assets/docs/help/core-service/channel-setting/inicis.md +32 -49
  15. package/assets/docs/help/core-service/channel-setting/kcp_channel.md +60 -41
  16. package/assets/docs/help/core-service/channel-setting/kicc.md +57 -3
  17. package/assets/docs/help/core-service/channel-setting/kpn.md +3 -2
  18. package/assets/docs/help/core-service/channel-setting/mobilians.md +22 -27
  19. package/assets/docs/help/core-service/channel-setting/nice.md +8 -6
  20. package/assets/docs/help/core-service/channel-setting/payco.md +5 -3
  21. package/assets/docs/help/core-service/channel-setting/payletter.md +3 -3
  22. package/assets/docs/help/core-service/how-to-use/additional-galaxia.md +36 -0
  23. package/assets/docs/help/core-service/how-to-use/additional-mobilians.md +15 -21
  24. package/assets/docs/help/core-service/how-to-use/content200009.md +10 -9
  25. package/assets/docs/help/core-service/how-to-use/galaxia-contract.md +67 -0
  26. package/assets/docs/help/core-service/how-to-use/high-risk-industry.md +38 -46
  27. package/assets/docs/help/core-service/how-to-use/information-pg.md +3 -3
  28. package/assets/docs/help/core-service/how-to-use/kcp-contract.md +5 -1
  29. package/assets/docs/help/core-service/how-to-use/kicc-contract.md +38 -7
  30. package/assets/docs/help/core-service/how-to-use/mobilians-contract.md +26 -21
  31. package/assets/docs/help/core-service/how-to-use/requirements.md +5 -1
  32. package/assets/docs/help/core-service/how-to-use/shopify-guide.md +2 -2
  33. package/assets/docs/help/core-service/how-to-use/test-mode-cancel.md +6 -4
  34. package/assets/docs/help/core-service/how-to-use/wordpress-setting.md +2 -1
  35. package/assets/docs/help/core-service/payment-type/content200007.md +1 -1
  36. package/assets/docs/help/core-service/payment-type/content200047.md +28 -42
  37. package/assets/docs/help/core-service/payment-type/content200052.md +8 -1
  38. package/assets/docs/help/core-service/payment-type/hub-service-fee.md +1 -1
  39. package/assets/docs/help/core-service/payment-type/internationl-high-risk-industry.md +67 -26
  40. package/assets/docs/help/core-service/payment-type/internationl-pg.md +3 -1
  41. package/assets/docs/help/core-service/payment-type/schedule-requirement.md +1 -4
  42. package/assets/docs/help/faq/general-inquiry/confirm-process.md +5 -11
  43. package/assets/docs/help/faq/general-inquiry/portone-security.md +59 -0
  44. package/assets/docs/help/faq/general-inquiry/real-channel-info.md +1 -1
  45. package/assets/docs/help/faq/payment-faq/pg-max-min-amount.md +3 -3
  46. package/assets/docs/help/faq/payment-faq/vbank-service-detail.md +1 -1
  47. package/assets/docs/help/faq/payment-faq/vbank-test-guide.md +1 -8
  48. package/assets/docs/help/faq/platform-faq/platform_definition_partner.md +1 -1
  49. package/assets/docs/help/faq/platform-faq/platform_definition_settlement.md +1 -1
  50. package/assets/docs/help/faq/platform-faq/platform_definition_tax.md +24 -0
  51. package/assets/docs/help/faq/platform-faq/platform_introduction.md +1 -1
  52. package/assets/docs/help/faq/platform-faq/platform_introduction_conditions.md +19 -5
  53. package/assets/docs/help/faq/platform-faq/platform_nocode_hosting.md +1 -1
  54. package/assets/docs/help/faq/platform-faq/platform_nocode_use.md +1 -1
  55. package/assets/docs/help/faq/tax-invoice-faq/account_management_guide.md +37 -0
  56. package/assets/docs/help/faq/tax-invoice-faq/bulk_registration_account.md +16 -0
  57. package/assets/docs/help/faq/tax-invoice-faq/difference_account_partner.md +25 -0
  58. package/assets/docs/help/faq/{platform-faq → tax-invoice-faq}/platform_partnerships.md +1 -1
  59. package/assets/docs/help/faq/{platform-faq → tax-invoice-faq}/taxinvoice_bulk_issuance.md +1 -1
  60. package/assets/docs/help/faq/{platform-faq → tax-invoice-faq}/taxinvoice_cancel.md +1 -1
  61. package/assets/docs/help/faq/{platform-faq → tax-invoice-faq}/taxinvoice_delayed.md +1 -1
  62. package/assets/docs/help/faq/{platform-faq → tax-invoice-faq}/taxinvoice_forward_issuance.md +1 -1
  63. package/assets/docs/help/faq/{platform-faq → tax-invoice-faq}/taxinvoice_guide_atoz.md +1 -1
  64. package/assets/docs/help/faq/{platform-faq → tax-invoice-faq}/taxinvoice_partner_peristalsis.md +1 -1
  65. package/assets/docs/help/faq/{platform-faq → tax-invoice-faq}/taxinvoice_reverse_issuance_definition.md +1 -1
  66. package/assets/docs/help/faq/{platform-faq → tax-invoice-faq}/taxinvoice_reverse_issuance_partner_signup.md +1 -1
  67. package/assets/docs/help/notice-tosspayments-2026-01-15.md +62 -0
  68. package/assets/docs/help/notice-vape-2026-02-19.md +52 -0
  69. package/assets/docs/help/platform-2025-07-23.md +76 -0
  70. package/assets/docs/help/platform-2025-08-13.md +92 -0
  71. package/assets/docs/help/platform-2025-08-21.md +51 -0
  72. package/assets/docs/help/platform-2025-08-28.md +51 -0
  73. package/assets/docs/help/platform-2025-10-02.md +90 -0
  74. package/assets/docs/help/pricing/pg/domestic-and-oversea-fees.md +4 -2
  75. package/assets/docs/help/pricing/portone/portone-pricing.md +3 -1
  76. package/assets/docs/help/procedure/pg-application/content54.md +2 -0
  77. package/assets/docs/help/procedure/pg-application/start.md +8 -24
  78. package/assets/docs/help/procedure/recommendation/package.md +4 -2
  79. package/assets/docs/help/procedure/service-addition/add-service.md +2 -0
  80. package/assets/docs/help/service/identity-verification/identity-verification.md +2 -4
  81. package/assets/docs/help/service/integration-type/integration-type.md +1 -2
  82. package/assets/docs/help/service/pg/pg-service-list.md +29 -6
  83. package/assets/docs/opi/ko/console/guide/reg.md +1 -1
  84. package/assets/docs/opi/ko/extra/confirm-process/readme-v1.md +5 -7
  85. package/assets/docs/opi/ko/extra/confirm-process/readme-v2.md +2 -2
  86. package/assets/docs/opi/ko/extra/identity-verification/readme-v2.md +1 -1
  87. package/assets/docs/opi/ko/extra/link-pay/readme-v1.md +36 -4
  88. package/assets/docs/opi/ko/extra/manual-confirm/readme-v2.md +1 -1
  89. package/assets/docs/opi/ko/extra/mobile-payment/readme-v2.md +610 -0
  90. package/assets/docs/opi/ko/extra/smart-routing/intro.md +1 -1
  91. package/assets/docs/opi/ko/integration/cancel/v1/virtual-account.md +4 -1
  92. package/assets/docs/opi/ko/integration/cancel/v2/readme.md +4 -1
  93. package/assets/docs/opi/ko/integration/pg/v1/blue.md +36 -0
  94. package/assets/docs/opi/ko/integration/pg/v1/danal.md +134 -4
  95. package/assets/docs/opi/ko/integration/pg/v1/daou/readme.md +203 -28
  96. package/assets/docs/opi/ko/integration/pg/v1/eximbay.md +121 -19
  97. package/assets/docs/opi/ko/integration/pg/v1/galaxia.md +591 -0
  98. package/assets/docs/opi/ko/integration/pg/v1/inicis-jp.md +517 -0
  99. package/assets/docs/opi/ko/integration/pg/v1/inicis.md +177 -0
  100. package/assets/docs/opi/ko/integration/pg/v1/kakaopay.md +145 -2
  101. package/assets/docs/opi/ko/integration/pg/v1/kcp-v2-identity-verification.md +2 -0
  102. package/assets/docs/opi/ko/integration/pg/v1/kg-mobilians-v2.md +29 -18
  103. package/assets/docs/opi/ko/integration/pg/v1/kg.md +65 -12
  104. package/assets/docs/opi/ko/integration/pg/v1/kicc-v2.md +275 -0
  105. package/assets/docs/opi/ko/integration/pg/v1/kicc.md +117 -4
  106. package/assets/docs/opi/ko/integration/pg/v1/ksnet/readme.md +22 -2
  107. package/assets/docs/opi/ko/integration/pg/v1/naver.md +60 -0
  108. package/assets/docs/opi/ko/integration/pg/v1/newtoss/readme.md +117 -7
  109. package/assets/docs/opi/ko/integration/pg/v1/nhn-kcp/kcp-quickpay.md +24 -32
  110. package/assets/docs/opi/ko/integration/pg/v1/nhn-kcp/readme.md +164 -3
  111. package/assets/docs/opi/ko/integration/pg/v1/nice-v2/billing-api-caution.md +6 -6
  112. package/assets/docs/opi/ko/integration/pg/v1/nice-v2/readme.md +177 -2
  113. package/assets/docs/opi/ko/integration/pg/v1/nice.md +124 -5
  114. package/assets/docs/opi/ko/integration/pg/v1/payco.md +87 -3
  115. package/assets/docs/opi/ko/integration/pg/v1/payletter-global.md +142 -1
  116. package/assets/docs/opi/ko/integration/pg/v1/paymentwall.md +45 -1
  117. package/assets/docs/opi/ko/integration/pg/v1/paypal.md +38 -2
  118. package/assets/docs/opi/ko/integration/pg/v1/readme.md +9 -3
  119. package/assets/docs/opi/ko/integration/pg/v1/rt/readme.md +52 -16
  120. package/assets/docs/opi/ko/integration/pg/v1/settle/mybank.md +138 -56
  121. package/assets/docs/opi/ko/integration/pg/v1/settle/readme.md +50 -0
  122. package/assets/docs/opi/ko/integration/pg/v1/smartro-v2/readme.md +126 -0
  123. package/assets/docs/opi/ko/integration/pg/v1/smartro.md +78 -0
  124. package/assets/docs/opi/ko/integration/pg/v1/smilepay.md +49 -3
  125. package/assets/docs/opi/ko/integration/pg/v1/spb/readme.md +96 -25
  126. package/assets/docs/opi/ko/integration/pg/v1/toss-brandpay/module.md +1 -1
  127. package/assets/docs/opi/ko/integration/pg/v1/toss-brandpay/readme.md +34 -2
  128. package/assets/docs/opi/ko/integration/pg/v1/toss.md +114 -1
  129. package/assets/docs/opi/ko/integration/pg/v1/tosspay-v2/readme.md +74 -15
  130. package/assets/docs/opi/ko/integration/pg/v1/tosspay.md +41 -1
  131. package/assets/docs/opi/ko/integration/pg/v1/welcome/readme.md +12 -0
  132. package/assets/docs/opi/ko/integration/pg/v2/galaxia.md +662 -0
  133. package/assets/docs/opi/ko/integration/pg/v2/inicis-jp.md +6 -18
  134. package/assets/docs/opi/ko/integration/pg/v2/inicis-unified-identity-verification.md +0 -4
  135. package/assets/docs/opi/ko/integration/pg/v2/inicis-v2.md +2 -2
  136. package/assets/docs/opi/ko/integration/pg/v2/kcp-v2-identity-verification.md +1 -1
  137. package/assets/docs/opi/ko/integration/pg/v2/kcp-v2.md +2 -2
  138. package/assets/docs/opi/ko/integration/pg/v2/kicc-v2.md +316 -0
  139. package/assets/docs/opi/ko/integration/pg/v2/kpn.md +3 -3
  140. package/assets/docs/opi/ko/integration/pg/v2/ksnet.md +8 -0
  141. package/assets/docs/opi/ko/integration/pg/v2/paymentwall.md +171 -0
  142. package/assets/docs/opi/ko/integration/pg/v2/readme.md +16 -0
  143. package/assets/docs/opi/ko/integration/pg/v2/smartro-v2.md +1 -1
  144. package/assets/docs/opi/ko/integration/pg/v2/triple-a.md +342 -0
  145. package/assets/docs/opi/ko/integration/pg/v2/welcome.md +1 -1
  146. package/assets/docs/opi/ko/integration/ready/readme.md +113 -164
  147. package/assets/docs/opi/ko/integration/start/v1/non-auth.md +1 -1
  148. package/assets/docs/opi/ko/integration/start/v2/checkout.md +59 -29
  149. package/assets/docs/opi/ko/integration/using-ai-tools.md +42 -0
  150. package/assets/docs/opi/ko/quick-guide/payment.md +5 -5
  151. package/assets/docs/opi/ko/readme.md +2 -2
  152. package/assets/docs/opi/ko/support/code-info/pg-2.md +2 -2
  153. package/assets/docs/opi/ko/support/code-info/pg-3.md +3 -3
  154. package/assets/docs/opi/ko/support/code-info/pg.md +1 -1
  155. package/assets/docs/platform/ko/guides/dictionary.md +47 -0
  156. package/assets/docs/release-notes/api-sdk/2023-07-03.md +3 -3
  157. package/assets/docs/release-notes/platform/2023-08-31.md +2 -2
  158. package/assets/docs/release-notes/platform/2024-08-22.md +5 -5
  159. package/assets/docs/release-notes/platform/2024-10-21.md +9 -9
  160. package/assets/docs/release-notes/platform/2025-02-10.md +2 -2
  161. package/assets/docs/release-notes/platform/2026-02-19.md +55 -0
  162. package/assets/docs/release-notes/platform/2026-03-06.md +198 -0
  163. package/assets/docs/schema/browser-sdk.yml +390 -11
  164. package/assets/docs/schema/v1.openapi.json +297 -72
  165. package/assets/docs/schema/v1.openapi.yml +228 -112
  166. package/assets/docs/schema/v2.openapi.json +16438 -21985
  167. package/assets/docs/schema/v2.openapi.yml +8669 -12670
  168. package/assets/docs/sdk/ko/v1-sdk/javascript-sdk/payrq.md +10 -2
  169. package/assets/docs/sdk/ko/v1-sdk/javascript-sdk/payrt.md +1 -1
  170. package/assets/docs/sdk/ko/v2-mobile-sdk/android.md +62 -24
  171. package/assets/docs/sdk/ko/v2-mobile-sdk/react-native.md +82 -95
  172. package/assets/docs/sdk/ko/v2-mobile-sdk/readme.md +5 -4
  173. package/assets/docs/v1-docs-full.md +5249 -753
  174. package/assets/docs/v2-docs-full.md +2855 -265
  175. package/assets/docs/website-links.md +18 -7
  176. package/manifest.json +1 -1
  177. package/package.json +12 -12
  178. package/server/index.js +12 -12
  179. package/assets/docs/opi/ko/integration/pg/v1/hyphen.md +0 -196
  180. package/assets/docs/opi/ko/integration/pg/v1/nhn-kcp.md +0 -1152
  181. package/assets/docs/opi/ko/integration/pg/v2/hyphen.md +0 -205
  182. package/assets/docs/schema/browser-sdk.schema.json +0 -510
@@ -0,0 +1,610 @@
1
+ ---
2
+ title: 모바일 앱에서 결제 연동하기
3
+ description: 모바일 앱(Android, iOS, Flutter, React Native)에서 포트원 결제를 연동하는 방법을 안내합니다.
4
+ targetVersions:
5
+ - v2
6
+ ---
7
+
8
+ 포트원은 Android, iOS, Flutter, React Native용 공식 V2 SDK를 제공하고 있으며,
9
+ V2 SDK가 제공되지 않는 플랫폼이나,
10
+ 앱이 이미 WebView로 구성되어 있는 경우에는 WebView에서 직접 연동할 수 있습니다.
11
+ ([WebView 앱 연동 사례](https://github.com/portone-io/iamport-react-native/blob/HEAD/exampleForWebView/README.md))
12
+
13
+ ## 연동원리
14
+
15
+ 모바일 앱에서 결제를 연동하기 전에, 모바일 결제가 어떻게 동작하는지 이해해야 합니다.
16
+
17
+ ### 왜 WebView를 사용하는가?
18
+
19
+ 대부분의 PG사(카드사, 간편결제 등)는 **웹 기반 결제 UI만 제공**합니다.
20
+ 카드 번호 입력 폼, 3DS 인증, 간편결제 동의 화면은 모두 웹 페이지로 구현되어 있습니다.
21
+
22
+ 따라서 모바일 앱에서도 네이티브 UI가 아닌 **WebView 안에서 결제 UI를 표시**하게 됩니다.
23
+ 포트원의 모바일 SDK는 이 WebView를 자동으로 관리하는 얇은 래퍼이며,
24
+ SDK 없이 연동할 경우 WebView를 직접 구성해야 합니다.
25
+
26
+ ### 결제 흐름
27
+
28
+ 사용자가 앱에서 결제를 시작하면 다음 과정이 진행됩니다.
29
+
30
+ ```markdown
31
+ 1. 앱이 WebView를 열고, 포트원 Browser SDK가 포함된 페이지를 로드
32
+ 2. Browser SDK가 PG 결제 UI를 WebView에 표시
33
+ 3. 사용자가 카드 정보 입력 / 간편결제 인증 진행
34
+ 4. (필요시) 외부 앱 실행 — 은행 앱, 카카오페이 등
35
+ 5. 외부 앱에서 인증 완료 → Deep Link로 앱 복귀
36
+ 6. PG가 결제 결과와 함께 redirectUrl로 리다이렉트
37
+ 7. 앱이 리다이렉트를 가로채서 결과 추출
38
+ 8. 서버에서 결제 검증 후 주문 완료
39
+ ```
40
+
41
+ 포트원 모바일 SDK는 1\~7단계를 자동으로 처리합니다.
42
+
43
+ ### 웹 결제와의 차이점
44
+
45
+ `PortOne.requestPayment()`는 결제창이 뜨기 전에 발생하는 오류(파라미터 형식 오류, 네트워크 통신 실패 등)를 Promise에서 throw합니다.
46
+ 이는 모바일 WebView에서도 동일하지만, 결제 결과는 웹 브라우저와 달리 **리다이렉트 방식**으로 받아야 합니다.
47
+
48
+ ```typescript
49
+ PortOne.requestPayment({
50
+ // ... 결제 파라미터
51
+ redirectUrl: "myapp://payment-complete",
52
+ appScheme: "myapp://",
53
+ });
54
+ ```
55
+
56
+ 1. `redirectUrl`에 결제 완료 후 리다이렉트될 URL을 지정합니다. 결제 내에서 사용하지 않을 URL이면 됩니다.
57
+ 2. `appScheme`에 앱의 URL scheme을 지정합니다. 이 값은 카드사 앱에 전달되어, 인증 완료 후 앱으로 복귀할 때 사용됩니다.
58
+ 3. 결제 완료 시 WebView가 `redirectUrl`로 이동하며, 쿼리 파라미터에 결제 결과가 포함됩니다.
59
+ 4. 앱이 이 URL을 가로채서 쿼리 파라미터에서 결과를 추출합니다.
60
+
61
+ <div class="hint" data-style="info">
62
+
63
+ 모바일 결제에서는 `redirectUrl` 설정이 필수입니다.
64
+ 설정하지 않으면 결제 UI가 정상적으로 표시되지 않을 수 있습니다.
65
+
66
+ </div>
67
+
68
+ <div class="hint" data-style="info">
69
+
70
+ 결제 파라미터에 대한 자세한 내용은 [리다이렉트 방식의 경우](https://developers.portone.io/opi/ko/integration/start/v2/checkout?v=v2#3-1-리다이렉트-방식의-경우) 문서를 참고하세요.
71
+
72
+ </div>
73
+
74
+ ### 외부 앱 처리
75
+
76
+ 결제 도중 PG사의 결제 페이지가 카드사 앱카드, ISP 인증, 계좌이체 앱 등을 실행하기 위해
77
+ `kftc-bankpay://`, `ispmobile://`, `intent://` 같은 URL로 WebView를 이동시키는 경우가 있습니다.
78
+
79
+ **모바일 브라우저**(Safari, Chrome)에서는 이러한 커스텀 URL scheme을 만나면 OS에 자동으로 전달하여 해당 앱을 실행합니다.
80
+ 하지만 **앱 내 WebView는 웹 콘텐츠 렌더링 전용**이므로 이 동작이 기본적으로 지원되지 않습니다.
81
+
82
+ - iOS `WKWebView`: HTTP/HTTPS가 아닌 scheme으로의 네비게이션을 차단합니다.
83
+ - Android `WebView`: 알 수 없는 scheme에 대해 오류 페이지(`ERR_UNKNOWN_URL_SCHEME`)를 표시합니다.
84
+
85
+ 따라서 WebView의 URL 네비게이션 이벤트를 가로채서, 네이티브 코드에서 OS API를 호출하여 외부 앱을 직접 실행해야 합니다.
86
+
87
+ |URL 유형 |예시 |처리 방법 |
88
+ |-------------------|--------------------|--------------------------|
89
+ |일반 웹 URL |`https://...` |WebView에서 정상 로드 |
90
+ |PG/카드사 앱 scheme|`kftc-bankpay://...`|해당 외부 앱 실행 |
91
+ |Android Intent |`intent://...` |Intent URI 파싱 후 앱 실행|
92
+ |커스텀 scheme |`myapp://...` |결제 완료 — 결과 추출 |
93
+
94
+ 포트원 모바일 SDK는 이 URL 인터셉트 및 외부 앱 실행을 자동으로 처리합니다.
95
+
96
+ ## SDK를 사용한 연동
97
+
98
+ 포트원은 Android, iOS, React Native, Flutter용 공식 모바일 SDK를 제공합니다.
99
+ SDK가 위 연동원리에서 설명한 WebView 생성, 외부 앱 실행, 결제 결과 수신을 모두 자동으로 처리하므로 가장 간편한 연동 방식입니다.
100
+
101
+ SDK를 지원하는 플랫폼이라면 SDK를 사용하는 것을 권장합니다.
102
+
103
+ |플랫폼 |SDK |설치 방법 |레퍼런스 |
104
+ |------------|---------------------------|---------------------|--------------------------------------------------------|
105
+ |Android |`android-sdk` |JitPack |[GitHub](https://github.com/portone-io/android-sdk) |
106
+ |iOS |`PortOneSDK` |Swift Package Manager|[GitHub](https://github.com/portone-io/ios-sdk) |
107
+ |React Native|`@portone/react-native-sdk`|npm |[GitHub](https://github.com/portone-io/react-native-sdk)|
108
+ |Flutter |`portone_flutter` |pub.dev |[GitHub](https://github.com/portone-io/portone_flutter) |
109
+
110
+ <div class="hint" data-style="info">
111
+
112
+ 각 SDK의 설치 및 사용법은 [모바일 SDK 레퍼런스](https://developers.portone.io/sdk/ko/v2-mobile-sdk/readme)를 참고하세요.<br />
113
+ 다양한 플랫폼의 연동 예시는 [portone-sample GitHub 저장소](https://github.com/portone-io/portone-sample)에서 확인하실 수 있습니다.
114
+
115
+ </div>
116
+
117
+ ---
118
+
119
+ ## SDK 없이 직접 연동하기
120
+
121
+ V2 SDK가 제공되지 않는 플랫폼이나 WebView를 직접 제어하고 싶은 경우,
122
+ 아래 단계를 따라 연동할 수 있습니다.
123
+
124
+ ### Step 1. 의존성 설치
125
+
126
+ WebView를 표시하고 외부 앱을 실행하기 위한 라이브러리를 설치합니다.
127
+
128
+ <div class="tabs-container">
129
+
130
+ <div class="tabs-content" data-title="Flutter">
131
+
132
+ ```yaml title="pubspec.yaml"
133
+ dependencies:
134
+ flutter_inappwebview: ^6.1.5 # WebView
135
+ url_launcher: ^6.3.1 # 외부 앱 실행
136
+ ```
137
+
138
+ ```shell
139
+ flutter pub get
140
+ ```
141
+
142
+ </div>
143
+
144
+ <div class="tabs-content" data-title="Android (Kotlin)">
145
+
146
+ Android의 `WebView`는 기본 제공되므로 별도 의존성이 필요하지 않습니다.
147
+
148
+ `build.gradle`에서 minSdk 21 이상을 확인하세요.
149
+
150
+ ```kotlin title="build.gradle.kts"
151
+ android {
152
+ defaultConfig {
153
+ minSdk = 21
154
+ }
155
+ }
156
+ ```
157
+
158
+ </div>
159
+
160
+ <div class="tabs-content" data-title="iOS (Swift)">
161
+
162
+ iOS의 `WKWebView`는 WebKit 프레임워크에 기본 포함되어 있으므로 별도 의존성이 필요하지 않습니다.
163
+
164
+ 배포 대상은 iOS 14 이상을 권장합니다.
165
+
166
+ </div>
167
+
168
+ <div class="tabs-content" data-title="React Native">
169
+
170
+ `react-native-webview`로 WebView를 표시하고, `Linking` API로 외부 앱을 실행합니다.
171
+
172
+ ```shell
173
+ npm install react-native-webview
174
+ ```
175
+
176
+ iOS의 경우 추가로 Pod을 설치합니다.
177
+
178
+ ```shell
179
+ cd ios && pod install
180
+ ```
181
+
182
+ </div>
183
+
184
+ </div>
185
+
186
+ ### Step 2. 플랫폼 필수 설정
187
+
188
+ 결제 과정에서 은행 앱, 간편결제 앱 등 외부 앱이 실행됩니다.
189
+ OS 정책상 실행 가능한 외부 앱을 사전에 선언해야 하며, **이 설정이 없으면 외부 앱 실행이 실패합니다.**
190
+
191
+ <div class="hint" data-style="info">
192
+
193
+ Flutter와 React Native는 크로스 플랫폼 프레임워크이므로 Android와 iOS 설정을 **모두** 적용해야 합니다.
194
+
195
+ </div>
196
+
197
+ <div class="tabs-container">
198
+
199
+ <div class="tabs-content" data-title="Flutter">
200
+
201
+ Flutter 프로젝트에서는 각 플랫폼의 네이티브 설정 파일에 직접 추가합니다.
202
+
203
+ - **Android**: `android/app/src/main/AndroidManifest.xml` — Android 탭의 `queries` 내용을 추가합니다.
204
+ - **iOS**: `ios/Runner/Info.plist` — iOS 탭의 `LSApplicationQueriesSchemes`와 `CFBundleURLTypes` 내용을 추가합니다.
205
+
206
+ </div>
207
+
208
+ <div class="tabs-content" data-title="Android">
209
+
210
+ Android 11(API 30) 이상에서는 **패키지 가시성** 정책에 따라 AndroidManifest.xml에 결제 앱 패키지를 선언해야 합니다.
211
+
212
+ ```xml title="AndroidManifest.xml"
213
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android">
214
+ <queries>
215
+ <package android:name="com.kftc.bankpay.android" /> <!-- 뱅크페이 -->
216
+ <package android:name="kvp.jjy.MispAndroid320" /> <!-- ISP / 페이북 -->
217
+ <package android:name="com.hyundaicard.appcard" /> <!-- 현대카드 -->
218
+ <package android:name="com.shcard.smartpay" /> <!-- 신한 SOL페이 -->
219
+ <package android:name="com.shinhan.smartcaremgr" /> <!-- 신한 슈퍼SOL -->
220
+ <package android:name="com.shinhan.sbanking" /> <!-- 신한 SOL뱅크 -->
221
+ <package android:name="com.kbcard.cxh.appcard" /> <!-- KB Pay -->
222
+ <package android:name="com.kbstar.kbbank" /> <!-- KB스타뱅킹 -->
223
+ <package android:name="kr.co.samsungcard.mpocket" /> <!-- 삼성카드 -->
224
+ <package android:name="com.samsung.android.spay" /> <!-- Samsung Wallet -->
225
+ <package android:name="net.ib.android.smcard" /> <!-- monimo -->
226
+ <package android:name="com.lcacApp" /> <!-- 디지로카 (롯데카드) -->
227
+ <package android:name="com.lottemembers.android" /> <!-- L.POINT with L.PAY -->
228
+ <package android:name="com.hanaskcard.paycla" /> <!-- 하나Pay (하나카드) -->
229
+ <package android:name="nh.smart.nhallonepay" /> <!-- NH Pay -->
230
+ <package android:name="kr.co.citibank.citimobile" /> <!-- 씨티모바일 -->
231
+ <package android:name="com.kakao.talk" /> <!-- 카카오톡 (카카오페이) -->
232
+ <package android:name="com.nhnent.payapp" /> <!-- PAYCO -->
233
+ <package android:name="com.wooricard.smartapp" /> <!-- 우리카드 우리WON카드 -->
234
+ <package android:name="com.wooribank.smart.npib" /> <!-- 우리은행 우리WON뱅킹 -->
235
+ <package android:name="viva.republica.toss" /> <!-- 토스 -->
236
+ <package android:name="com.nhn.android.search" /> <!-- 네이버 (네이버페이) -->
237
+ <package android:name="com.kakaobank.channel" /> <!-- 카카오뱅크 -->
238
+ <package android:name="com.ahnlab.v3mobileplus" /> <!-- V3 Mobile Plus -->
239
+ <package android:name="com.TouchEn.mVaccine.webs" /> <!-- 터치엔 엠백신 -->
240
+ <package android:name="com.sktelecom.tauth" /> <!-- PASS by SKT -->
241
+ <package android:name="com.kt.ktauth" /> <!-- PASS by KT -->
242
+ <package android:name="com.lguplus.smartotp" /> <!-- PASS by U+ -->
243
+ <package android:name="com.mysmilepay.app" /> <!-- 스마일페이 -->
244
+ <package android:name="com.ssg.serviceapp.android.egiftcertificate" /> <!-- SSGPAY -->
245
+ <package android:name="com.hanabank.mzplatform" /> <!-- 아이부자 -->
246
+ <package android:name="com.knb.psb" /> <!-- BNK경남은행 -->
247
+ <package android:name="kr.ac.yonsei.idcard" /> <!-- 연세페이 -->
248
+ <package android:name="jp.naver.line.android" /> <!-- LINE (LINE Pay) -->
249
+ <package android:name="com.eg.android.AlipayGphone" /> <!-- Alipay -->
250
+ <package android:name="hk.alipay.wallet" /> <!-- AlipayHK -->
251
+ <package android:name="com.tencent.mm" /> <!-- WeChat -->
252
+ <package android:name="com.globe.gcash.android" /> <!-- GCash -->
253
+ <package android:name="th.co.truemoney.wallet" /> <!-- TrueMoney -->
254
+ <intent>
255
+ <action android:name="android.intent.action.VIEW" />
256
+ <category android:name="android.intent.category.BROWSABLE" />
257
+ <data android:scheme="https" />
258
+ </intent>
259
+ </queries>
260
+ </manifest>
261
+ ```
262
+
263
+ 앱이 외부 결제 앱에서 복귀할 수 있도록 커스텀 URL scheme도 등록합니다.
264
+ 결제를 시작하는 Activity의 `intent-filter`에 앱의 URL scheme을 추가합니다.
265
+
266
+ ```xml title="AndroidManifest.xml"
267
+ <application ...>
268
+ <activity
269
+ android:name=".MainActivity"
270
+ android:launchMode="singleTask"
271
+ android:exported="true">
272
+ <intent-filter>
273
+ <action android:name="android.intent.action.MAIN" />
274
+ <category android:name="android.intent.category.LAUNCHER" />
275
+ </intent-filter>
276
+ <intent-filter>
277
+ <action android:name="android.intent.action.VIEW" />
278
+ <category android:name="android.intent.category.DEFAULT" />
279
+ <category android:name="android.intent.category.BROWSABLE" />
280
+ <data android:scheme="myapp" />
281
+ </intent-filter>
282
+ </activity>
283
+ </application>
284
+ ```
285
+
286
+ </div>
287
+
288
+ <div class="tabs-content" data-title="iOS">
289
+
290
+ Info.plist에 `LSApplicationQueriesSchemes`를 등록하여 결제 앱의 URL scheme을 선언해야 합니다.
291
+ iOS 15 이상에서는 최대 50개까지 등록할 수 있으므로, 필요한 항목만을 추가합니다.
292
+
293
+ ```xml title="Info.plist"
294
+ <key>LSApplicationQueriesSchemes</key>
295
+ <array>
296
+ <string>kftc-bankpay</string> <!-- 뱅크페이 -->
297
+ <string>ispmobile</string> <!-- ISP / 페이북 -->
298
+ <string>hdcardappcardansimclick</string> <!-- 현대카드 -->
299
+ <string>shinhan-sr-ansimclick</string> <!-- 신한 SOL페이 -->
300
+ <string>shinhan-sr-ansimclick-payco</string> <!-- 신한 SOL페이 (PAYCO) -->
301
+ <string>shinhan-sr-ansimclick-lpay</string> <!-- 신한 SOL페이 (L.PAY) -->
302
+ <string>kb-acp</string> <!-- KB Pay -->
303
+ <string>kbbank</string> <!-- KB스타뱅킹 -->
304
+ <string>mpocket.online.ansimclick</string> <!-- 삼성카드 -->
305
+ <string>lotteappcard</string> <!-- 디지로카 (롯데카드) -->
306
+ <string>lmslpay</string> <!-- L.POINT with L.PAY -->
307
+ <string>cloudpay</string> <!-- 하나Pay (하나카드) -->
308
+ <string>nhallonepayansimclick</string> <!-- NH Pay -->
309
+ <string>citimobileapp</string> <!-- 씨티모바일 (씨티카드) -->
310
+ <string>kakaotalk</string> <!-- 카카오톡 (카카오페이) -->
311
+ <string>payco</string> <!-- PAYCO -->
312
+ <string>com.wooricard.wcard</string> <!-- 우리카드 우리WON카드 -->
313
+ <string>newsmartpib</string> <!-- 우리은행 우리WON뱅킹 -->
314
+ <string>supertoss</string> <!-- 토스 -->
315
+ <string>naversearchthirdlogin</string> <!-- 네이버 (네이버페이) -->
316
+ <string>kakaobank</string> <!-- 카카오뱅크 -->
317
+ <string>tauthlink</string> <!-- PASS by SKT -->
318
+ <string>ktauthexternalcall</string> <!-- PASS by KT -->
319
+ <string>upluscorporation</string> <!-- PASS by U+ -->
320
+ <string>kn-bankpay</string> <!-- BNK경남은행 -->
321
+ <string>yonseipay</string> <!-- 연세페이 -->
322
+ <string>line</string> <!-- LINE (LINE Pay) -->
323
+ <string>alipays</string> <!-- Alipay -->
324
+ <string>alipayhk</string> <!-- AlipayHK -->
325
+ <string>weixin</string> <!-- WeChat -->
326
+ <string>ascendmoney</string> <!-- TrueMoney -->
327
+ </array>
328
+ ```
329
+
330
+ 앱이 외부 결제 앱에서 복귀할 수 있도록 커스텀 URL scheme도 등록합니다.
331
+
332
+ ```xml title="Info.plist"
333
+ <key>CFBundleURLTypes</key>
334
+ <array>
335
+ <dict>
336
+ <key>CFBundleURLSchemes</key>
337
+ <array>
338
+ <string>myapp</string>
339
+ </array>
340
+ </dict>
341
+ </array>
342
+ ```
343
+
344
+ </div>
345
+
346
+ <div class="tabs-content" data-title="React Native">
347
+
348
+ React Native 프로젝트에서는 각 플랫폼의 네이티브 설정 파일에 직접 추가합니다.
349
+
350
+ - **Android**: `android/app/src/main/AndroidManifest.xml` — Android 탭의 `queries` 내용을 추가합니다.
351
+ - **iOS**: `ios/<프로젝트명>/Info.plist` — iOS 탭의 `LSApplicationQueriesSchemes`와 `CFBundleURLTypes` 내용을 추가합니다.
352
+
353
+ </div>
354
+
355
+ </div>
356
+
357
+ ### Step 3. WebView에서 결제 페이지 로드
358
+
359
+ WebView를 생성하고 포트원 Browser SDK가 포함된 HTML을 로드합니다.
360
+ `redirectUrl`에 결제 완료 후 리다이렉트될 URL을, `appScheme`에 카드사 앱 등에서 복귀할 때 사용할 앱 URL scheme을 지정합니다.
361
+
362
+ <div class="hint" data-style="warning">
363
+
364
+ WebView에 HTML 텍스트를 직접 로드하는 경우 `data:` 또는 `file:` 등의 opaque URL이 사용됩니다.
365
+ 이 상태에서 `postMessage`를 사용하면 [정상 동작하지 않을 수 있으니](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#targetorigin) 주의하세요.
366
+ `baseUrl`을 `https://` URL로 임의 설정하여 해소할 수 있습니다.
367
+
368
+ </div>
369
+
370
+ ```html
371
+ <!doctype html>
372
+ <html>
373
+ <head>
374
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
375
+ <script src="https://cdn.portone.io/v2/browser-sdk.js"></script>
376
+ <script>
377
+ PortOne.requestPayment({
378
+ storeId: "store-...",
379
+ paymentId: "payment-...",
380
+ orderName: "주문명",
381
+ totalAmount: 1000,
382
+ currency: "KRW",
383
+ channelKey: "channel-key-...",
384
+ payMethod: "CARD",
385
+ redirectUrl: "myapp://payment-complete",
386
+ appScheme: "myapp://",
387
+ });
388
+ </script>
389
+ </head>
390
+ </html>
391
+ ```
392
+
393
+ <div class="hint" data-style="info">
394
+
395
+ 위 예시는 이해를 돕기 위한 최소 구성입니다.
396
+ 실제 연동 시에는 [결제대행사별 연동 가이드](https://developers.portone.io/opi/ko/integration/pg/v2/readme?v=v2)및 [브라우저 SDK 요청 형식](https://developers.portone.io/sdk/ko/v2-sdk/payment-request?v=v2)에 따라 파라미터를 추가하세요.
397
+
398
+ </div>
399
+
400
+ <div class="hint" data-style="warning">
401
+
402
+ Android `WebView`는 JavaScript가 기본 비활성화이므로 `settings.javaScriptEnabled = true` 설정이 필요합니다.
403
+ (iOS `WKWebView`와 Flutter `InAppWebView`는 기본 활성화입니다.)
404
+
405
+ 결제 완료 시 WebView가 `redirectUrl`로 이동하므로,
406
+ 다음 Step의 URL 네비게이션 처리에서 해당 URL을 구분할 수 있어야 합니다.
407
+
408
+ </div>
409
+
410
+ ### Step 4. URL 네비게이션 처리
411
+
412
+ WebView에서 발생하는 URL 네비게이션을 프로토콜별로 분기 처리해야 합니다.
413
+ 아래 코드는 분기 처리의 핵심 로직만 발췌한 것입니다.
414
+
415
+ |URL 프로토콜 |처리 방법 |
416
+ |------------------------------------------|-------------------------------------------|
417
+ |`http://`, `https://` |WebView에서 정상 로드 |
418
+ |커스텀 scheme (`myapp://`) |결제 완료 — URL 쿼리 파라미터에서 결과 추출|
419
+ |`intent://` (Android) |Intent URI를 파싱하여 해당 앱 실행 |
420
+ |PG/카드사 앱 scheme (`kftc-bankpay://` 등)|해당 외부 앱 실행 |
421
+
422
+ <div class="hint" data-style="info">
423
+
424
+ 엑심베이 GCash 결제는 `intent://`나 `gcash://`가 아닌 `https://gcash.onelink.me` URL을 사용하며,
425
+ 이때 `gcash://com.mynt.gcash/app`을 직접 호출해야 합니다.
426
+ 자세한 처리는 [React Native SDK의 해당 부분](https://github.com/portone-io/react-native-sdk/blob/03dac55/src/SdkDelegate.tsx#L96-L103)을 참고하세요.
427
+
428
+ </div>
429
+
430
+ <div class="tabs-container">
431
+
432
+ <div class="tabs-content" data-title="Flutter (Dart)">
433
+
434
+ `InAppWebView`의 `shouldOverrideUrlLoading` 콜백에서 URL scheme별로 분기합니다.<br />
435
+ 전체 동작하는 예시는 [portone\_flutter SDK의 portone\_webview.dart](https://github.com/portone-io/portone_flutter/blob/233b101/lib/v2/widget/portone_webview.dart#L114-L151)를 참고하세요.
436
+
437
+ ```dart
438
+ InAppWebView(
439
+ initialSettings: InAppWebViewSettings(
440
+ useShouldOverrideUrlLoading: true,
441
+ resourceCustomSchemes: ["intent"],
442
+ ),
443
+ shouldOverrideUrlLoading: (controller, navigateAction) async {
444
+ // URI 파서는 플랫폼마다 동작이 다를 수 있으므로 (예: 페이북),
445
+ // rawValue에서 직접 protocol을 추출합니다.
446
+ final uri = navigateAction.request.url!.rawValue;
447
+ var protocol = uri.substring(0, uri.indexOf(':'));
448
+
449
+ switch (protocol) {
450
+ case 'http':
451
+ case 'https':
452
+ return NavigationActionPolicy.ALLOW;
453
+ case 'myapp':
454
+ // 결제 완료 — 쿼리 파라미터에서 결과 추출
455
+ return NavigationActionPolicy.CANCEL;
456
+ case 'intent':
457
+ // intent:// URI에서 scheme을 추출하여 앱 실행
458
+ // 미설치 시 마켓으로 이동
459
+ return NavigationActionPolicy.CANCEL;
460
+ default:
461
+ // PG/카드사 앱 등 외부 앱 실행
462
+ if (await canLaunchUrlString(uri)) launchUrlString(uri);
463
+ return NavigationActionPolicy.CANCEL;
464
+ }
465
+ },
466
+ )
467
+ ```
468
+
469
+ </div>
470
+
471
+ <div class="tabs-content" data-title="Android (Kotlin)">
472
+
473
+ `WebViewClient`의 `shouldOverrideUrlLoading`에서 URL scheme별로 분기합니다.<br />
474
+ 전체 구현은 [Android SDK의 PortOneWebView.kt](https://github.com/portone-io/android-sdk/blob/c3aeec4/sdk/src/main/java/io/portone/sdk/android/PortOneWebView.kt#L75-L111)를 참고하세요.
475
+
476
+ ```kotlin
477
+ webView.settings.javaScriptEnabled = true
478
+
479
+ webView.webViewClient = object : WebViewClient() {
480
+ override fun shouldOverrideUrlLoading(
481
+ view: WebView, request: WebResourceRequest
482
+ ): Boolean {
483
+ val url = request.url
484
+ return when (url.scheme) {
485
+ "http", "https" -> false // WebView에서 정상 로드
486
+ "myapp" -> {
487
+ // 결제 완료 — 쿼리 파라미터에서 결과 추출
488
+ handlePaymentResult(url)
489
+ true
490
+ }
491
+ "intent" -> {
492
+ // Intent URI 파싱 후 앱 실행, 미설치 시 마켓 이동
493
+ launchIntentOrMarket(url)
494
+ true
495
+ }
496
+ else -> {
497
+ // PG/카드사 앱 등 외부 앱 실행
498
+ startActivity(Intent(Intent.ACTION_VIEW, url))
499
+ true
500
+ }
501
+ }
502
+ }
503
+ }
504
+ ```
505
+
506
+ </div>
507
+
508
+ <div class="tabs-content" data-title="iOS (Swift)">
509
+
510
+ `WKNavigationDelegate`의 `decidePolicyFor`에서 URL scheme별로 분기합니다.<br />
511
+ 전체 구현은 [iOS SDK의 PaymentWebView.swift](https://github.com/portone-io/ios-sdk/blob/a88175c/Sources/PortOneSdk/PaymentWebView.swift#L117-L181)를 참고하세요.
512
+
513
+ ```swift
514
+ func webView(
515
+ _ webView: WKWebView,
516
+ decidePolicyFor navigationAction: WKNavigationAction,
517
+ decisionHandler: @escaping (WKNavigationActionPolicy) -> Void
518
+ ) {
519
+ guard let url = navigationAction.request.url else {
520
+ decisionHandler(.allow)
521
+ return
522
+ }
523
+
524
+ switch url.scheme {
525
+ case "http", "https":
526
+ decisionHandler(.allow)
527
+ case "myapp":
528
+ // 결제 완료 — 쿼리 파라미터에서 결과 추출
529
+ handlePaymentResult(url: url)
530
+ decisionHandler(.cancel)
531
+ default:
532
+ // PG/카드사 앱 등 외부 앱 실행
533
+ UIApplication.shared.open(url)
534
+ decisionHandler(.cancel)
535
+ }
536
+ }
537
+ ```
538
+
539
+ </div>
540
+
541
+ <div class="tabs-content" data-title="React Native">
542
+
543
+ `react-native-webview`의 `onShouldStartLoadWithRequest`에서 URL scheme별로 분기합니다.<br />
544
+ 전체 구현은 [React Native SDK의 SdkDelegate.tsx](https://github.com/portone-io/react-native-sdk/blob/deea773/src/SdkDelegate.tsx#L83-L156)를 참고하세요.
545
+
546
+ ```tsx
547
+ import { Linking } from "react-native";
548
+ import { WebView } from "react-native-webview";
549
+
550
+ <WebView
551
+ source={{ html: paymentHtml }}
552
+ originWhitelist={["*"]}
553
+ javaScriptEnabled
554
+ onShouldStartLoadWithRequest={(request) => {
555
+ const url = request.url;
556
+ const protocol = url.split(":", 2)[0];
557
+
558
+ switch (protocol) {
559
+ case "http":
560
+ case "https":
561
+ return true;
562
+ case "myapp":
563
+ // 결제 완료 — 쿼리 파라미터에서 결과 추출
564
+ handlePaymentResult(url);
565
+ return false;
566
+ case "intent":
567
+ // intent:// URI에서 scheme을 추출하여 앱 실행
568
+ // 미설치 시 마켓으로 이동
569
+ launchIntentOrMarket(url);
570
+ return false;
571
+ default:
572
+ // PG/카드사 앱 등 외부 앱 실행
573
+ Linking.openURL(url).catch(() => {});
574
+ return false;
575
+ }
576
+ }}
577
+ />;
578
+ ```
579
+
580
+ </div>
581
+
582
+ </div>
583
+
584
+ ### Step 5. 결제 결과 처리
585
+
586
+ 결제가 완료되면 `redirectUrl`로 리다이렉트되며, 쿼리 파라미터에 결제 결과가 포함됩니다.
587
+ 파라미터에 대한 자세한 내용은 [리다이렉트 방식의 경우](https://developers.portone.io/opi/ko/integration/start/v2/checkout?v=v2#3-1-리다이렉트-방식의-경우) 문서를 참고하세요.
588
+
589
+ <div class="hint" data-style="warning">
590
+
591
+ `redirectUrl`로 이동하기 전에 앱이 종료되는 경우도 있습니다.
592
+ 이 경우 앱이 결제 종료를 서버에 알릴 수 없으므로, 서버에서
593
+ [웹훅](https://developers.portone.io/opi/ko/integration/start/v2/checkout#5-웹훅-연동하기) 또는 [수동 승인](https://developers.portone.io/opi/ko/integration/start/v2/checkout#3-1-리다이렉트-방식의-경우) 기능을 함께 사용하는 것을 권장합니다.
594
+
595
+ </div>
596
+
597
+ <div class="hint" data-style="warning">
598
+
599
+ 클라이언트 측 결제 결과만으로 주문을 확정하면 안됩니다. 서버에서 [결제 조회 API](https://developers.portone.io/api/rest-v2/payment#get%20%2Fpayments%2F%7BpaymentId%7D)를 호출하여 결제 상태와 금액을 검증해야 합니다.
600
+
601
+ </div>
602
+
603
+ 서버 측 결제 검증 방법은 [인증 결제 연동하기 - 결제 완료 처리 (서버)](https://developers.portone.io/opi/ko/integration/start/v2/checkout#4-결제-완료-처리-서버)를 참고하세요.
604
+
605
+ ## 참고 링크
606
+
607
+ - [모바일 SDK 레퍼런스](https://developers.portone.io/sdk/ko/v2-mobile-sdk/readme)
608
+ - [결제 연동 샘플 프로젝트](https://github.com/portone-io/portone-sample)
609
+ - [인증 결제 연동하기](https://developers.portone.io/opi/ko/integration/start/v2/checkout) (웹 결제 연동 가이드)
610
+ - [결제 조회 API](https://developers.portone.io/api/rest-v2/payment#get%20%2Fpayments%2F%7BpaymentId%7D) (서버 측 검증)
@@ -42,7 +42,7 @@ API 빌링키 발급 요청 시 스마트 라우팅 그룹 아이디를 지정
42
42
  - **다날** : 카드 / 실시간 계좌이체 / 가상계좌 / 휴대폰 소액결제
43
43
  - **키움페이** : 카드 / 실시간 계좌이체 / 가상계좌
44
44
  - **헥토파이낸셜** : 카드 / 실시간 계좌이체 / 가상계좌 / 휴대폰 소액결제
45
- - **KG모빌리언스** : 카드 / 실시간 계좌이체 / 가상계좌 / 휴대폰 소액결제
45
+ - **KG파이낸셜** : 카드 / 실시간 계좌이체 / 가상계좌 / 휴대폰 소액결제
46
46
  - **KSNET** : 카드 / 실시간 계좌이체 / 가상계좌 / 휴대폰 소액결제
47
47
  - **이지페이(KICC)** : 카드 / 실시간 계좌이체 / 가상계좌 / 휴대폰 소액결제
48
48
  - **웰컴페이먼츠** : 카드 / 실시간 계좌이체 / 가상계좌 / 휴대폰 소액결제
@@ -20,6 +20,9 @@ versionVariants:
20
20
 
21
21
  PG사는 이런 과정에서 발생할 수 있는 혼란을 미연에 방지하고자 **가상계좌 특약서비스에 가입한 고객사에 한해서만 가상계좌 환불을 제공**하고 있습니다.
22
22
 
23
+ 단, **토스페이먼츠**의 경우 별도의 특약 가입 없이도 가상계좌 환불이 가능합니다.
24
+ 이 경우 환불 시 기존 거래에서 발생한 수수료는 환불되지 않습니다.
25
+
23
26
  </div>
24
27
 
25
28
  가상계좌의 경우 단방향 결제수단이여서 환불 대상을 알 수 없으므로 환불 금액 외에 다음의 환불 수령계좌 정보를 입력해야 합니다.
@@ -32,7 +35,7 @@ PG사는 이런 과정에서 발생할 수 있는 혼란을 미연에 방지하
32
35
 
33
36
  **가상계좌 은행코드는 PG사에 따라 다릅니다**
34
37
 
35
- `은행코드는`같은 은행이더라도 PG사에 따라 상이하므로 \*\*은행코드(TODO)\*\*표에서 은행코드를 확인해 주세요
38
+ 은행코드는 같은 은행이더라도 PG사에 따라 상이하므로 [은행코드표](https://developers.portone.io/opi/ko/support/code-info/pg-1?v=v1)에서 은행코드를 확인해 주세요.
36
39
 
37
40
  </div>
38
41
 
@@ -31,6 +31,9 @@ PG사를 통해 직접 취소할 경우 포트원과 결제 상태가 동기화
31
31
 
32
32
  PG사는 이런 과정에서 발생할 수 있는 혼란을 미연에 방지하고자 **가상계좌 특약서비스에 가입한 고객사에 한해서만 가상계좌 환불을 제공**하고 있습니다.
33
33
 
34
+ 단, **토스페이먼츠**의 경우 별도의 특약 가입 없이도 가상계좌 환불이 가능합니다.
35
+ 이 경우 환불 시 기존 거래에서 발생한 수수료는 환불되지 않습니다.
36
+
34
37
  </div>
35
38
 
36
39
  - **필수 정보**: 환불 계좌 정보 (`refundAccount.bank`, `refundAccount.number`, `refundAccount.holderName`)
@@ -262,7 +265,7 @@ try {
262
265
 
263
266
  **계좌 은행**
264
267
 
265
- [Bank](https://developers.portone.io/api/rest-v2/type-def#Bank) 타입 참고
268
+ [Bank](https://developers.portone.io/api/rest-v2/payment#Bank) 타입 참고
266
269
 
267
270
  - number: string
268
271