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_HeadimgurlWXUserProfile_Nickname字段不存在在返回结果里。(注意,只要有一个不存在就满足本条件) 通过wx.getUserProfile()触发授权,获取各个属性 2:WXUserProfile_HeadimgurlWXUserProfile_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"
},

对本地头像进行裁剪位移

参考微信小程序图片裁剪工具we-cropper

慢护小程序头像,上传前必须裁剪到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"
            }
        ]
    },

results matching ""

    No results matching ""