# 同意取消しAPI

<br>

## **概要**

同意取消しAPIは、利用者の基本4情報（氏名・住所・生年月日・性別）の提供を受けるために利用者から取得した同意を取り消すためのAPIです。
同意の取消しは、本人の意思に基づくものであることを確実に示すため、同意の申請時と同様、署名用電子証明書を用います。
利用者による同意の取消し申請後、J-LISにて申請を受信次第、即時に、J-LISからの基本4情報（氏名・住所・生年月日・性別）提供が停止されます。

## **アクセスコントロール**

<AccordionGroup>
    <Accordion title="マイナンバーカード">
        署名用電子証明書の暗証番号（6〜16桁の半角英数字）
        ※5回連続で署名用電子証明書の暗証番号を間違えた場合には、マイナンバーカードにロックがかかってしまいますのでご注意ください。
    </Accordion>
    <Accordion title="スマートフォンのマイナンバーカード">
        署名用電子証明書の暗証番号（6〜16桁の半角英数字）
        ※5回連続で署名用電子証明書の暗証番号を間違えた場合には、マイナンバーカードにロックがかかってしまいますのでご注意ください。
    </Accordion> </AccordionGroup>

## **処理の流れ**

<Tabs>
    <Tab title="対面">
        <Steps>
            <Step title="利用者からの同意取消し要求（サービスプロバイダ事業者）">
                利用者から基本4情報（氏名・住所・生年月日・性別）に関する同意取消し要求を受信します。
            </Step>
            <Step title="同意取消し申請データの作成・送信（サービスプロバイダ事業者）">
                利用者から同意取消し要求を受信した後、SDKを使用して利用者のマイナンバーカードまたはスマートフォンのマイナンバーカードを、ICカードリーダーまたは読み取り用スマートフォンのNFC機能で読み取り、6〜16桁の署名用電子証明書の暗証番号を入力することで、利用者同意取消し申請データを作成し、APIでリクエストを送信します。
                
               ※スマートフォンのマイナンバーカード読み取りは、機種ごとに読み取り手順が変わります。
                <AccordionGroup>
                    <Accordion title="iPhoneのマイナンバーカードを読み取る">
                        <Steps>
                            <Step>Appleウォレットを起動し、マイナンバーカードを選択します。</Step>
                            <Step>Face IDまたはTouch IDによる認証を行います。</Step>
                            <Step>認証完了後、iPhoneの画面に「リーダーにかざしてください」の表示が出ている状態で、ICカードリーダーまたは読み取り用スマートフォンのNFC機能で読み取りを行います。</Step>
                        </Steps>
                    </Accordion>
                    <Accordion title="Androidスマホ用電子証明書を読み取る">
                        <Steps>
                            <Step>設定アプリより、NFC機能をオンにします。</Step>
                            <Step>NFC機能がオンになっていることを確認し、Android端末をICカードリーダーまたは読み取り用スマートフォンのNFC機能で読み取りを行います。</Step>
                            </Steps>
                    </Accordion>
                </AccordionGroup>
            </Step>
            <Step title="同意取消し申請データの送信（プラットフォーム事業者）">
                受信した同意取消し申請データをJ-LISに送信し、利用者の同意取消しを申請します。  
                J-LISは受信した同意取消し申請データに対して署名検証および失効確認を行い、問題がなければ同意取消し結果をプラットフォーム事業者へ返却します。
            </Step>
            <Step title="同意取消し結果の取得（プラットフォーム事業者）">
                同意取消しが正常に完了した場合、J-LISから同意取消し結果（受理番号および利用者同意の有効期限）が返却されます。
            </Step>
            <Step title="同意取消し結果の保存・返却（プラットフォーム事業者）">
                取得した同意取消し結果をデータベースに保管・管理し、サービスプロバイダ事業者へ返却します。  
                また、サービスプロバイダ事業者も同様に、同意取消し結果を自社のデータベースに保管・管理する必要があります。
            </Step>
        </Steps>
    </Tab>
    <Tab title="非対面">
        <Steps>
            <Step title="利用者からの同意取消し要求（サービスプロバイダ事業者）">
                利用者から基本4情報（氏名・住所・生年月日・性別）に関する同意取消し要求を受信します。
            </Step>
            <Step title="同意取消し申請データの作成・送信（サービスプロバイダ事業者）">
                利用者から同意取消し要求を受信した後、SDKを使用して利用者のマイナンバーカードを、読み取り用スマートフォンのNFC機能で読み取り、6〜16桁の署名用電子証明書の暗証番号を入力することで、利用者同意取消し申請データを作成し、APIでリクエストを送信します。
            </Step>
            <Step title="同意取消し申請データの送信（プラットフォーム事業者）">
                受信した同意取消し申請データをJ-LISに送信し、利用者の同意取消しを申請します。  
                J-LISは受信した同意取消し申請データに対して署名検証および失効確認を行い、問題がなければ同意取消し結果をプラットフォーム事業者へ返却します。
            </Step>
            <Step title="同意取消し結果の取得（プラットフォーム事業者）">
                同意取消しが正常に完了した場合、J-LISから同意取消し結果（受理番号および利用者同意の有効期限）が返却されます。
            </Step>
            <Step title="同意取消し結果の保存・返却（プラットフォーム事業者）">
                取得した同意取消し結果をデータベースに保管・管理し、サービスプロバイダ事業者へ返却します。  
                また、サービスプロバイダ事業者も同様に、同意取消し結果を自社のデータベースに保管・管理する必要があります。
            </Step>
        </Steps>
    </Tab>
</Tabs>
    
## **シーケンス図**

