월드코인 환불하기

# 학습 과정 소개

메이플스토리 월드에서는 크리에이터가 자신의 월드에서 상품을 제작해 판매할 수 있습니다. 하지만 여러 가지 이유로 상품을 구매한 유저에게 환불 요청을 받을 수 있습니다. 메이플스토리 월드에서는 크리에이터 편의를 위해 상품 구매 관련 로그를 제공할 예정이나 아직은 로그 조회 시스템을 구축하는 중입니다. 시스템이 완성되기 전까지는 크리에이터가 직접 자신의 월드에 구매 정보를 기록하고 조회하는 스크립트를 추가해두어야 합니다.   
이번 시간에는 월드 내 상품 구매 정보를 기록/조회하는 방법과 이를 토대로 유저에게 환불해 주는 방법을 알아보겠습니다.

# 월드코인 환불 의무

원칙적으로 크리에이터가 판매 중인 아이템이 아래 경우에 해당한다면 구매자에게 월드코인을 환불해 주어야 합니다.   
1\. 이용자가 월드 내에서 구매한 유료 상품(콘텐츠, 아이템 등)을 미사용하였으며 구매일로부터 7일이 지나지 않았을 경우 2\. 크리에이터가 임의로 유료 상품(콘텐츠, 아이템 등)을 삭제 또는 변경하여 보유 중인 상품(콘텐츠, 아이템 등)에 중대한 영향을 준 경우 3\. 월드 내 유료 상품(콘텐츠, 아이템 등)의 섬네일 또는 설명과 실제 지급된 상품이 다를 경우   


> 더 알아보기 월드코인 환불 관련 상세 내용은 의 8\. 환불(코인 반환)정책을 참고 바랍니다.

  
특히 3번 항목에는 크리에이터의 실수로 유저의 월드코인만 소비시키고 실제 아이템 지급이 되지 않은 경우도 해당됩니다. 이런 경우에는 구매자의 환불 요구가 정당한지 먼저 확인해야 합니다. 구매자가 정상적으로 코인을 지불했는데도 상품을 획득하지 못한 것이 맞는지 확인 후 환불 여부를 결정해야 하기 때문입니다. 이제 상품 구매 정보를 기록하고 조회하는 방법을 살펴봅시다. 

# 상품 구매 정보 기록하기

상품 구매 정보를 기록하는 예제 코드는 아래와 같습니다.
    
    
    @Component
    script PurchaseInfoLogger extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            -- 구매자의 상품 구매 요청에 대한 콜백 함수 등록
            _WorldShopService:SetProcessPurchaseCallback(function(purchaseInfo)
                -- 구매에 대한 처리가 완료되면 관련 정보를 기록합니다.
                _LogStorageService:LogPurchaseInfo(purchaseInfo, "아이템 구매 완료")
            end)
        end
    end
    

이와 같은 형태로 월드 내에서 상품 구매 요청이 발생할 경우, 관련 정보가 기록되도록 처리합니다.

# 상품 구매 정보 조회하기

기록한 구매 정보를 조회하는 예제 코드를 살펴봅시다.
    
    
    @Component
    script PurchaseLogProcessor extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            -- 협정 세계시 기준으로 11월 25일부터 11월 30일 사이에 기록된 구매 정보를 조회합니다.
            local fromDate = DateTime(2022, 11, 25)
            local toDate = DateTime(2022, 11, 30)
            _LogStorageService:GetPurchaseLogPagesAsync(fromDate, toDate, function(purchaseLogPages)  
                while true do
                    -- GetCurrentPageDatas()로 현재 페이지의 목록을 가져옵니다.
                    local purchaseLogs = purchaseLogPages:GetCurrentPageDatas()
            
                    for index, purchaseLog in ipairs(purchaseLogs) do
                        -- 가져온 목록을 순회하며 기록된 내용을 확인합니다.
                        -- 추가로 기록할 로직이 있다면 이곳에 넣으면 됩니다.
                        log(purchaseLog)
                    end
            
                    -- PurchaseLogPages의 IsLastPage 프로퍼티를 통해 현재 페이지가 마지막 페이지인지 확인할 수 있습니다.
                    if purchaseLogPages.IsLastPage == true then
                        break
                    end
            
                    -- MoveToNextPageAndWait()로 다음 페이지로 넘어갈 수 있습니다.
                    purchaseLogPages:MoveToNextPageAndWait()
                end
            end)
        end
    end
    

  
구매 정보를 조회하는 방법은 크리에이터가 원하는 형태로 구현하면 됩니다. 예를 들어, 본인이 제작하고 출시한 월드에 접속했을 때 크리에이터에게만 보이는 별도의 UI를 만들고 해당 UI에서 상품 구매 정보를 조회하는 형태로 구현할 수도 있습니다. 상품 구매 정보 조회는 메이커에서 테스트할 수 없고 월드 출시 이후 확인할 수 있습니다. 비공개 월드로 출시하여 조회가 정상적으로 진행되는지 확인한 후 공개 전환하는 것을 권장합니다. 

# 환불 방법

위와 같은 절차로 구매 정보를 확인했을 때 구매자의 환불 요청이 정당하다고 판단되면 크리에이터는 구매자에게 환불해 주어야 합니다.   


  1.  로그인 후 내 계정의 구매 내역 페이지를 엽니다. [png](16693566958837ea77011b2f54531be6227c52125f1d1)   

  2. 구매 내역 페이지에서 [월드코인 내역] 버튼을 클릭합니다. [png](1669356709913369a7fa841b949e2b773853613a4cccb)   

  3. 월드코인 수익 내역에서 환불해 주려는 주문번호를 확인한 뒤 [상세보기] 버튼을 클릭합니다. [png](16753934060756a5a48a5a8cb41ceab043202f19d49c0)   

  4. 주문 상세 정보에서 수익 금액 옆의 [환불하기] 버튼을 클릭합니다. [png](1675393847138262176ffe1b54eec97b9373b61d830c8)   

  5. 확인 팝업 창에서 [확인] 버튼을 클릭하면 환불 처리됩니다. [png](166927504244455fbec33eb2c4f0ea85ce774d17d2d8a)   

  6. 다시 월드코인 내역으로 돌아와 환불 완료 처리된 것을 확인합니다. [png](1675394107929fbd4e7adfddc434daf57232364a93c1f)   




## 주의사항

  * 월드 아이템, 아바타 아이템은 판매 후 30일까지 크리에이터가 환불해 줄 수 있습니다.
  * 환불을 요청한 유저의 계정에 따라 환불 방식이 다릅니다. 계정 유형은 가입된 지역에 따라 한국/ 그 외로 구분됩니다. 
    * 한국 계정의 환불 요청인 경우 크리에이터는 유저가 선택한 환불 사유가 타당한지 검토해야 합니다. 검토 후 환불 요청을 거절하거나 승인할 수 있습니다. 환불 사유로는 상품 불일치, 잘못된 구매, 품질 문제, 단순 변심, 기타가 있습니다.
    * 그 외 계정의 환불 요청인 경우 판매 후 30일 이내의 환불 요청에 대해서만 환불 요청을 거절하거나 승인할 수 있습니다.