Cannot payment with virtual bank account on Flutter SDK
I'm trying to make payment with virtual bank account, on Flutter SDK. I used "클라이언트 키", however my payment tracking has problem
1. Select virtual account
2. Fill in account creation information
3. Select payment
4. payment view closes, I have paymentKey. However it should show virtual account for me to transfer money to.
When checking with paymentKey using api "https://api.tosspayments.com/v1/payments/:id" even payment method is "null".
paymentKey: hseou20250905005259PHWB5
orderId: e25efa41-1679-4731-b340-d27b47cbd2fb
merchantID: hseoula3r5
I want to know if this follow is correct, where did I go wrong, I'm not a Korean so I'm not familiar with this payment method.

17 Replies
⏳ 잠시만 기다려주세요! 곧 답변드리겠습니다
오류 문의일 경우 아래 정보를 미리 전달해주시면, 빠른 답변에 도움이 됩니다.
- 주문번호(orderId) :
- 문의 내용 :
(img를 함께 첨부해주시면 도움이됩니다)
* 계약관련 내용은 1544-7772로 문의주세요.
* 주말/공휴일에는 답변이 늦을 수 있어요.
When you call the confirm API, just like what you did with Card - it will return the account no
curl --location 'https://api.tosspayments.com/v1/payments/confirm' \
--header 'Authorization: Basic {secretKey}' \
--header 'Content-Type: application/json' \
--data '{
"paymentKey":"hseou202509051048201jUz3",
"orderId":"10da54f3-4425-442b-b3df-aa29ef3b0e31",
"amount": 3200
}'
{
"code": "FAILED_PAYMENT_INTERNAL_SYSTEM_PROCESSING",
"message": "[M006] 업체 사정으로 인해 결제를 일시 중지하였습니다.상점으로 문의하시기 바랍니다.#"
}
I got this error code after calling API confirm
An approval request(/v1/payments/confirm) was made using an invalid MID that is in a 'pre-application' state.
Please log in to the merchant admin page(https://dashboard.tosspayments.com/) and change the MID linked to the payment UI.
- Supporting document : https://docs.tosspayments.com/guides/v2/payment-widget/admin
결제위젯 어드민 설정하기 | 토스페이먼츠 개발자...
토스페이먼츠와 전자결제 계약을 완료했으면 결제위젯 어드민에서 결제 UI를 커스터마이징할 수 있어요.
The MID ‘hseoula3r5’ is invalid due to an incomplete contract application. Another MID has been successfully registered.
for this, please ask your Korean colleagues who is in charge of the contract with TossPayments for assistance, or let them know they should call our CS centre (1544-7772).
Can I use "결제위젯 연동 키라이브" instead of "API 개별 연동 키"?
How do you open the payment window?
By renderPaymentWidget() -> requestPayment()?
step 1:
paymentWidget = PaymentWidget( clientKey: PaymentConstants.tossPaymentsClientKey, customerKey: 'user${user?.id ?? Uuid().v4()}', ); step2: _renderPaymentMethods(); _paymentWidget .renderPaymentMethods( selector: PaymentConstants.paymentMethodsSelector, amount: Amount( value: widget.amount, currency: Currency.KRW, country: PaymentConstants.defaultCountry, ), ) .then((control) { _paymentMethodWidgetControl = control; if (mounted) { setState(() {}); } }); step 3: _renderAgreement() void _renderAgreement() { _paymentWidget .renderAgreement(selector: PaymentConstants.agreementSelector) .then((control) { _agreementWidgetControl = control; if (mounted) { setState(() {}); } }); } step 4: request payment final paymentResult = await _paymentWidget.requestPayment( paymentInfo: PaymentInfo( orderId: orderId, orderName: context.l10n.payment_order_name, customerName: user?.username, customerEmail: user?.email, customerMobilePhone: user?.phone, showCustomerMobilePhone: true, ), );
paymentWidget = PaymentWidget( clientKey: PaymentConstants.tossPaymentsClientKey, customerKey: 'user${user?.id ?? Uuid().v4()}', ); step2: _renderPaymentMethods(); _paymentWidget .renderPaymentMethods( selector: PaymentConstants.paymentMethodsSelector, amount: Amount( value: widget.amount, currency: Currency.KRW, country: PaymentConstants.defaultCountry, ), ) .then((control) { _paymentMethodWidgetControl = control; if (mounted) { setState(() {}); } }); step 3: _renderAgreement() void _renderAgreement() { _paymentWidget .renderAgreement(selector: PaymentConstants.agreementSelector) .then((control) { _agreementWidgetControl = control; if (mounted) { setState(() {}); } }); } step 4: request payment final paymentResult = await _paymentWidget.requestPayment( paymentInfo: PaymentInfo( orderId: orderId, orderName: context.l10n.payment_order_name, customerName: user?.username, customerEmail: user?.email, customerMobilePhone: user?.phone, showCustomerMobilePhone: true, ), );
Then please use 결제위젯 연동 키
but i can not pay? can you help me see if there is any mistake?
Please change the MID marked in the image.

I have changed it to this. In the "test" environment, everything works fine, I have created the "virtualAccount". But in the "live" environment, it doesn't work
"virtual Account": {
"account Number": "X3790138387250",
"accountType": "일반",
"bankCode": "88",
"customerName": "tuta0902",
"dueDate": "2025-09-12T16:01:26+09:00",
"expired": false,
"settlementStatus": "INCOMPLETED",
"refundStatus": "NONE",
"refundReceiveAccount": null,
"depositorName": null
},

Can you click the pencil icon next to 'hseoula3r5' and change the Merchant ID (MID) to 'hse*3v'?
I changed it but when "call api confirm" error still occurs

Thanks, I've confirmed the MID has been changed.
The contract is still under review, so you can’t make the live payment yet.
Please retry when your colleague confirms the contract is done.
도움을 주셔서 감사합니다. 즐거운 주말 보내세요!