1. 获取微信小程序的应用令牌
eyJhbGciOiJSUzI1NiIsImtpZCI6ImI1MGIxZWZmZGMwMzVlMjg2OWI2YzQ1ZjMzYmRmNWQ3In0.eyJpYXQiOjE2MjAzNzQzMTUsIm5iZiI6MTYyMDM3NDMxNSwiaXNzIjoieGR1YS5jb20iLCJleHAiOjE2NTE5MTAzMTUsImF1ZCI6Ild4YU1hbkh1Iiwic3ViIjoiQW5vTnltdVMiLCJqdGkiOiIxMjM0NTY3OCIsImlwbSI6IioiLCJkdm0iOiIqIiwic2FwIjoiU3ZLZXJuZUwiLCJhcGkiOiIqIiwiY2xyIjoiUiIsIm93biI6IkR0NW12cnRVIiwidGlkIjoibVJGOXZweXgiLCJidWciOiJERSIsImxnbiI6Ik51bGxOdWxsIiwidHlwIjoiTCIsInRhZyI6IlByaW1hcnkiLCJ6b25lIjoiRWxkckNhUkUiLCJjb3JwIjoiRWxkckNhUkUiLCJzaG9wIjoiRWxkckNhUkUiLCJyb2xlIjoiKiIsInJ1bGUiOiIqIn0.le4b9yRbZu9WjsGUoCan9n_huGyKVrngZin4Kw6nB1sdF-pvru-11yWVpyYyikJShMd-YzTTmvd8Cm7yv5o5kswcnzod1BHU4wi1bXJ436CAgKl6ENw-6YxBoIzgs1CLkUxCXFDnOK4frAYsMmb3dz4nIl26lZc52-lGiuSHcv4mZCiQpm-VKQNE62xJJNp2m5jgpKeVAMIgwM9etcRJ1XfiPau6Bq-M1EqIBK-K9akF1LvpOnSod1nGT55Y2SjnJOljPsc0yQB5liwR7W9wZL1zZ11xzIxWOqM1kGp1JCgtdxnrypxZ2yCfM0-N-njWdrA-2VEw4ix62Wpeu8P7fA
这个令牌规定了如下重要因素
`
{
"aud":"WxaManHu", //这个应用的名字
"sub":"AnoNymuS", //匿名用户
"clr":"R",
"own":"Dt5mvrtU",
"lgn":"NullNull",
"typ":"L", //登录令牌,仅仅用于登录
"tag":"Primary",
"zone":"EldrCaRE", //慢护通这个社区店铺
"corp":"EldrCaRE",
"shop":"EldrCaRE",
"role":"", //
"rule":"" //什么权限都有
}
`
2. 登录
- 通过wx.login()获取code
- 拿着code通过POST:/Aoginr接口获取返回值
它返回的字段如下:
{id:"用户的8个字符的id",token:"很长的一个token,相当于用户登录后的权限级别"}
- 小程序端要妥善保存上面返回的token,它是用户令牌,以后非匿名访问的API都需要这个令牌。
接下来要去GET:/usrai接口获取想要的微信用户属性(包含头像,昵称等) 它返回的字段如下:
{"WXUserProfile_Unionid":"xxxxxxxx","WXUserProfile_Openid":"xxxxxx","WXUserProfile_Expire":"0"}
接下来会有几种情况, 1:
WXUserProfile_Headimgurl
或WXUserProfile_Nickname
字段不存在在返回结果里。(注意,只要有一个不存在就满足本条件) 通过wx.getUserProfile()触发授权,获取各个属性 2:WXUserProfile_Headimgurl
和WXUserProfile_Nickname
字段都存在在返回结果里。 那么就看"WXUserProfile_Expire"字段 对"WXUserProfile_Expire"字段进行判断,把这个值转换为整形,求出当前的utc时间戳的差距 如果"WXUserProfile_Expire"和当前时间戳的秒数差距大于30243600(一个月),那么就需要通过wx.getUserProfile()触发一次授权弹框,更新头像,昵称。 如果"WXUserProfile_Expire"和当前时间戳的秒数差距小于30243600(一个月),那么就不需。接下来要去POST:/usrasi接口把用户的属性上传
{
"atto":"WXUserProfile",
"upserts":JSON.stringify({WXUserProfile_Gender:"F",WXUserProfile_Headimgurl:"http://test.png",WXUserProfile_Nickname:"快乐火龙果"})
}
当使用电弧号码授权时,把电话号码更新到用户名下
通过POST:/usrasi接口把用户的电话号码属性上传
{
"atto":"WXUserProfile",
"upserts":JSON.stringify({WXUserProfile_Tel:"+86-15336412970"})
}
3. 制作发现页面
发现页面包含一个产品的banner,和一个公众号文章列表。这两个接口都是获取obj对象。只是频道不同。
公众号文章获取
参考接口查询对象
接口返回的jata结构举例
请求的方式是:GET:https://api.xdua.com/obj?page=1&where={objc_id:"ArtGzhMH"}
频道ArtGzhMH
是慢护公众号的文章列表,它的jata数据结构如下
{
"url":"公众号文章的URL",
"title":"公众号文章的题目",
"cover":"公众号文章的封面"
}
{
"url":"https://mp.weixin.qq.com/s/IVMdzf3T_IUignaHxdmr1w",
"title":"降压药天天吃,但是忽略这几点等于白吃,还会引起严重的后果",
"cover":"https://mmbiz.qpic.cn/mmbiz_jpg/GZ9ib0L9yAPWnzZYxRkiapvSqiaEV9xWG7ZBXRcvvYIoicseUeic6goffoA2dZkK7iaXosqfRLjlPDnsctDJI82HkWTw/640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1"
}
4. 在微信小程序里上传用户头像
上传老人的头像第一步:获取上传的令牌.
参考接口令牌接口 POST:/osts
发送 { okey: 'user/a906449d5769fa7361d7ecc6aa3f6d27.png', objr_id: 'ObR00013', }
[!note|label:okey的规则] okey是要上传的文件的URL后半部分,上传用户头像,其okey必须是仪"user/"开头. 并且以32个字符的md5码作为文件名,文件的后缀暂不做要求,png,jpg两者都可以。
[!note|label:关于objr_id] 这个必须是'ObR00013',这是地球号平台专门分配给慢护微信小程序上传用户头像的。
可获取
{
"Expiration":"2021-05-08T03:56:49Z",
"AccessKeyId":"STS.NT3136gAnG4jiLscCVwuv8c2e",
"SecurityToken":"CAISngJ1q6Ft5B2yfSjIr5eGeomCip5P8PaBa2rCh0MDe/pa16aZhzz2IHlFeHRgBuActfownWtV5/cclrhfV8JAW1bYQI1c8slS7xm9TtI1HV8NEftW5qe+EE2/VjTkvqaLEf+bIfrZfvCyER+m8gZ43br9cxi7QlWhKufnoJV7b9MRLG7aCD1dH4VuOxdFos0XPmerHZTLCBPxhXfKB0dFoxd1jXgFiZ6y2cqB8BHT/hGYgOYevNb2OYP2LZsubp5hWsu8xqlmerfIlSVX7l9X76psy+5mmWya5onDWwEO2XjcbbqIqO8IBRRie603F5RDqPXBjvBisoTR7d+umkoQbb4FCX+BG9n7nZqVRvnMMc0ieKzlOn/AyNeLO4kqF7NcGoABAHj48RRoOQsUqCKBmeNOr9rBLcIV5NTnx2B41nbQPKDu0CbEl5iVxTBOspuY6aohvLMI5aYN5hySVkHzTXBx1l0sYFq4Yxjt3ApTB3mzzn5BxUD3SzY8HnMqQY2RW/ghfQCu8+aj6m1/jNkOKjGBPMXFa28sIFvUbbywckm3kUw=",
"AccessKeySecret":"313jJEhaVbTdXUE7cZUSmRSo2pBvcwQnEEXy76EfEtKo"
},
对本地头像进行裁剪位移
慢护小程序头像,上传前必须裁剪到512x512大小。
然后借助OSS工具上传头像
参考本链接微信小程序直传实践
字段 | 说明 | 举例 |
---|---|---|
host | 填写存储空间的访问域名,例如https://test.oss-cn-zhangjiakou.aliyuncs.com。若您的存储空间已绑定自定义域名,建议填写您的自定义域名。 | https://avatar.xdua.com |
signature | 客户端自己计算的签名 | |
ossAccessKeyId | 临时令牌变量 | 通过POST:/osts接口获取的credentials.AccessKeyId |
policy | 客户端自己通过Base64.encode(JSON.stringify(policyText))计算的policy | |
key | 上传的头像名,这个必须同获取osts是的okey一致 | 'user/a906449d5769fa7361d7ecc6aa3f6d27.png' |
securityToken | 临时令牌变量 | 通过POST:/osts接口获取的credentials.securityToken |
filePath | 填写待上传文件的文件路径,在小程序里,这个path好像是"https://tmp/***.jpeg" |
const host = '<host>';
const signature = '<signatureString>';
const ossAccessKeyId = '<accessKey>';
const policy = '<policyBase64Str>';
const key = '<object name>';
const securityToken = '<x-oss-security-token>';
const filePath = '<filePath>'; // 待上传文件的文件路径。
wx.uploadFile({
url: host, // 开发者服务器的URL。
filePath: filePath,
name: 'file', // 必须填file。
formData: {
key,
policy,
OSSAccessKeyId: ossAccessKeyId,
signature,
// 'x-oss-security-token': securityToken // 使用STS签名时必传。
},
success: (res) => {
if (res.statusCode === 204) {
console.log('上传成功');
}
},
fail: err => {
console.log(err);
}
});
我们使用的是客户端生成签名的方式上传文件。 有下面几点需要关注
policy的生成方式:
const policyText = {
expiration: date.toISOString(), // 设置policy过期时间。
conditions: [
// 限制上传大小。我们设置头像上线是1M,不鼓励用户使用超大图片当头像
["content-length-range", 0, 1 * 1024 * 1024],
],
};
credentials变量的获取,正是从上段所述的POST:/osts接口获取credentials变量。
如何判断头像上传成功
如果上传的key是'user/a906449d5769fa7361d7ecc6aa3f6d27.png',那么上传成功后的图片地址是'https://avatar.xdua.com/user/a906449d5769fa7361d7ecc6aa3f6d27.png'
如果这个路径能成功,那必然是正确的。
5. 创建照料对象
参考接口创建一个虚拟用户并关注它
POST:/caree
发送一个body 如下示例
const api_param = {
name:"我的爸爸",
avatar:"https://avatar.xdua.com/user/a906449d5769fa7361d7ecc6aa3f6d27.png",
height:178,
weight:56,
gender:"f",
age:32
}
6. 查询自己关注的老人
通过GET:/careei 发送body{"type":"F"}来获取如下结果
{
"status": 200,
"apid": "3E1FE8D4-1950-4EA7-BEC3-D219247B25B4",
"apis": "QriCaree",
"error": 0,
"result": {
"total": 11,
"pages": 1,
"offset": 0,
"count": 11,
"format": "raw",
"limit": 20,
"where": {
"carer_id": "Dt5mvrtE",
"state[!]": 3
},
"page": 1,
"sort": {
"inc": "DESC"
},
"list": [{
"caree_id": "bl2sJ6G6",
"carer_id": "Dt5mvrtE",
"XduaUserProfile_Gender": "f",
"cstamp": "2021-05-11 19:50:26",
"id": "d31ZJDI1",
"XduaUserProfile_Name": "我的哥哥",
"XduaUserProfile_Avatar": "https://avatar.xdua.com/user/test.png"
}, {
"caree_id": "bl2sJ6G6",
"carer_id": "Dt5mvrtE",
"XduaUserProfile_Gender": "f",
"cstamp": "2021-05-11 19:50:26",
"id": "CMmMwOCD",
"XduaUserProfile_Name": "我的哥哥",
"XduaUserProfile_Avatar": "https://avatar.xdua.com/user/test.png"
}, {
"caree_id": "gDA3Vqim",
"carer_id": "Dt5mvrtE",
"XduaUserProfile_Gender": "f",
"cstamp": "2021-05-11 19:48:39",
"id": "yGGcNghc",
"XduaUserProfile_Name": "我的妈妈",
"XduaUserProfile_Avatar": "https://avatar.xdua.com/user/test.png"
}, {
"caree_id": "gDA3Vqim",
"carer_id": "Dt5mvrtE",
"XduaUserProfile_Gender": "f",
"cstamp": "2021-05-11 19:48:39",
"id": "gxvtcJMM",
"XduaUserProfile_Name": "我的舅舅",
"XduaUserProfile_Avatar": "https://avatar.xdua.com/user/test.png"
}, {
"caree_id": "aMu9vls2",
"carer_id": "Dt5mvrtE",
"XduaUserProfile_Gender": "f",
"cstamp": "2021-05-11 19:46:12",
"id": "hf62WMaU",
"XduaUserProfile_Name": "我的爷爷",
"XduaUserProfile_Avatar": "https://avatar.xdua.com/user/test.png"
}, {
"caree_id": "cuhJt5PD",
"carer_id": "Dt5mvrtE",
"XduaUserProfile_Gender": "f",
"cstamp": "2021-05-10 00:27:55",
"id": "Hse9HSa4",
"XduaUserProfile_Name": "我的奶奶",
"XduaUserProfile_Avatar": "https://avatar.xdua.com/user/test.png"
}]
},
"debug": [],
"event": "{\"headers\":{\"XduaApiAudience\":\"*\",\"CaOpenId.corp\":\"EldrCaRE\",\"CaOpenId.bug\":\"DE\",\"CaOpenId.zone\":\"EldrCaRE\",\"XduaApiValidQueryFilters\":\"*\",\"XduaApiValidQueryFields\":\"@all,*\",\"CaOpenId.iss\":\"xdua.com\",\"XduaApiShop\":\"*\",\"XduaApiEnable\":\"true\",\"CaOpenId.own\":\"Dt5mvrtE\",\"XduaApiAction\":\"QueriCaree\",\"XduaApiRule\":\"QueriCaree\",\"XduaApiTokenType\":\"U\",\"XduaApiAstates\":\"0\",\"XduaApiResource\":\"care\",\"XduaAcceptLang\":\"zh\",\"CaOpenId.lgn\":\"Cf39Gmqr\",\"XduaApiMethod\":\"QRI\",\"XduaClientDev\":\"null\",\"CaStage\":\"RELEASE\",\"CaOpenId.sap\":\"SvKerneL\",\"CaOpenId.jti\":\"12345678\",\"XduaApiValidQueryFormats\":\"raw\",\"XduaApiValidQueryWheres\":\"attr\",\"CaOpenId.iat\":\"1620736732\",\"CaHttpSchema\":\"HTTP\",\"CaOpenId.aud\":\"WxaManHu\",\"CaOpenId.nbf\":\"1620736732\",\"XduaApiRoles\":\"*\",\"Authorization\":\"eyJhbGciOiJSUzI1NiIsImtpZCI6ImI1MGIxZWZmZGMwMzVlMjg2OWI2YzQ1ZjMzYmRmNWQ3In0.eyJpYXQiOjE2MjA3MzY3MzIsIm5iZiI6MTYyMDczNjczMiwiaXNzIjoieGR1YS5jb20iLCJleHAiOjE2MjA3MzczMzIsImF1ZCI6Ild4YU1hbkh1Iiwic3ViIjoiRHQ1bXZydEUiLCJqdGkiOiIxMjM0NTY3OCIsInR5cCI6IlUiLCJ0YWciOiJQcmltYXJ5IiwiY2xyIjoiUiIsImlwbSI6IioiLCJkdm0iOiIqIiwib3duIjoiRHQ1bXZydEUiLCJzYXAiOiJTdktlcm5lTCIsImFwaSI6IioiLCJ6b25lIjoiRWxkckNhUkUiLCJjb3JwIjoiRWxkckNhUkUiLCJzaG9wIjoiRWxkckNhUkUiLCJyb2xlIjoiKiIsInJ1bGUiOiIqIiwiYnVnIjoiREUiLCJ0aWQiOiJjNGR5YkkxcSIsImxnbiI6IkNmMzlHbXFyIn0.Uu2J3L5e6qAv4yv9a4o4vQQz0or5krkUht__c_xxuqz3UgXrqrfc84XWav6fDP7tiCA9Atsy3qWMNhU7e8yVtMVTCcKxDWvTFLL24RXS32bghXhup60_w2bYhVqDCigV91FhglLsB32FOhh3p5W8TY8zOjZZwDR3Rv6a_bx6NMbTrI8oOKTBd5uCNg6_Zzzh50vTYIdgpVP1QHgjnI523uxsPfddi9f_xH49AQaZHNzcSMilXFB_n0GpYxraMtKnWguMiW3dFnMWx98Ckozybs3wFs-39hsAW4VEQ2Np6VtK-Ex1tML-pQKSiXndwjgMi9G7dfZPNgb6O1yqMepItA\",\"CaRequestId\":\"3E1FE8D4-1950-4EA7-BEC3-D219247B25B4\",\"CaRequestHandleTime\":\"2021-05-11T12:38:52Z\",\"CaClientIp\":\"39.97.224.240\",\"CaOpenId.sub\":\"Dt5mvrtE\",\"CaApiName\":\"QriCaree\",\"CaOpenId.tag\":\"Primary\",\"CaDomain\":\"api.svkernel.xdua.com\",\"CaOpenId.api\":\"*\",\"XduaApiHttpSchema\":\"HTTPS\",\"CaOpenId.tid\":\"c4dybI1q\",\"XduaApiKparam\":\"state+.+expire\",\"CaOpenId.typ\":\"U\",\"CaOpenId.clr\":\"R\",\"XduaApiSubject\":\"*\",\"CaClientUa\":\"axios/0.18.1\",\"CaProxy\":\"AliCloudApiGateway\",\"CaOpenId.ipm\":\"*\",\"XduaApiVersion\":\"1.0.0\",\"CaOpenId.shop\":\"EldrCaRE\",\"CaOpenId.role\":\"*\",\"CaOpenId.exp\":\"1620737332\",\"XduaApiColor\":\"*\",\"CaOpenId.dvm\":\"*\",\"CaOpenId.rule\":\"*\",\"XduaApiValidQuerySchemas\":\"*\"},\"httpMethod\":\"GET\",\"isBase64Encoded\":false,\"path\":\"/careei\",\"pathParameters\":{},\"queryParameters\":{\"filter\":\"*\",\"schema\":\"*\",\"offset\":0,\"limit\":20,\"format\":\"raw\",\"where\":\"{}\",\"page\":0,\"sort\":\"inc:DESC\",\"fields\":\"@all,*\"}}",
"message": "message",
"reason": "success"
}
7. 关注某个老人
参考创建关注
8. 通过设备的序列号获取设备的ID
用扫一扫的方式,获取设备的序列号sn,然后通过sn获取id.sn变id的接口如下》
通过GET请求向:/dev 发送
"/dev/snid:WFMC.D0BAE4504530"
其中"snid:"前缀表示这是一个序列号。
如果返回的error==200001,那么就是设备不存在。
否则
获得如下结果
{
id: 'wJderfRw', //设备的id
data:
{
brief: '自主开发的压电薄膜床带', //设备对应产品的简介
vgtw: '无', //设备桥接网关
owner_name: '无', //设备有没有主人
shop_name: '中科慢护', //设备从属的店铺
type: '睡眠床带', //产品的类型
devp_name: '睡眠床带', //产品的名字
bat: '未知', //设备的电量
name: 'WFMC.D0BAE4504530', //设备的名字
model: 'MM-103K', //设备的型号
id: 'wJderfRw', //设备的id
sn: 'WFMC.D0BAE4504530', //设备的序列号
man: '上海绵绵', //设备制造商
firmware: '' //设备的固件信息
bm:"C", //设备的BM
},
},
9. 认领一个设备
当一个用户购买了一个床带传感器,他要通过扫码权认领这个床带。首先它通过上面的接口获取了dev_id,然后经过如下接口完成认领
POST:"/udevo" body字段如下 { "user_id":"就是用户自己的8个字符的id", "dev_id":"设备的8个字符的id" }
10. 查询自己关联的所有设备
"result":{
"total":3,
"pages":1,
"offset":0,
"count":2,
"format":"raw",
"limit":20,
"where":{
"user_id":"Dt5mvrtE",
"state[!]":3
},
"page":1,
"sort":{
"inc":"DESC"
},
"list":[
{
"devp_id":"BcgBeltX",
"devp_name":"睡眠床带",
"snid":"WFMC.D0BAE4505D06",
"user_id":"Dt5mvrtE",
"name":"WFMC.D0BAE4505D06",
"id":"Bt8eCldE",
"dev_id":"AZawUFHF"
},
{
"devp_id":"BcgBeltX",
"devp_name":"睡眠床带",
"snid":"WFMC.D0BAE4504530",
"user_id":"Dt5mvrtE",
"name":"WFMC.D0BAE4504530",
"id":"pmTF9O6T",
"dev_id":"wJderfRw"
}
]
},