# hook xhr 接入微信网关

## 一、接入指南

### 1. 使用 ajax-hook

``` html
<script src="https://unpkg.com/ajax-hook@3.0.3/dist/ajaxhook.min.js"></script>
```

### 2. 新建一个 gwpatch.js 文件

内容如下，修改其中的 `GATEWAY_DOMAIN` 字段为自己的网关域名，以及 `resoureceAppid` （填任意一个小程序白名单内的 `appid` 即可，仅作为来源区分，不校验）,其中 `RESOLVE_GATEWAY_DOMAIN` 为 需要加入到网关转发的域名。

``` js
const c1 = new cloud.Cloud({
identityless: true,
resourceAppid: '***', // appid，填入接入的小程序 appid
config: {
    customDomain: 'https://a1d5ad78d-***.sh.wxcloudrun.com' // 网关接入节点域名
}
})
c1.init() // 初始化实例
const gateway = c1.services.Gateway({ domain: 'a1d5ad78d-****.sh.wxcloudrun.com' }) // 网关接入节点域名，不包含协议头

const RESOLVE_GATEWAY_DOMAIN = ["https://domain/"]
const GWFALLBACK=true

const UNPARSE_JSON = false //控制是否强制解json，true 时为不解json，返回为 string 格式
const UNPARES_URL_PERFIX = RESOLVE_GATEWAY_DOMAIN //配置是否解 json的路径

function checkDomain(ob1,ob2){
    for (var i=0;i<ob1.length;i++)
    { 
        if(ob2.startsWith(ob1[i])>0){
            return true
        }
    }
    return false
} 

ah.proxy({
    onRequest: (config, handler) => {
        //config = sigcrypto(config) //加签逻辑
        if (checkDomain(RESOLVE_GATEWAY_DOMAIN,config.url) ) {
            let nheader = config.headers
            nheader["X-WX-HTTP-MODE"]= 'REROUTE'
            gateway.call({
            method:config.method,
            url:config.url,
            header:nheader,
            data:config.body,
            apiVersion:3,
            }
            ).then(res => {
                if (UNPARSE_JSON && checkDomain(UNPARES_URL_PERFIX,config.url) && res.header['content-type']=='application/json'){
                    res.data = JSON.stringify(res.data)
                }
                if (res.errMsg=="gateway.call:ok"){
                    handler.resolve(
                        {
                        config:config,
                        status:res.statusCode,
                        response:res.data,
                        headers:res.header
                        }
                    )
                }else{
                    if (GWFALLBACK){
                        handler.next(config)
                    }else{
                        handler.resolve(
                            {
                            config:config,
                            status:res.statusCode,
                            response:res.data,
                            headers:res.header
                            }
                        )
                    }
                }
            }).catch((error)=>{
                if (GWFALLBACK){
                    handler.next(config)
                }else{
                    handler.resolve(
                        {
                        config:config,
                        status:error.errCode,
                        response:error.errMsg
                        }
                    )
                }
            })
        } else {
        handler.next(config);
        }

    }
})
```
### 3. 在 HTML 中引入微信网关 Web SDK 和 hook SDK

``` html
<script src="https://该地址隐藏，请前往控制台获取/cloud.js" importance="VeryHigh"></script>
<script src="./ajaxhook.min.js"></script>
<script src="gwpatch.js"></script>
```

### 4. 引入成功后，所有 xhr 请求将会自动牵引至 websdk

### 5. 测试请求是否正常，以及请求是否通过加密即可。注意 2.0.4 的 SDK 不允许打开 DevTools 调试工具，否则将被拦截。

![](https://res.wx.qq.com/op_res/sP2znl4b7PHFW7yYy4kqHnw8s9PXjY33YEJysDdp5qpNLI2p6bG-b4TSw1YHCvQvUi90C2tWVzenK4NgJG8sKg)

## 二、FAQ

### 1. 降级能力，能否自定义？

可以通过上面的 wxadapter 的 catch 部分自定义进入降级的条件。

### 2. 如何快速关闭？

步骤 3 入口处取消掉 adapter 的应用即可。

### 3. 是否支持服务端主动降级

上面代码中，默认任何报错都会进行降级，也可以通过控制台关闭网关的 Web 接入能力强制所有请求降级。
