swiftui
swiftUI 에서 결제 위젯을 붙이려고 합니다.
webView.loadHTMLString(service.htmlString, baseURL: URL(string: "https://tosspayments.com"))
github에는 위젯이 아니라 결제 웹이 붙는형식으로 보입니다.
개인적으로
struct TossPaymentsWebView: UIViewRepresentable{
private let service: PaymentWidget? let payAmount : Int?
init(payAmount: Int? = nil) { self.payAmount = payAmount service = PaymentWidget(clientKey: SecureKeys.TossTestClientKey.rawValue, customerKey: "cskey") }
func makeUIView(context: Context) -> WKWebView { if let payAmount = payAmount{ if let webView = service?.renderPaymentMethods(amount: PaymentMethodWidget.Amount(value: Double(payAmount))){ return webView }else{ return WKWebView() } }else{ return WKWebView() }
}
func updateUIView(_ uiView: WKWebView, context: Context) {
}
} 이런식으로 결제 위젯까지는 뛰웠는데. requestPayment(info: DefaultWidgetPaymentInfo(orderId: "123", orderName: "test"), on: controller)에서 uiviewcontroller를 올리는데 문제가 생겼습니다. swiftui 에서 결제 위젯을 올리는 방법, 혹은 webView.loadHTMLString(service.htmlString, baseURL: URL(string: "https://tosspayments.com")) 페이지에서 결제 위젯처럼 간편결제리스트가 바로 보이게 할수있나요??
private let service: PaymentWidget? let payAmount : Int?
init(payAmount: Int? = nil) { self.payAmount = payAmount service = PaymentWidget(clientKey: SecureKeys.TossTestClientKey.rawValue, customerKey: "cskey") }
func makeUIView(context: Context) -> WKWebView { if let payAmount = payAmount{ if let webView = service?.renderPaymentMethods(amount: PaymentMethodWidget.Amount(value: Double(payAmount))){ return webView }else{ return WKWebView() } }else{ return WKWebView() }
}
func updateUIView(_ uiView: WKWebView, context: Context) {
}
} 이런식으로 결제 위젯까지는 뛰웠는데. requestPayment(info: DefaultWidgetPaymentInfo(orderId: "123", orderName: "test"), on: controller)에서 uiviewcontroller를 올리는데 문제가 생겼습니다. swiftui 에서 결제 위젯을 올리는 방법, 혹은 webView.loadHTMLString(service.htmlString, baseURL: URL(string: "https://tosspayments.com")) 페이지에서 결제 위젯처럼 간편결제리스트가 바로 보이게 할수있나요??
44 Replies
⏳ 잠시만 기다려주세요! 곧 답변드리겠습니다
오류 문의일 경우 아래 정보를 미리 전달해주시면, 빠른 답변에 도움이 됩니다.
- 주문번호(orderId) :
- 문의 내용 :
(img를 함께 첨부해주시면 도움이됩니다)
* 계약관련 내용은 1544-7772로 문의주세요.
* 주말/공휴일에는 답변이 늦을 수 있어요.
UIKit 을 써서 실행해주시겠어요?
아 지금 example을 실행하시는게 아니라
sdk를 직접 연동하시는 군요?
위젯에 간편결제 리스트가 안떠서 그런가요?
MID알려주시면 확인해드리겠습니다.
MID가 상점아이디가 맞나요?
네
bikinexbk7 입니다
음 위젯이 위와 같이 보이시지 않나요?

uikit을 사용하면
위젯이 렌더까지만 되고 그 이후에 버튼클릭이벤트를 따가가기가 어렵네요

