微信小程序授權(quán)accessToken配置引導(dǎo)
背景
完成AccessToken相關(guān)配置,才可以發(fā)送小程序訂閱通知。該接口需要實(shí)現(xiàn)下述功能:
1、獲取微信小程序的accessToken,入?yún)⒃O(shè)置了本次請(qǐng)求是否刷新token,請(qǐng)確保該token的可用性。
2、連通性測(cè)試,QA在配置后會(huì)進(jìn)行一次連通性測(cè)試,不會(huì)傳入wxAppId(微信小程序的AppId,詳見(jiàn)接口文檔),請(qǐng)返回正確即可(code為200、token為空即可)。
參數(shù)說(shuō)明
參數(shù)名稱 | 參數(shù)解釋 | 備注 |
URL地址 | 填寫客戶側(cè)獲取微信token的地址 | 接口開(kāi)發(fā)方提供該接口,需實(shí)現(xiàn)上述功能。 |
APP ID | 驗(yàn)簽使用的參數(shù) | 請(qǐng)和接口開(kāi)發(fā)方約定好APPID,在這里填寫即可 |
AccessKey | 驗(yàn)簽使用的參數(shù) | 請(qǐng)和接口開(kāi)發(fā)方約定好AccessKey,在這里填寫即可 |
SecretKey | 驗(yàn)簽使用的參數(shù) | 請(qǐng)和接口開(kāi)發(fā)方約定好SecretKey,在這里填寫即可 |
一、接口文檔
接口描述 | 查詢微信小程序AccessToken | |||
URL | ${第三方填的地址}?appId=aaa&accessKey=xxx×tamp=yyy | |||
請(qǐng)求方式 | POST | |||
請(qǐng)求類型 | application/json | |||
返回類型 | */* | |||
參數(shù)名 | 數(shù)據(jù)類型 | 參數(shù)類型 | 是否必填 | 說(shuō)明 |
1.wxAppId | string | body | 是 | 微信小程序appId |
2.refresh | boolean | body | 是 | 是否需要刷新token,默認(rèn)false |
狀態(tài)碼 | 描述 | 說(shuō)明 | ||
200 | OK | 請(qǐng)求成功。 | ||
401 | Unauthorized | 請(qǐng)求未經(jīng)授權(quán)。 | ||
403 | Forbidden | 請(qǐng)求被拒絕。 | ||
404 | Not Found | 請(qǐng)求的資源不存在。 | ||
返回屬性名 | 類型 | 說(shuō)明 | ||
1.code | string | 請(qǐng)求狀態(tài)碼,200或OK表示成功。 | ||
2.message | string | 錯(cuò)誤信息 | ||
3.accessToken | string | 微信小程序的accesToken | ||
4.expireTime | DateTime | 過(guò)期時(shí)間。格式 | ||
4.requestId | string | 請(qǐng)求ID。 | ||
示例 | ||||
請(qǐng)求參數(shù) | http://{獲取token的Url}?appId=aaa&accessKey=xxx×tamp=yyy | |||
返回值 | {"code":"200","requestId":"string","message":"string","accessToken":"xxxx","expireTime":"2024-09-10 00:00:00"} |
二、驗(yàn)簽說(shuō)明
QA會(huì)根據(jù)下面方式生成簽名,如果需要,請(qǐng)三方根據(jù)此方法驗(yàn)證簽名
QA在請(qǐng)求的接口路徑上會(huì)帶上 appId, accessKey, timestamp(時(shí)間戳參數(shù)),并且需要在header中加入簽名Authorization。
公共參數(shù)說(shuō)明
參數(shù) | 說(shuō)明 | 位置 |
appId | 開(kāi)放平臺(tái)的應(yīng)用id | 請(qǐng)求URI中的參數(shù)部分 |
accessKey | 開(kāi)放平臺(tái)的應(yīng)用的ak | 請(qǐng)求URI中的參數(shù)部分 |
timestamp | 當(dāng)前時(shí)間戳(毫秒) | 請(qǐng)求URI中的參數(shù)部分 |
Authorization | 生成的簽名 | 請(qǐng)求的header中 |
簽名生成規(guī)則:
使用請(qǐng)求參數(shù)構(gòu)造規(guī)范化的請(qǐng)求字符串(Canonicalized Query String)
按照參數(shù)名稱的字典順序?qū)φ?qǐng)求中所有的請(qǐng)求參數(shù)(包括文檔中描述的“公共請(qǐng)求參數(shù)”和給定了的請(qǐng)求接口的自定義參數(shù))進(jìn)行排序。 注:當(dāng)使用GET方法提交請(qǐng)求時(shí),這些參數(shù)就是請(qǐng)求URI中的參數(shù)部分(即URI中"?"之后由"&"連接的部分)
名稱和值要使用UTF-8字符集進(jìn)行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請(qǐng)求,還有其他的query參數(shù),那么繼續(xù)加
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'
三、異常碼說(shuō)明
異常code | 說(shuō)明 | |
ES05910010001 | APP不存在 | 請(qǐng)確認(rèn)在開(kāi)放平臺(tái)創(chuàng)建的APP是否存在 |
ES05910010002 | 簽名不正確 | 請(qǐng)確認(rèn)生成簽名的方式是否正確 |
ES05910010003 | 時(shí)間戳校驗(yàn)不通過(guò) | 生成的時(shí)間戳需要在3分鐘內(nèi)調(diào)用,否則校驗(yàn)不通過(guò) |
ES05910010004 | 應(yīng)用沒(méi)有當(dāng)前接口權(quán)限 | 應(yīng)用需要訂閱接口api才可以使用 |
ES05910010005 | 檢查appId, accessKey, timestamp 傳參是否正確 | 開(kāi)放平臺(tái)的接口,公共參數(shù)appId, accessKey, timestamp必須傳,且按照平臺(tái)的規(guī)范 |