# 付费插件开发 API 文档

---

> 注意事项：
>
> 1. 项目需要使用最新的 V3 版本
> 2. 本 SDK 需要在 backgorund 环境引入，开发者需要自行处理 popup、content 环境下的数据通信
> 3. 收银台支付通信需要在 manifest 中加入
>
> ```json
>   "host_permissions": ["http://*.360.cn/*", "https://*.360.cn/*"],
>   "externally_connectable": {
>     "matches": ["http://*.360.cn/*", "https://*.360.cn/*"]
>   }
> ```
>
> 4. 一期使用`支付功能`必须接入 360 的登录体系（后续版本会支持开发者使用自有的登录体系）
> 5. 如果需要切换账号/登出账号，都需要操作浏览器的账号切换/登出。api 没有提供登出和切换账号的功能

## 登录

| 名称       | 功能                                              |
| ---------- | ------------------------------------------------- |
| qh.isLogin | 获取 360 浏览器客户端登录状态(这里并不是插件登录) |
| qh.login   | 发起登录请求，调起浏览器登录面板                  |

注意：客户端登录并不等于插件登录，360 浏览器客户端登录是插件登录的前提条件，插件的登录应该是完成 OAuth 授权拿到 session_key 之后(详情见登录流程图)

![登录流程](https://p5.ssl.qhimg.com/t01197325d4b3113bc2.png)

### qh.isLogin

**解释：** 获取 360 浏览器客户端登录状态。

**方法参数：** 回调函数 (isLogin)=>void

**返回参数说明：**

| 属性    | 类型    | 说明                                                 |
| ------- | ------- | ---------------------------------------------------- |
| isLogin | Boolean | 360 浏览器客户端登录状态 true: 已登录，false: 未登录 |

**示例：**

- 在 js 文件中

```js
qh.isLogin((res) => {
  console.log('isLogin:', res.isLogin)
})
```

### qh.login

**解释：** 调用接口 qh.login 获取 Authorization Code，

**方法参数：** Object object

**`object` 参数**

| 属性     | 类型     | 默认值 | 必填 | 说明                                             |
| -------- | -------- | ------ | ---- | ------------------------------------------------ |
| success  | function | -      | 否   | 接口调用成功的回调函数                           |
| fail     | function | -      | 否   | 接口调用失败的回调函数                           |
| complete | function | -      | 否   | 接口调用结束的回调函数（调用成功、失败都会执行） |

**success 返回参数说明：**

| 属性 | 类型   | 说明                                                                                                                                                                       |
| ---- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| code | string | 用户登录凭证（有效期五分钟）,开发者需要在开发者服务器后台调用 api(https://plugin.browser.360.cn/auth/session 详见服务端 api 接口文档)，使用 code 换取 session_key 等信息。 |

**fail 返回参数说明：**

| 属性       | 类型   | 说明                                                         |
| ---------- | ------ | ------------------------------------------------------------ |
| {code,msg} | Object | code：错误码(见`getPaymentInfo`接口的错误码) ，msg：错误信息 |

**complete 返回参数说明：**

第一个返回参数 err 为 null,表示成功回调。否则表示失败回调

| 属性 | 类型               | 说明                         |
| ---- | ------------------ | ---------------------------- |
| err  | Object: {code,msg} | code：错误码 ，msg：错误信息 |
| data | string             | 用户登录凭证（有效期五分钟） |

**示例：**

- 在 js 文件中

```js
qh.login({
  success: function (res) {
    console.log('login success', res)
  },
  fail: function (err) {
    console.log('login fail', err)
  },
})
```

## 支付

| 名称                             | 功能                                                         |
| -------------------------------- | ------------------------------------------------------------ |
| qh.requestPayment(object:Object) | 发起收银台支付请求，打开会员中心 H5 页面                     |
| qh.getPaymentInfo(object:Object) | 获取用户的支付状态                                           |
| qh.paySuccessCallback            | 支付成功的全局回调（收银台告知支付成功后，会主动调用该方法） |

注意：支付流程中，只有支付成功会有回调，不存在支付失败的回调

### qh.requestPayment

**解释：** 发起收银台支付请求，打开会员中心 H5 页面(`建议：支付前先调用qh.isLogin检查是否已登录浏览器账号，收银台付款时需要用户登录`)

**方法参数：** 回调函数 ()=>void

** 参数说明 **

| 属性            | 类型     | 默认值 | 必填 | 说明                                                                                               |
| --------------- | -------- | ------ | ---- | -------------------------------------------------------------------------------------------------- |
| successCallback | function | -      | 否   | 支付成功的回调函数（非必填，也可以设置全局的支付成功回调来达到目的`qh.paySuccessCallback=()=>{}`） |

**示例：**

- 在 js 文件中

```js
qh.requestPayment(function () {
  console.log('支付成功')
  // 支付成功后，建议去后台请求再次确认
  qh.getPaymentInfo()
})
```

### qh.getPaymentInfo

**解释：** 获取会员(vip)状态

**方法参数：** Object object

**`object` 参数**

| 属性        | 类型     | 默认值 | 必填 | 说明                                                                 |
| ----------- | -------- | ------ | ---- | -------------------------------------------------------------------- |
| session_key | string   | -      | 是   | 接入 360 登录体系后 拿到的密钥（注：一期暂不支持使用自己的账号体系） |
| success     | function | -      | 否   | 接口调用成功的回调函数                                               |
| fail        | function | -      | 否   | 接口调用失败的回调函数                                               |
| complete    | function | -      | 否   | 接口调用结束的回调函数（调用成功、失败都会执行）                     |

**success 返回参数说明：**

| 属性                | 类型   | 说明                                                                                     |
| ------------------- | ------ | ---------------------------------------------------------------------------------------- |
| {isVip,expire_time} | Object | isVip：会员状态 （1：vip，0: 非 vip）。expire_time：会员过期时间戳（未购买过默认返回 0） |

**fail 返回参数说明：**

| 属性       | 类型   | 说明                         |
| ---------- | ------ | ---------------------------- |
| {code,msg} | Object | code：错误码 ，msg：错误信息 |

**complete 返回参数说明：**

第一个返回参数 err 为 null,表示成功回调。否则表示失败回调

| 属性 | 类型                        | 说明                         |
| ---- | --------------------------- | ---------------------------- |
| err  | Object: {code,msg}          | code：错误码 ，msg：错误信息 |
| data | Object: {isVip,expire_time} | 同 success 返回参数          |

**错误码表示的信息：**

| code  | 说明                                |
| ----- | ----------------------------------- |
| -1    | 其他错误                            |
| 0     | 成功                                |
| 10000 | 扩展 ID 错误                        |
| 20001 | Authorization Code 为空             |
| 20002 | Authorization Code 生成太频繁       |
| 20003 | Authorization Code 不存在或者已过期 |
| 30001 | session_key 为空                    |
| 30002 | session_key 错误                    |
| 30003 | session_key 过期                    |
| 30004 | session_key 错误                    |
| 40001 | (360)账号未登录                     |
| 50000 | 服务器错误                          |

> 备注：
>
> 1.该接口需要接入 360 登录体系后再调用

**示例：**

- 在 js 文件中

```js
qh.requestPayment({
  session_key: 'xxxxxx',
  success: function (res) {
    console.log('支付成功')
  },
  fail: function (err) {
    console.log('获取支付状态失败', err)
  },
})
```

## 订单（会员中心 H5）

| 名称             | 功能                                 |
| ---------------- | ------------------------------------ |
| qh.showOrderList | 获取当前用户在当前插件的购买订单记录 |

**示例：**

- 在 html 文件中

```html
<button onclick="showOrderBtnClick()">查看订单</button>
```

- 在 js 文件中

```js
function showOrderBtnClick {
  qh.showOrderList()
}
```
