# 欺诈检测

## 前言

每笔交易都会经过风控检查，接入 Fraud Detection（欺诈检测）可以预防和减少欺诈率，让您的交易成功率大大提升。

## 与收银台组件一起使用

如果您使用了我们的收银台组件，则不需要手动引入 SDK，组件本身已经集成了 SDK，您**无需额外配置**，组件内部已经配置好环境。

> 收银台组件引入方式参考：[PayKKa Checkout UI Component 使用文档](/zh-hans/payments/docs/developer-resources/checkout-ui-component)。


## 接入 API 支付

接入 API 支付时，则需手动引入 SDK。

### 引入 SDK

通过 CDN 的形式单独引入 Fraud Detection SDK。

各环境下的 SDK 引入方式如下：

欧洲
```html html
<script src="https://checkout.eu.paykka.com/cp/fraud-detection.js"></script>
```

香港
```html html
<script src="https://checkout.aq.paykka.com/cp/fraud-detection.js"></script>
```

Sandbox
```html html
<script src="https://checkout-sandbox.aq.paykka.com/cp/fraud-detection.js"></script>
```

### 环境配置

初始化 Fraud Detection 时，需要根据您的商户所在地区配置对应的环境。

目前支持的环境如下：

| 环境 | 描述 |
|  --- | --- |
| **sandbox** | 沙箱调试使用 |
| **eu** | 默认值，欧洲商户可用 |
| **hk** | 香港商户可用 |
| **us** | 美国商户可用，目前暂未开通 |


成功引入并加载 SDK 后，会暴露出变量 `PayKKaFraudDetection`，调用时需传入如下参数：

- `env`: 环境参数，可选值：`sandbox` | `eu` | `hk`
- `clientKey`: 您的客户端密钥


```typescript
const paykkaFraudDetection = PayKKaFraudDetection({
  env: 'sandbox',
  clientKey: 'xxx',
})
```

PayKKaFraudDetection 是单例，因此多次调用返回的是同一个实例，您无需担心会产生重复请求。

### 使用

#### createFraudDetection()

您需要调用 `paykkaFraudDetection.createFraudDetection()` 创建 Fraud Detection，此时内部会开始进行初始化并请求 fraudDetectionID，该方法会缓存请求到的结果，因此多次调用不会更新。
建议 SDK 加载完毕后立即执行该方法，可以更快获取到 fraudDetectionID。

#### getFraudDetectionId()

您可以通过调用 `paykkaFraudDetection.getFraudDetectionId()` 获取。

`getFraudDetectionId` 是一个异步方法，渠道获取 `fraudDetectionID` 需要时间，需要等待。

获取 fraudDetectionID 时，建议**传入用户输入的 6 位卡 bin，以降低 3DS 挑战或失败的概率**:

```javascript javascript
const fraudDetectionID = await paykkaFraudDetection.getFraudDetectionId({ bin: '400000' })
```

#### 完整示例

以下是一个完整的集成示例（以 Sandbox 环境为例）：

```html html
<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <!-- 引入 Fraud Detection SDK -->
    <script src="https://checkout-sandbox.aq.paykka.com/cp/fraud-detection.js"></script>
    <!-- 欧洲 -->
    <!-- <script src="https://checkout.eu.paykka.com/cp/fraud-detection.js"></script> -->
    <!-- 香港 -->
    <!-- <script src="https://checkout.aq.paykka.com/cp/fraud-detection.js"></script> -->
    <title>Fraud Detection Demo</title>
  </head>
  <body>
    <div class="form">
      <!-- 表单 -->
    </div>
    <!-- 支付按钮 -->
    <button onclick="handleClickPay()">支付</button>

    <div>fraudDetectionID: <span id="fraudDetectionID"></span></div>

    <script>
      let paykkaFraudDetection

      // 调用 API 支付
      const paymentWithAPI = () => {}

      /** 点击支付按钮触发 */
      const handleClickPay = async () => {
        // 获取 fraudDetectionID，最好能传入 6 位卡 bin
        const fraudDetectionID = await paykkaFraudDetection.getFraudDetectionId({ bin: '400000' })
        document.getElementById('fraudDetectionID').textContent = fraudDetectionID
        const paymentParams = {
          browser: {
            // 传获取到的 fraudDetectionID
            fraud_detection_id: fraudDetectionID,
            // ...otherBrowserInfo
          },
          //...otherPaymentParams
        }

        paymentWithAPI()
      }

      window.onload = () => {
        // 创建 Fraud Detection 实例, 传入环境参数 sandbox | eu | hk，和客户端密钥
        paykkaFraudDetection = PayKKaFraudDetection({
          env: 'sandbox',
          clientKey: 'xxx',
        })

        // 创建 Fraud Detection 实例后，需要调用 createFraudDetection 方法
        paykkaFraudDetection.createFraudDetection()
      }
    </script>
  </body>
</html>
```