微信小程序授权accessToken配置引导
背景
完成AccessToken相关配置,才可以发送小程序订阅通知。该接口需要实现下述功能:
1、获取微信小程序的accessToken,入参设置了本次请求是否刷新token,请确保该token的可用性。
2、连通性测试,QA在配置后会进行一次连通性测试,不会传入wxAppId(微信小程序的AppId,详见接口文档),请返回正确即可(code为200、token为空即可)。
参数说明
参数名称 | 参数解释 | 备注 |
URL地址 | 填写客户侧获取微信token的地址 | 接口开发方提供该接口,需实现上述功能。 |
APP ID | 验签使用的参数 | 请和接口开发方约定好APPID,在这里填写即可 |
AccessKey | 验签使用的参数 | 请和接口开发方约定好AccessKey,在这里填写即可 |
SecretKey | 验签使用的参数 | 请和接口开发方约定好SecretKey,在这里填写即可 |
一、接口文档
接口描述 | 查询微信小程序AccessToken | |||
URL | ${第三方填的地址}?appId=aaa&accessKey=xxx×tamp=yyy | |||
请求方式 | POST | |||
请求类型 | application/json | |||
返回类型 | */* | |||
参数名 | 数据类型 | 参数类型 | 是否必填 | 说明 |
1.wxAppId | string | body | 是 | 微信小程序appId |
2.refresh | boolean | body | 是 | 是否需要刷新token,默认false |
状态码 | 描述 | 说明 | ||
200 | OK | 请求成功。 | ||
401 | Unauthorized | 请求未经授权。 | ||
403 | Forbidden | 请求被拒绝。 | ||
404 | Not Found | 请求的资源不存在。 | ||
返回属性名 | 类型 | 说明 | ||
1.code | string | 请求状态码,200或OK表示成功。 | ||
2.message | string | 错误信息 | ||
3.accessToken | string | 微信小程序的accesToken | ||
4.expireTime | DateTime | 过期时间。格式 | ||
4.requestId | string | 请求ID。 | ||
示例 | ||||
请求参数 | http://{获取token的Url}?appId=aaa&accessKey=xxx×tamp=yyy | |||
返回值 | {"code":"200","requestId":"string","message":"string","accessToken":"xxxx","expireTime":"2024-09-10 00:00:00"} |
二、验签说明
QA会根据下面方式生成签名,如果需要,请三方根据此方法验证签名
QA在请求的接口路径上会带上 appId, accessKey, timestamp(时间戳参数),并且需要在header中加入签名Authorization。
公共参数说明
参数 | 说明 | 位置 |
appId | 开放平台的应用id | 请求URI中的参数部分 |
accessKey | 开放平台的应用的ak | 请求URI中的参数部分 |
timestamp | 当前时间戳(毫秒) | 请求URI中的参数部分 |
Authorization | 生成的签名 | 请求的header中 |
签名生成规则:
使用请求参数构造规范化的请求字符串(Canonicalized Query String)
按照参数名称的字典顺序对请求中所有的请求参数(包括文档中描述的“公共请求参数”和给定了的请求接口的自定义参数)进行排序。 注:当使用GET方法提交请求时,这些参数就是请求URI中的参数部分(即URI中"?"之后由"&"连接的部分)
名称和值要使用UTF-8字符集进行URL编码。
代码示例
其中签名的生成逻辑如下 java代码示例:
String appId="tttt";
String accessKey = "xxxx";
String accessSecret ="yyyy";
String timeStamp = "1708235644862";
SortedMap<String, String> map = new TreeMap<>();
map.put("appId", appId);
map.put("accessKey", accessKey);
map.put("accessSecret",accessSecret );
map.put("timestamp", timeStamp);
//如果是get请求,还有其他的query参数,那么继续加
String aa = getCanonicalQueryString(map);
System.out.println(aa);
String authorization = org.apache.commons.codec.digest.DigestUtils.md5Hex(aa);
System.out.println(authorization);
public static String getCanonicalQueryString(SortedMap<String, String> paramsMap) {
StringBuilder queryString = new StringBuilder();
boolean isFirstParameter = true;
for (Map.Entry<String, String> entry : paramsMap.entrySet()) {
String paramName = entry.getKey();
String value = entry.getValue();
if (!isFirstParameter) {
queryString.append("&");
} else {
isFirstParameter = false;
}
queryString.append(paramName).append("=").append(value);
}
return queryString.toString();
}
示例如下:
curl --location -g --request POST 'http://{配置的获取token的Url}?appId=aaa&accessKey=xxx×tamp=yyy' \
--header 'Authorization: demosign'
三、异常码说明
异常code | 说明 | |
ES05910010001 | APP不存在 | 请确认在开放平台创建的APP是否存在 |
ES05910010002 | 签名不正确 | 请确认生成签名的方式是否正确 |
ES05910010003 | 时间戳校验不通过 | 生成的时间戳需要在3分钟内调用,否则校验不通过 |
ES05910010004 | 应用没有当前接口权限 | 应用需要订阅接口api才可以使用 |
ES05910010005 | 检查appId, accessKey, timestamp 传参是否正确 | 开放平台的接口,公共参数appId, accessKey, timestamp必须传,且按照平台的规范 |