通過官方文檔可以更系統(tǒng)的學習到所有的接口,我這邊羅列一下我自己用到測試過的接口供大家參考。
- 前端-小程序對接官方文檔:https://microapp.bytedance.com/docs/zh-CN/mini-app/develop/api/open-interface/user-information/tt-get-user-info
- 服務端-小程序官方文檔:https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/server/server-api-introduction
1.前端-獲取用戶信息授權
API文檔:https://microapp.bytedance.com/docs/zh-CN/mini-app/develop/api/open-interface/user-information/tt-get-user-info
// tt.getUserProfile(); 獲取用戶的基本信息,只可在 tap和支付 事件回調中調用,每次調用都會彈出授權提示窗,若用戶同意,則會返回用戶的真實數(shù)據。
//獲取已登錄用戶的基本信息或特殊信息,首次使用的用戶會彈出授權提示窗,若用戶同意,則會返回用戶的真實數(shù)據。
tt.getUserInfo({
success(res) {
console.log("getUserInfo 調用成功", JSON.stringify(res));
},
fail(res) {
console.log("getUserInfo 調用失敗", JSON.stringify(res));
},
})
響應:
{
"userInfo": {
"nickName": "claxxxxxhen",
"avatarUrl": "https://p9-passport.byteacctimg.com/img/mosaic-legacy/3796/2975xxx00.image",
"gender": 0,
"city": "",
"province": "",
"country": "",
"language": "",
"userId": "37431xxxxx1486",
"sessionId": "3b652xxxxxxc3b490351ef1311"
},
"rawData": "{\"nickName\":\"claixxxxn\",\"avatarUrl\":\"https://p9-passport.byteacctimg.com/img/mosaic-legacy/3796/297xxxx.image\",\"gender\":0,\"city\":\"\",\"province\":\"\",\"country\":\"\",\"language\":\"\"}",
"signature": "5fed6c636f3cdxxxxx3d2e97e0869d0",
"encryptedData": "G+kEtB+JE2S3/r8V0Ftxxxx/CxxxxxxxxxxxxxFKKLp6LNpm3QtoHlj2BZREiN8zSE8z7gK51ECsKFDyPn4mtuthY90zj+Zwx0EPyC+DwP1ZJ4ahVawzVkMdnBMhnT48+7CZvOAWa/LyY93MmSsDNLDR0BBTpBnYbnqSW3tGNvTcllNuX2F1Laso2RtsFQlQPoVvoBysfIxliFDvL2+Rw/ZEIc2i7uXnbDeTzPuiiC8km7a/ImZSEZiTdsGNDKEnepmYStswydENgG51NiPRwj15JyOAeALb34xhgYFFZGZFw703XGUbXIn8s8tbqJ+u72cjbqxTp/D7qBL2cHA3uJC6rhrM/VgH7hiDMlwApdRQuFcNQSItQ41RhcD14R7iFoQObc4/IPT0BmvG+WuKMV+PuEp8vaA==",
"iv": "ar8P0OkTQxxxxqHrW9w==",
"errMsg": "getUserProfile:ok"
}
- 其中encryptedData是需要的用戶openId等數(shù)據
- iv是用于解密的,需要留存
Q:此外,什么是用戶的openId?什么是用戶的unionId?
A:開發(fā)者可通過OpenID來獲取用戶基本信息。特別需要注意的是,如果開發(fā)者擁有多個移動應用、網站應用和公眾帳號,可通過獲取用戶基本信息中的unionid來區(qū)分用戶的唯一性。也就是說,小程序內openId是唯一的,全平臺unionId是唯一的。
2.前端-用戶登錄
API文檔:https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/api/open-interface/log-in/tt-login
tt.login({
force: true,
success(res) {
console.log(`login 調用成功${res.code} ${res.anonymousCode}`);
},
fail(res) {
console.log(`login 調用失敗`);
},
});
響應:
{
"anonymousCode": "UAx9YfgVDsxxxxxxxxxxiZCXh7OaAfiW8ei…6mhQP1ETXRfFRKxidnPqMxZtxgXv7yrbWjkBwVePN6FIJq-1Q",
"code": "1ujmWYVW0mlU4xzzzzzzxxxxxxxxMUkdf9Vp1…g9z0Gy8LFbNekfVjY-Ng6V4_Bc6HxAPQ-SQvrPS8Gf-1ZFvaE",
"isLogin": true,
"errMsg": "login:ok"
}
tt.login調用douyin接口登錄,獲取code/anonymous_code,這兩個字段是后續(xù)個人加密信息解密的重要字段
3.服務端-jscode2session換取sessionKey
API文檔:https://microapp.bytedance.com/docs/zh-CN/mini-app/develop/server/log-in/code-2-session/
Map<String, String> dataMap = new HashMap<>();
dataMap.put("appid", "tt60d416xxxxc8801");
dataMap.put("secret", "582830exxxxc99e14c0999a");
dataMap.put("code", "3muFdjQoIFZw0WcBLhltspBxxxxxNfT6mkCQO4RbKicdR0j7a12-PRO6yRCHn90HYDg8DerKt_lxoVr1Donbw");
dataMap.put("anonymous_code", "i8MsKM6tGuKzjxMH3vJF3R4NxAN6xxxxxxxx38wsHAcfmY4dXwaWInvy6isFJ5X8ejQzKcYJVgiPCPkBkMwkw4MrRjFY_iVDOcTOY74");
HttpResult httpResult = HttpClientUtils.doPostJson("https://developer.toutiao.com/api/apps/v2/jscode2session", JSON.toJSONString(dataMap));//注意這是生產的地址
String res = httpResult.getBody();
System.out.println(res);
響應:
{
"err_no": 0,
"err_tips": "success",
"data": {
"session_key": "hZy6t19VPjFqm********",
"openid": "V3WvSshYq9******",
"anonymous_openid": "",
"unionid": "f7510d9ab***********"
}
}
- 這個時候能夠獲取session_key(解密用戶信息的重點字段),此外還有重要的用戶openid和unionid
4.服務端-敏感信息解密
API文檔:https://microapp.bytedance.com/docs/zh-CN/mini-app/develop/api/open-interface/user-information/sensitive-data-process/
這邊測試解密用戶信息,此外手機號等encryptData的數(shù)據,都可以拿這套流程來解密。
我這邊主要寫了java后端解密的方法,對于js也可以解密,官方文檔有比較多的方法展示。
Base64.Decoder decoder = Base64.getDecoder();
byte[] sessionKeyBytes = decoder.decode("Ps2xsxxxxxxxJkA==");
byte[] ivBytes = decoder.decode("ar8P0OxxxxxxqHrW9w==");
byte[] encryptedBytes = decoder.decode("cfOy32OwcBaZv7xxxxxxxxxxxvZQHOjzDABhBOWInm0PNGwzXIBkUIZmto2pjC8VDmZS3v3N27OCb2c5E7DblfSVbcjXHuZN7OPB+zOxDADD7Q==");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec skeySpec = new SecretKeySpec(sessionKeyBytes, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivSpec);
byte[] ret = cipher.doFinal(encryptedBytes);
String res = new String(ret);
System.out.println(res);
- 注意:Cipher cipher = Cipher.getInstance(“AES/CBC/PKCS5Padding”); // JDK does not support PKCS7Padding, use PKCS5Padding instead
- 以上會有一個坑,對于JDK版本的不同,對解密的key的長度會有限制。比如
Illegal key size or default parameters
這種錯誤。因為美國的出口限制,Sun通過權限文件(local_policy.jar、US_export_policy.jar)做了相應限制。因此存在一些問題:●密鑰長度上不能滿足需求(如:java.security.InvalidKeyException: Illegal key size or default parameters),然后網上說要通過替換JDK/jre/lib/security的local_policy.jar - 我們正好遇到了服務器上的JDK版本較老,本地的JDK比較新,而上線報錯這樣的問題,下面的方法親測解決異常
- 關于JDK如何啟用無限強度加密:
- 針對Java 8u151之前版本,內含有限強度策略文件,我們下載 oracle上的無限制版本替換local_policy.jar、US_export_policy.jar
- 針對Java 8u151之后版本,默認采用無限強度策略文件,如果我們想定義要使用的版本,有一個安全屬性crypto.policy。Security.setProperty(“crypto.policy”,“unlimited”).在JCE框架初始化之前設置該屬性。
5.再看看敏感數(shù)據解密流程
- tt.login調用douyin接口登錄,獲取code/anonymous_code
- getUserProfile,獲取iv、encryptedData
- jscode2session 獲取session_key (前后端獲取均可)
- 解密用戶信息 (前后端解密均可),注意保存用戶信息
這樣就能夠獲取openid\unionid\用戶明文信息了
6.前端-獲取用戶設備信息
tt.getSystemInfo({
success(res) {
console.log("getSystemInfo 調用成功", JSON.stringify(res));
},
fail(res) {
console.log("getSystemInfo 調用失敗", JSON.stringify(res));
},
});
響應:
"language": "zh_CN",
"version": "6.6.3",
"brand": "devtools",
"fontSizeSetting": 16,
"platform": "devtools",
"battery": 100,
"wifiSignal": 4,
"appName": "devtools",
"statusBarHeight": 47,
"nativeSDKVersion": "10.3.0",
"model": "iPhone 12",
"system": "iOS 14",
"deviceScore": {
"cpu": 7.905,
"gpu": 9.0622,
"memory": 7.0344,
"overall": 7.9524
},
"SDKVersion": "2.68.0",
"pixelRatio": 3,
"screenWidth": 390,
"screenHeight": 844,
"windowWidth": 390,
"windowHeight": 844,
"safeArea": {
"left": 0,
"right": 390,
"top": 47,
"bottom": 810,
"width": 390,
"height": 763
},
"SDKUpdateVersion": "2.68.0.3",
"devicePixelRatio": 3,
"errMsg": "getSystemInfo:ok"
}
7.前端-獲取用戶手機號
獲取抖音API當前登錄狀態(tài)的手機號,獲取前需用戶授權,否則無法獲取。注意:該能力無法直接使用,需申請白名單
小程序獲取手機號授權能力僅適用于以下場景:網絡購物、帳號下信息內容同步、票務預訂、業(yè)務辦理、信息查詢(如:社保、公積金)、預約等,其他不符合使用規(guī)范的申請不予開通,申請可參考: 獲取用戶手機號開通指南
評級達 B 級,且信用分達到 90 分的企業(yè)主體小程序,可以申請獲取用戶手機號能力
tt.getPhoneNumber({
success(res) {
console.log("getPhoneNumber 調用成功", JSON.stringify(res));
},
fail(res) {
console.log("getPhoneNumber 調用失敗", JSON.stringify(res));
},
})
響應:
{
"detail": {
"cloudId": "",
"encryptedData": "0tJ8EV5kwMq8xxxxxxQmf1KG2yKVJX3pYMgWbnY4SJ0MmWMFHJx1ySIaWIgt09sMCL0vAPmgMQ8Hv6d9NgRksOYDTdO1JEmJMy4VGJpBUKL3qqcOvBIc6ToN3RyUTad6Q==",
"iv": "ZtZtYvS7gNbGMpyYg500rA==",
"errMsg": "getPhoneNumber:ok"
},
"errMsg": "getPhoneNumber:ok"
}
這個數(shù)據就一樣解密即可
8.前端-獲取用戶精準位置信息
用于頻繁請求地理位置,實時獲取精確位置信息。一般適用于打車、外賣等需要頻繁請求獲取地理位置的行業(yè)。需要申請后可查看。
tt.chooseAddress({
success(res) {
console.log("chooseAddress 調用成功", JSON.stringify(res));
},
fail(res) {
console.log("chooseAddress 調用失敗", JSON.stringify(res));
},
})
只要有接口權限,并且是用戶登錄授權狀態(tài),即可獲取
響應:
{
"longitude": 116.3974,
"latitude": 39.9092,
"city": "北京市",
"speed": 0,
"accuracy": 65,
"altitude": 0,
"verticalAccuracy": 65,
"horizontalAccuracy": 65,
"errMsg": "getLocation:ok"
}
9.前端-消息訂閱
前端發(fā)起用戶訂閱訂單消息通知,用戶同意后,即可通過接口發(fā)送實時訂單消息給用戶,提升用戶體驗
小程序消息訂閱能力說明
注意:沙盒內測試僅支持安卓,如綁定的設備是IOS的測試會報錯 — {"errMsg":"requestSubscribeMessage:fail not supported by current application","errNo":21502}
tt.requestSubscribeMessage({
tmplIds: [], // 需要填入開放平臺申請的模版id,支持最多3個同類型模版
success(res) {
//訂閱成功
console.log("訂閱成功", res);
},
fail(error) {
//訂閱失敗
console.log("訂閱失敗, 錯誤詳情: ", error);
tt.showToast({
title: "訂閱失敗",
icon: "fail",
});
},
complete(res) {
//訂閱完成
console.log("tt.requestSubscribeMessage API調用完成: ", res);
},
});
如果是安卓設備,請求結果如下:
{
"MSG137673105551c58exxxxx15858": "accept",
"itemSettings": {
"MSG137673105551cxxxxxbf15858": "accept"
},
"errMsg": "requestSubscribeMessage:ok"
}
10.服務端-獲取AccessToken
AccessToken是接口鑒權憑證
access_token 是小程序的全局唯一調用憑據,開發(fā)者調用小程序支付時需要使用 access_token。access_token 的有效期為 2 個小時,需要定時刷新 access_token,重復獲取會導致之前一次獲取的 access_token 的有效期縮短為 5 分鐘。
接口:POST https://developer.toutiao.com/api/apps/v2/token
請求示例:
curl --location --request POST 'https://developer.toutiao.com/api/apps/v2/token' \
--header 'Content-Type: application/json' \
--data-raw '{
"appid": "ttabc*****",
"secret": "d428***********",
"grant_type": "client_credential"
}'
響應:
{
"err_no": 0,
"err_tips": "success",
"data": {
"access_token": "0801121***********",
"expires_in": 7200
}
}
11.服務端-發(fā)送訂閱消息
請求地址: POST https://developer.toutiao.com/api/apps/subscribe_notification/developer/v1/notify
POSTMAN中的請求示例文章來源:http://www.zghlxwxcb.cn/news/detail-778281.html
curl --location --request POST 'https://developer.toutiao.com/api/apps/subscribe_notification/developer/v1/notify' \
--header 'Content-Type: application/json' \
--data-raw '{
"access_token": "080112184679zzzz7556f426d33673d3d",
"app_id": "tt60d4166zzzzzzz8801",
"tpl_id": "MSG137673105zzzzzz7c84bf15858",
"open_id": "_000S3uzzzzzzzzAzN_zZb",
"data": {
"快遞派送": "SF1111111111"
}
}'
響應:文章來源地址http://www.zghlxwxcb.cn/news/detail-778281.html
{
"err_no": 0,
"err_tips": ""
}
到了這里,關于抖音小程序實踐三:接口開發(fā)指南的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!