# 网关接入详细说明

网关主要用于对小程序接口服务质量(如接口异常、接口超时等情况)的统一监控。需向出行服务提供一名联系人的联系方式,用于在接口异常时告警。

# 基本说明

默认支持常见的请求方式(GET/POST/PUT/DELETE),返回值只能是 json 格式数据。前端的参数/header默认都会传递给下游。 建议统一使用POST的请求方式,且请求格式一律统一为 application/json。

# 匹配规则

网关通过路径匹配进行转发,且支持路径重写。例如,A公司提供了租车业务,则建议前端使用的路径为 arental 即公司拼音+业务,全小写。那么对应的匹配规则为:

"^/arental/(.*)": {
  "rewrite": "$1"
}

如果业务方有多个域名需要接入,可以用子路径来区分,例如 "/arental/api"、"/arental/report"。rewirte部分也可以自定义路径。

# 二次签名

# 签名方法说明

  • 步骤1 从请求中获取所有的参数
  • 步骤2 除参数“sign” 外的所有参数均会参与签名计算。 按照除 sign 外参数名称排序(字典升序排列)成”key1=value1&key2=value2&....”的原始字符串 src1;将原始字符串+分配给调用方的 api_sercret 形成字符串 src2; 将 src2 进行 md5 后转成大写形成签名内容 dest
  • 步骤 3 将步骤 2 中得到的签名内容 dest 与请求中的 sign 字段内容做比较,如果相同则验证成功,否则判定请求非法。

例如:

请求 marketing/config接口,前端发送的参数为:

{
    "appVersion": "2020.48.2",
    "nonce": "hwct0v0ej3",
    "timestamp": 1607586196327,
    "seqId": "1607586196327830555",
    "wxAppId": "wx65cc950f42e8fff1",
    "userId": "1100288",
    "token": "05c666d7c93e19656e04c9a1ecc51d39",
    "sign": "9acf6b5e084fa84941b112ceb33d3df3"
}

服务端接收除sign值外的所有参数,按照key=value排序,以&连接后,再拼接自定义api_sercret(此时不加&符号),得到

appVersion=2020.48.2&nonce=hwct0v0ej3&seqId=1607586196327830555&timestamp=1607586196327&token=05c666d7c93e19656e04c9a1ecc51d39&userId=1100288&wxAppId=wx65cc950f42e8fff1sign_test

计算MD5值为:09aa625f7c8ac0bd8d0cdaf9d8e4b419

出行网关会将上游传递的sign值由"9acf6b5e084fa84941b112ceb33d3df3"修改为“09aa625f7c8ac0bd8d0cdaf9d8e4b419”以便下游核对。

# 请求中包含多级JSON对象的处理

例如,在上例中加入一个configPaths的参数。签名算法会将configPaths的字符串值,即requestBody里的内容原封不动(符号都带上)得拼到字符串中。这里不能将request body 转为字符串或对象,再从对象里取舍,因为不同语言的json工具包处理效果不同。

{
    "appVersion": "2020.48.2",
    "nonce": "hwct0v0ej3",
    "timestamp": 1607586196327,
    "seqId": "1607586196327830555",
    "wxAppId": "wx65cc950f42e8fff1",
    "configPaths": [
        "/sinan/fm/home"
    ],
    "userId": "1100288",
    "token": "05c666d7c93e19656e04c9a1ecc51d39",
    "sign": "9acf6b5e084fa84941b112ceb33d3df3"
}

此时,参与签名的字符串为:

appVersion=2020.48.2&configPaths=[
    "/sinan/fm/home"
  ]&nonce=hwct0v0ej3&seqId=1607586196327830555&timestamp=1607586196327&token=05c666d7c93e19656e04c9a1ecc51d39&userId=1100288&wxAppId=wx65cc950f42e8fff1sign_test

注意示例中,空格和换行符是严格按前端上传的内容来拼接的:

图片示例

计算结果为:a6101ee477a4b754f314284006d019df