# 解除签约


解除签约接口，用于开发者主动解除与用户的签约关系。调用成功后，用户的签约单状态将变为已解约（UNSIGN），后续将无法基于该签约单发起协议支付（代扣）。

## 使用限制

- 调用频次限制：请遵守平台默认 QPS 限制，避免高频调用。
- 解除签约为不可逆操作，解约后如需重新签约，用户需重新走签约流程。

## 接口说明

- 业务场景：适用于开发者侧主动终止与用户的代扣签约关系。常见场景包括：用户在开发者应用内请求取消自动续费、开发者因业务调整批量解约、风控系统检测到异常后自动解约等。
- 前提条件：调用方需已完成应用创建，并通过 get_client_token 接口获取到有效的应用级 AccessToken。
- 注意事项：
- 仅支持通过 auth_order_id（平台侧签约单号）解除签约。
- 解约成功后，签约单状态变为 UNSIGN，unsign_source 为 2（商户解约）。
- 若签约单当前状态不是 SIGN（已签约），调用将失败。

## 基本信息

| 名称 | 描述 |
|-|-|
| HTTP Path | /api/trade_basic/v1/developer/terminate_sign |
| HTTP Method | POST |
| Scope | trade.sign.terminate |
| 权限要求 | - 需要申请权限 - 申请路径：豆包开放平台控制台 > 应用详情 > 能力 > 支付权限 - 需要应用级 AccessToken |

## 请求头

| 名称 | 类型 | 必填 | 描述 |
|-|-|-|-|
| content-type | string | 是 | 固定值 application/json |
| x-DB-AccessToken | string | 是 | 调用 get_client_token 接口生成的应用级访问凭证 |

## 请求参数

### Body

| 名称 | 类型 | 是否必填 | 描述 | 示例值 |
|-|-|-|-|-|
| auth_order_id | string | 是 | 平台侧签约单的单号，长度不超过 64 byte | 80214322040407612\*\*\* |

## 请求示例

cURL

```shell
curl -X POST 'https://api.doubao-dev.com/api/trade_basic/v1/developer/terminate_sign' \
  -H 'content-type: application/json' \
  -H 'x-DB-AccessToken: clt.943da17996fb5cebfbc70c044c3fc25a57T54DcjT6HNKGqn******' \
  -d '{
    "auth_order_id": "80214322040407612***"
  }'
```

Go

```go
package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    url := "https://api.doubao-dev.com/api/trade_basic/v1/developer/terminate_sign"
    reqBody := map[string]string{
        "auth_order_id": "80214322040407612***",
    }
    jsonData, _ := json.Marshal(reqBody)

    req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
    req.Header.Set("content-type", "application/json")
    req.Header.Set("x-DB-AccessToken", "clt.943da17996fb5cebfbc70c044c3fc25a57T54DcjT6HNKGqn******")

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    defer resp.Body.Close()
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}
```

Java

```java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class TerminateSign {
    public static void main(String[] args) throws Exception {
        String url = "https://api.doubao-dev.com/api/trade_basic/v1/developer/terminate_sign";
        String requestBody = "{\"auth_order_id\":\"80214322040407612***\"}";

        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .header("content-type", "application/json")
                .header("x-DB-AccessToken", "clt.943da17996fb5cebfbc70c044c3fc25a57T54DcjT6HNKGqn******")
                .POST(HttpRequest.BodyPublishers.ofString(requestBody))
                .build();

        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
```

Node.js

```javascript
const axios = require('axios');

async function terminateSign() {
    const url = 'https://api.doubao-dev.com/api/trade_basic/v1/developer/terminate_sign';
    const headers = {
        'content-type': 'application/json',
        'x-DB-AccessToken': 'clt.943da17996fb5cebfbc70c044c3fc25a57T54DcjT6HNKGqn******'
    };
    const data = {
        auth_order_id: '80214322040407612***'
    };

    try {
        const response = await axios.post(url, data, { headers });
        console.log(response.data);
    } catch (error) {
        console.error('Error:', error.message);
    }
}

terminateSign();
```

## 响应参数

| 名称 | 类型 | 是否必填 | 描述 | 示例值 |
|-|-|-|-|-|
| code | int32 | 是 | 错误码，0 表示成功，非 0 表示失败 | 0 |
| msg | string | 是 | 错误提示 | success |
| log_id | string | 是 | 请求日志 ID，用于问题排查时提供给技术支持 | 2023010128382726 |

## 响应示例

### 正常示例

```json
{
    "code": 0,
    "msg": "success",
    "log_id": "2022092115392201020812109511046"
}
```

### 异常示例

```json
{
    "code": 500000001,
    "msg": "Parameter error",
    "log_id": "2022092115392201020812109511047"
}
```

## 错误码

### 通用错误码

| 错误码 | 错误名称 | 描述（msg） | 排查建议 |
|-|-|-|-|
| 0 | Success | success | 请求成功，无需处理 |
| 500000000 | OApiCommonInternalError | internal error | 系统内部错误，请稍后重试；若持续出现请携带 log_id 联系技术支持 |
| 500000001 | OApiCommonDeveloperParamError | Parameter error | 请求参数错误，请检查 auth_order_id 是否正确传入且格式合法 |
| 500000002 | OApiCommonDeveloperRateLimitError | Rate limit error | 请求触发限流，请降低调用频率后重试 |
| 500000003 | OApiCommonVerifySignFailError | Verify sign fail | 签名验证失败，请检查 x-DB-AccessToken 是否有效、是否过期，必要时重新调用 get_client_token 获取新 token |
