提交测试

提测前准备

完成自测

在开发过程中,开发者首先要完成服务的自测。开发者可以自己实现发送加密 intent 请求的桩程序(参考下面 Python 客户端代码),也可以使用我们提供的一个调试页面来给开发中的服务发送测试请求:点击打开调试页面

Webhook 客户端示例 (Python)
  1. 1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #!/usr/bin/env python# encoding: utf-8# Webhook 简单客户端,可用于构造和发送测试请求,未妥善考虑所有异常import timeimport randomimport sys# jwcrypto 不是标准库,需额外安装: pip install jwcryptofrom jwcrypto import jwk, jwefrom jwcrypto.common import json_encode, json_decode# requests 不是标准库,需额外安装: pip install requestsimport requests# 配置项,测试时请修改以下配置URL = 'http://localhost:8000'PSK_TABLE = {'0':jwk.JWK.from_json('{"kty":"oct","k":"MDEyMzQ1Njc4OWFiY2RlZg"}')}KID = '0'# 自动生成内容rid = "%d-%d" % (round(time.time() 1000), random.randint(0, 10*6))jwe_header = {"alg": "A128KW", "enc":"A128CBC-HS256", "kid":KID, "rid":rid}req = {"type":"sp_ala","surface":"mobile"}# 对请求加密,发送加密后的内容到服务器,测试时请修改请求内容req["srcid"] = "123"req["intent"] = {"scenic_spot":"故宫"}req_token = jwe.JWE(plaintext=json_encode(req), protected=json_encode(jwe_header), recipient=PSK_TABLE[KID])r = requests.post(URL, data = req_token.serialize(compact=True), headers = {"Content-Type":"application/jwt"})# 检查返回结果print "Check http_status:", "PASS" if r.status_code == 200 else "FAIL"res_token = jwe.JWE()res_token.deserialize(r.text)print "Check jose_header:", "PASS" if jwe_header == res_token.jose_header else "FAIL"res_token.decrypt(PSK_TABLE[KID])res = json_decode(res_token.payload)print "Check status:", "PASS" if res["status"] == 0 else "FAIL"print "Response JSON:", json_encode(res).decode("unicode_escape")

配置 Webhook

在提交开放平台测试之前,开发者需要在开放平台配置 Webhook URL 和对应的加密参数 PSK。

  • Webhook URL:开发者设置的用于接收 intent 请求的 URL;
  • Webhook PSK:用于开放平台、开发者双方之间通信加密、认证的预共享密钥;

PSK base64url 编码生成方法

平台要求开发者提供的是 base64url 编码的 PSK,开发者可以通过在线 base64url 编码生成器生成,注意去掉末尾补齐的 “=” 即可。为避免泄密,开发者也可以调用本地命令来生成 PSK 的 base64url 编码,以下是部分语言的示例:

Python:

  1. 12
  1. pip install jwcryptopython -c 'from jwcrypto.common import base64url_encode; print base64url_encode("0123456789abcdef")'

Node:

  1. 12
  1. npm install base64urlnode -e 'const base64url = require("base64url"); console.log(base64url("0123456789abcdef"))'

PHP:

  1. 1
  1. php -r 'echo rtrim(strtr(base64encode("0123456789abcdef"),"+/","-"),"=");'

提交测试 - 图1

完成上线

开发者需要将正式的服务部署到在平台中配置的 Webhook URL。

完成服务自检

开发者需要检查 Webhook 服务的正确性,以及更重要地,检查所有的 intent 参数是否有正确的返回结果。

如果开发者选择的卡片有图片字段,要确认:

  • 图片 URL 为 HTTPS;
  • 已经将图片服务器 HTTPS 域名提交到平台中;
  • 图片服务器对百度域没有防盗链限制,访问频率控制要较高,避免审核不通过或触发线上无图导致违规;

完成内部性能测试

为避免性能测试的压力压垮 webhook 服务导致业务损失,开发者在提测前应该对生产环境 webhook 服务进行内部性能测试。内部性能测试的响应时间要考虑到跨网络的请求延时,例如在性能测试要求 300ms 时,内部性能测试卡线在 150ms - 180ms 为宜。

触发测试

完成提测准备后,开发者可以到开放平台:个人中心->资源管理->小程序开放里 在对应资源中点击”去实现”按钮后,填写相关信息,并提交测试申请。相关操作步骤如下图:

提交测试 - 图2

测试内容

开放平台对开发者提供的 Webhook 服务测试主要有以下两项:

接口测试

开放平台会用开发者在上一步上传 intent 数据中提供的所有 intent 对 Webhook 进行检查。

当请求中 surface 参数为 mobile时,所有的 intent 必须有正确的返回结果,即返回 status0data 字段非空且符合对应卡片的返回数据格式要求。此时返回的 data 中所有跳转链接均为小程序内链接。任一 intent 返回失败或者出错,均视为接口接口测试未通过。测试结果会以开放平台消息形式发送给开发者,不通过时开发者需要修正错误后重新提交测试。

对于适配卡片,请求中 surface 参数为 web_h5 时,webhook 可以对 intent 响应 “无结果”,即返回 "status: 1"。但如果 webhook 响应了 "status: 0",要求data 字段非空且符合对应卡片的返回数据格式要求,并且 data 中所有跳转链接均为绑定的 HTML5 站点内链接。对 intent 请求响应 status 为 0/1 以外的值,视为出错。

性能测试

开放平台会用开发者在上一步上传 intent 数据中提供的所有 intent,以及开放平台自己构造的扩展和错误 intent,对开发者的服务进行性能测试。开放平台对外的性能测试主要利用服务器空闲时间进行,而且需要排队,因此不能保证准确地测试发起时间。开发者需要在提测前完成服务器容量准备和内部性能测试,以免发压时宕机造成业务损失。

性能测试标准(暂定)

性能测试要求在 QPS 100 的情况下,压测 30 分钟,98% 的请求在 300 ms 内返回,包含开放平台到开发者 Webhook 服务器的网络传输时间。

性能测试结果会以开放平台消息形式发送给开发者,不通过时开发者需要优化服务性能或扩容服务器后重新提交测试。