아 BTN은 원래 직접 만들어주셔야합니다.
이후 BTN에 requestPayments Method이벤트를 실행해주시면 되요
예를들면
결제위젯 iOS SDK | 토스페이먼츠 개발자센터
결제위젯 iOS SDK를 추가하고 메서드를 사용하는 방법을 알아봅니다.
kakaopay버튼을 눌렀을때 어떤이벤트가 발생해서 제가 알아볼수있나요?
고객이 각각 버튼 클릭했을 때 이벤트는 현재 드리지 않고 있습니다.
requestPayment를 실행하면
현재 선택된 값으로 위젯이 알아서 이후 작업을 진행해줍니다.
var body: some View {
VStack {
TossPaymentsWebView(payAmount: payAmount)//웨젯을 부르는 화면..
Button { //func requestPayment(info: DefaultWidgetPaymentInfo, on rootViewController: UIViewController) } label: { Text("요기서 실행") } }
} 이런식으로 swiftui 에서 버튼을 올릴수도있는건가요? 아니면 버튼도 uikit에서 올리는건가요?
Button { //func requestPayment(info: DefaultWidgetPaymentInfo, on rootViewController: UIViewController) } label: { Text("요기서 실행") } }
} 이런식으로 swiftui 에서 버튼을 올릴수도있는건가요? 아니면 버튼도 uikit에서 올리는건가요?
버튼을 올린다는게 무슨뜻이죠?
버튼을 생성한다는 말씀이신가요?
네네 생성입니다
버튼은 어디든 직접 생성해주면 됩니다.
네 감사합니다
그러면
/func requestPayment(info: DefaultWidgetPaymentInfo, on rootViewController: UIViewController)
에서 uiviewcontroller는 무엇을 의미하는지요
여길 참고하세요.
결제위젯 iOS SDK | 토스페이먼츠 개발자센터
결제위젯 iOS SDK를 추가하고 메서드를 사용하는 방법을 알아봅니다.
uiviewcontroller 클래스가 무엇인지 질문하시는 걸까요?
https://developer.apple.com/documentation/uikit/uiviewcontroller
Apple Developer Documentation
UIViewController | Apple Developer Documentation
An object that manages a view hierarchy for your UIKit app.
아뇨...제 궁금증은..
uiviewrepresentable에서 uiviewcontroller를 정의하기가 애매해서 여쭤본겁니다.
네네 어느 부분에서 이슈가 있으신지는 이해했습니다.
^^
이부분은 저희 ios sdk개발자 분과 확인 후 답변드릴게요
네 감사합니다.
우선 iOS에서 swiftUI를 많이 사용하실텐데, 현재까지 해당 질문은 없었어서
구현하시는데는 전혀 문제가 없을 것 같기는해요
방법에 대해서는 확인해서 안내드리겠습니다. 금요일은 전사 단축근무라 답변이 늦어질 수 있습니다.
일반적으론 Representable이용해서 사용하는 것으로 아는데, 혹시 해결되면 공유도 부탁드리고
저희도 확인되는대로 전달드릴게요
그렇군요.... 알겠습니다.

제가 알고있기는 view가 viewcontroller의 계층구조아래인데...
rootview를 set하는 코드가 있길래..여쭤보고싶은겁니다.
일단 가장 쉽게 해결할 수 있는 방법은 rootViewController 를 uiviewpresentable 을 잊고 Window 에 있는 최상단의 UIVC를 사용하시면 될 것 같습니다.
swiftUI쪽은 추후 좀더 쉽게 연동하실 수 있도록 고도화될 예정이에요
rootViewController 를 uiviewpresentable 을 잊고 Window 에 있는 최상단의 UIVC를 사용하시면 될 것 같습니다
이게 무슨말씀인지 잘 모르겠습니다..^^;;
var body: some View {
VStack {
//결제전 위젯 뷰
TossPayView(service: vm.widget, payAmount: payAmount)
//버튼을 클릭하면 결제창으로 넘어감. Button { if let info = vm.PaymentInfo ,let widget = vm.widget{ print("info:(info)") widget.requestPayment(info: info, on:UIViewController()) } } label: { Text("CLICK") } } .onAppear{//PaymentWidget셋팅 vm.payAmount = payAmount vm.initSet() } } //버튼을 클릭하면 결제창으로 넘어감<< 이부분에서 uiviewcontroller를 현재처럼 새 클래스를 만들면 에러없이 빌드는 되지만
//버튼을 클릭하면 결제창으로 넘어감. Button { if let info = vm.PaymentInfo ,let widget = vm.widget{ print("info:(info)") widget.requestPayment(info: info, on:UIViewController()) } } label: { Text("CLICK") } } .onAppear{//PaymentWidget셋팅 vm.payAmount = payAmount vm.initSet() } } //버튼을 클릭하면 결제창으로 넘어감<< 이부분에서 uiviewcontroller를 현재처럼 새 클래스를 만들면 에러없이 빌드는 되지만
이렇게 금방 꺼지네요
제가 필요한게 uiview를 써도 되는데 위젯처럼 toss결제 페이지를 호출했을때 웹 과는 다르게 간편결제 버튼이 먼저나오면 되거든요.
혹시 이거 참조할만한 web이 있나요?
위젯처럼 toss결제 페이지를 호출했을때 웹 과는 다르게 간편결제 버튼이 먼저나오면 되거든요.이게 정확히 어떤걸 말씀하시는 걸까요?
@saiebi rootViewController 를 내부적으로 사용하지 않고 있었네요.
이부분은 수정 예정이니 임시로 아무 viewController 나 만들어서 넣어서 사용해도 무방합니다.
이게 간편결제 화면이고요,,
아래첨부가 web호출화면입니다.


web 호출화면을 카카오페이 계약하신 실제 라이브 키로 띄워보시면 카카오페이 표시 될겁니다.
우측화면에 카카오페이가 표시 되면 되는 건가요?
웹 호출화면은 토스페이, 페이북만 표시되어있어서. 감사합니다 swiftui에서 viewcontroller를 단독사용하기는 제가 알기로는 어려워서
네 간편결제 버튼들이 나열되면되는겁니다
그것때문에 widget을 계속시도하고있는겁니다.
현재 테스트 환경에서 카카오 페이가 지원되지 않는 상황이라 테스트키를 이용하면 표시가 안되는 것이고 실제 계약을 하셨다면 라이브키 사용하시면 보이게 될겁니다.

네 라이브로 돌리니까 카카오페이까지 표시되네요.
혹시 간편결제가 지금화면에 표시되는게 전부인지 아니면 다른 간편결제(naverpay등..)을 더 추가할 메뉴얼이있는지 알고싶습니다.
현재 보이시는 것에 삼성페이, 네이버 페이 추가가 가능하고,
이건 1544-7772 로 전화해서 신규 신청해주시면 됩니다.
네 감사합니다 그럼 위젯말고 웹페이지에서 결제로 작업하겠습니다 도움주셔서 고맙습니다.
네 감사합니다.
❤️ 기술문의 경험이 어떠셨나요?!
간단히 코멘트 남겨주세요! 제품 발전에 큰 힘이 됩니다.