<Tabs>
    <Tab title="対面">
```mermaid
    %%{init:{'theme':'natural'}}%%
    sequenceDiagram
    participant 利用者
    participant SDK
    participant サービスプロバイダ事業者
    participant プラットフォーム事業者

    利用者->>サービスプロバイダ事業者: 同意取消しの要求
    サービスプロバイダ事業者->>SDK: 署名用電子証明書の暗証番号の要求
    SDK->>利用者: 署名用電子証明書の暗証番号の要求
    利用者->>利用者: 署名用電子証明書の暗証番号入力
    利用者->>SDK: 暗証番号の送信
    SDK->>SDK: 同意取消し申請書の生成
    SDK->>サービスプロバイダ事業者: 同意取消し申請書の返却
    サービスプロバイダ事業者->>プラットフォーム事業者: 同意取消し申請書の送信
    プラットフォーム事業者->>J-LIS: 同意取消しの申請
    J-LIS->>プラットフォーム事業者: 同意取消し結果の取得    
    プラットフォーム事業者->>プラットフォーム事業者: 同意取消し結果の保存
    プラットフォーム事業者->>サービスプロバイダ事業者: 同意取消し結果の返却
    サービスプロバイダ事業者->>サービスプロバイダ事業者: 同意取消し結果の保存
```
    </Tab>
    <Tab title="非対面">
```mermaid
    %%{init:{'theme':'natural'}}%%
    sequenceDiagram
    participant 利用者
    participant SDK
    participant サービスプロバイダ事業者
    participant プラットフォーム事業者

    利用者->>サービスプロバイダ事業者: 同意取消しの要求
    サービスプロバイダ事業者->>SDK: 署名用電子証明書の暗証番号の要求
    SDK->>利用者: 署名用電子証明書の暗証番号の要求
    利用者->>利用者: 署名用電子証明書の暗証番号入力
    利用者->>SDK: 暗証番号の送信
    SDK->>SDK: 同意取消し申請書の生成
    SDK->>サービスプロバイダ事業者: 同意取消し申請書の返却
    サービスプロバイダ事業者->>プラットフォーム事業者: 同意取消し申請書の送信
    プラットフォーム事業者->>J-LIS: 同意取消しの申請
    J-LIS->>プラットフォーム事業者: 同意取消し結果の取得    
    プラットフォーム事業者->>プラットフォーム事業者: 同意取消し結果の保存
    プラットフォーム事業者->>サービスプロバイダ事業者: 同意取消し結果の返却
    サービスプロバイダ事業者->>サービスプロバイダ事業者: 同意取消し結果の保存
```
    </Tab>
</Tabs>

## **実装例**
<Tabs>
    <Tab title="iOS">
```swift
/** SDKの処理は省略（契約後に提供される）
* 同意取消し申請書の作成
**/

// エンドポイント
let endpoint = "APIのエンドポイント"

var semaphore = DispatchSemaphore(value: 0)

let parameters = """
{
    "data": "同意取消し申請書データ"
}
"""
let postData = parameters.data(using: .utf8)

// リクエスト作成
var request = URLRequest(url: URL(string: endpoint)!, timeoutInterval: Double.infinity)
request.addValue("<token>", forHTTPHeaderField: "X-PTS-API-Key")
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpMethod = "DELETE"
request.httpBody = postData

// リクエストの送信・エラー処理の記述

```
    </Tab>
    <Tab title="Android">
```kotlin
/** SDKの処理は省略（契約後に提供される）
* 同意取消し申請書の作成
**/

// エンドポイント
val endpoint = "APIのエンドポイント"

val client = OkHttpClient()

// リクエストボディの作成
val json = JSONObject()
json.put("data", "同意取消し申請書データ")

val mediaType = "application/json".toMediaType()
val requestBody = json.toString().toRequestBody(mediaType)

// リクエスト作成
val request = Request.Builder()
    .url(endpoint)
    .delete(requestBody)
    .addHeader("X-PTS-API-Key", "<token>")
    .addHeader("Content-Type", "application/json")
    .build()

    // リクエストの送信・エラー処理の記述
})
        
```
    </Tab>
    <Tab title="React Native">
```typescript
/** SDKの処理は省略（契約後に提供される）
* 同意取消し申請書の作成
**/
        
// エンドポイント
const endpoint = 'APIのエンドポイント';

// リクエスト作成
await fetch(endpoint, {
  method: 'DELETE',
  headers: {
    'Content-Type': 'application/json',
    'X-PTS-API-Key': '<token>',
  },
  body: JSON.stringify({
    data: consentCancelXmlData,
  }),
});

// リクエストの送信・エラー処理の記述
```
    </Tab>
    <Tab title="Windows">
```cpp
/** SDKの処理は省略（契約後に提供される）
* 同意取消し申請書の作成
**/

// エンドポイント
std::string endpoint = "APIのエンドポイント";
        
std::string responseData;

// リクエストボディの作成
Json::Value requestBody;
requestBody["data"] = "同意取消し申請書データ";
std::string jsonString = Json::writeString(Json::StreamWriterBuilder(), requestBody);

// リクエスト作成
CURL* curl = curl_easy_init();
if (curl) {
    struct curl_slist* headers = curl_slist_append(nullptr, "X-PTS-API-Key: <token>");
    headers = curl_slist_append(headers, "Content-Type: application/json");
    curl_easy_setopt(curl, CURLOPT_URL, endpoint.c_str());
    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE");
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &responseData);
    
    CURLcode res = curl_easy_perform(curl);
    
    // リクエストの送信・エラー処理の記述
}
        
```
    </Tab>
</Tabs>

<br>

