1. 获取微信小程序的应用令牌

eyJhbGciOiJSUzI1NiIsImtpZCI6ImI1MGIxZWZmZGMwMzVlMjg2OWI2YzQ1ZjMzYmRmNWQ3In0.eyJpYXQiOjE2ODU0MTE0NzksIm5iZiI6MTY4NTQxMTQ3OSwiaXNzIjoieGR1YS5jb20iLCJleHAiOjIwMDA3NzE0NzksImF1ZCI6Ild4YU1hbkh1Iiwic3ViIjoiQW5vTnltdVMiLCJqdGkiOiIxMjM0NTY3OCIsInNhcCI6IlN2S2VybmVMIiwiY2xyIjoiUiIsInRpZCI6IlcxQXpuMEZmIiwidHlwIjoiTCIsInpvbmUiOiJFbGRyQ2FSRSIsImNvcnAiOiJFbGRyQ2FSRSIsInNob3AiOiJFbGRyQ2FSRSIsInJvbGUiOiIqIiwicnVsZSI6IioifQ.DWJUtkikxkHEkDtg3kihpMhX2_8X2L-TG6xr74rflfEhctZYNnOoaCzUC96Ja7ONxxfi_fEz7gc8yQMTLUCucOrr9u3NBuQuFtxSOXt4Q0PSno0TbX3uN389BNzPzCWb2L0YWpoJe--vEo-ZrIzBPK6XgYQf7vp7dduJ8DwPmTJjSEtoINB4cRXvAFT6ixDcSwk_zL592-zda45xyJ5dPIVcjFuplPDdndCKiNaD6THEdtEqQAo_Btbp-7hQzzsh9iibR3WZxr3rBRxWu3drwkTm4QubqsBXSX9yHynwGKKqytbUNlARbgPLJxhPKHl0Vj7lJz4maeZ-ND0nikH81A

这个令牌规定了如下音素,从过期时间可以看出,这个令牌在2033年过期,是一个长达10年的令牌。

{
    "iat": 1685411479,
    "nbf": 1685411479,
    "iss": "xdua.com",
    "exp": 2000771479,
    "aud": "WxaManHu",
    "sub": "AnoNymuS",
    "jti": "12345678",
    "sap": "SvKerneL",
    "clr": "R",
    "tid": "W1Azn0Ff",
    "typ": "L",
    "zone": "EldrCaRE",
    "corp": "EldrCaRE",
    "shop": "EldrCaRE",
    "role": "*",
    "rule": "*"
}

2. 小程序启动,进入LOGO页面

LOGO页面,就是一个有LOGO的空白页。

  • 通过wx.login()获取code
  • 拿着code通过POST:/Aoginr接口获取返回值 它返回的字段如下(这是微信小程序特有的登录字段):
    {
      "apis": "AddAoginr",
      "apid": "93D6604A-4B6D-4D91-AF45-75A2791699EA",
      "roles": "Zoon",
      "session_key": "tsPRbiFpXVbG59GsavR8FQ==",
      "id": "KqkkOc10",
      "isnew": 0,
      "message": "message",
      "token": "eyJhbGciOiJSUzI1NiIsImtpZCI6ImI1MGIxZWZmZGMwMzVlMjg2OWI2YzQ1ZjMzYmRmNWQ3In0.eyJpYXQiOjE2ODQ4MjQxNTYsIm5iZiI6MTY4NDgyNDE1NiwiaXNzIjoieGR1YS5jb20iLCJleHAiOjE3MjA4MjQxNTYsImF1ZCI6Ild4YU1hbkh1Iiwic3ViIjoiS3Fra09jMTAiLCJqdGkiOiIxMjM0NTY3OCIsInR5cCI6IlUiLCJ0YWciOiI_IiwiY2xyIjoiUiIsImlwbSI6IioiLCJkdm0iOiIqIiwib3duIjoiS3Fra09jMTAiLCJzYXAiOiJTdktlcm5lTCIsImFwaSI6IioiLCJ6b25lIjoiRWxkckNhUkUiLCJjb3JwIjoiRWxkckNhUkUiLCJzaG9wIjoiRWxkckNhUkUiLCJyb2xlIjoiKiIsInJ1bGUiOiIqIiwidGlkIjoiampKckZNMXkiLCJsZ24iOiJidlU1SmtuWCJ9.hIUVUGOtPr6jY5gZODrNvcn9NsN8-OGimdS2uFTn0cJ0Bd6rHxMCPtYteJiNCqKJtNngC9Mvk2xyp6Vkk2ipPJ8O8n0sLM83teC1zds4FSw1xnaHlTQbGzWz8XrJHd8iPF1uw4DR1qqxh_ID_quGdQmAHYyAABCmOjEclRkOvh3evcFjRjXpQ-a-eIgSPlYApTJoDzgPMp9SHsOwU-jEkF5J-fh5JDdMeFauuX_-vqojaTAYXJVteoTRadjWPO0ZKPWR8lMaScrQx7DODQpNKlYmSRg37a1kbWVcvltdafa8ASmBIbI7aMjctetuJbQpDfpz9frGFvgR196IinYWvw"
    }
    
字段 说明 举例
apis 接口名称 AddAoginr
apid 接口调用ID,用来追溯接口错误原因 93D6604A-4B6D-4D91-AF45-75A2791699EA
roles 登录机制返回来的角色列表 Zoon
session_key 微信小程序特有的用来解析的key
id 本次登录的用户id KqkkOc10
isnew 是否是首次在平台登录的用户 0:不是新用户 1:新用户
message 接口返回消息,只有错误的时候,消息才有意义 ok
token 本次登录产生的用户令牌,登录后的所有操作都必须以这个token进行
  • 如果isnew==0,那么直接跳到电话授权页
  • 小程序端要妥善保存上面返回的token,它是用户令牌,以后非匿名访问的API都需要这个令牌。
  • 接下来要去GET:/usrai接口获取想要的微信用户属性(包含头像,昵称等) 他请求的where字段如下举例:

    {"attr":"WXUserProfile_Nickname,WXUserProfile_Tel,WXUserProfile_Headimgurl,WXUserProfile_Unionid,WXUserProfile_Openid"}
    

    上面这个请求后台返回:昵称,头像,电话号码,Unionid,Openid。注意,维信小程序不允许客户端保存unionid,openid,session_key的,一旦它审核时候发现,客户端有知晓和保存这些属性的代码,它会拒绝通过审核。 它返回的字段如下:

    {"WXUserProfile_Unionid":"xxxxxxxx","WXUserProfile_Openid":"xxxxxx","WXUserProfile_Expire":"0"}
    
  • 如果WXUserProfile_Tel属性不存在,或者为空,那么说明我们后台没有拿到电话号码,那么跳到电话授权页,否则继续往下走。

  • 如果WXUserProfile_HeadimgurlWXUserProfile_Nickname字段有一个为空或者不存在,那么跳到头像昵称填入页

3. 电话授权页

电话授权页是一个空页面,一个logo加一个“维信授权登录”的按钮,点击这个按钮时,会获取一个phone_number的code,注意,这个code

参考微信小程序官方文档-获取手机号

需要将 button 组件 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,可以通过 bindgetphonenumber 事件回调获取到动态令牌code,然后把code传到开发者后台,并在开发者后台调用微信后台提供的 phonenumber.getPhoneNumber 接口,消费code来换取用户手机号。每个code有效期为5分钟,且只能消费一次。
注:getPhoneNumber 返回的 code 与 wx.login 返回的 code 作用是不一样的,不能混用。

拿到这个code后要发到后台POST:http://api.svkernel.xdua.com/wxapp_phonenumber接口获取电弧号码,这是一个单独的阿里云网关-函数计算服务,它主要是调用https://api.weixin.qq.com/cgi-bin/token接口获取acess_token,然后通过https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=接口换成电话号码

换成电话号码的格式如下:

{
    "reason": "success",
    "debug": [],
    "apis": "GetWxappPhoneNumber",
    "apid": "C315EC89-1060-4573-88CC-BFFCBF302782",
    "phone_info": {
        "phoneNumber": "15336412970",
        "watermark": {
            "appid": "wxb00499186bdf2e8e",
            "timestamp": 1685416180
        },
        "purePhoneNumber": "15336412970",
        "countryCode": "86"
    },
    "error": 0,
    "message": "ok"
}

通过POST:/usrasi接口把用户的电话号码属性上传

{
    "atto":"WXUserProfile",
    "upserts":JSON.stringify({WXUserProfile_Tel:"+86-15336412970"})    
}

4. 头像昵称页

{
    "atto":"WXUserProfile",
    "upserts":JSON.stringify({WXUserProfile_Gender:"F",WXUserProfile_Headimgurl:"http://test.png",WXUserProfile_Nickname:"快乐火龙果"})    
}

5. 在微信小程序里上传用户头像

上传老人的头像第一步:获取上传的令牌.

参考接口令牌接口 POST:/osts

发送 { okey: 'user/a906449d5769fa7361d7ecc6aa3f6d27.png', objr_id: 'ObR00013', }

[!note|label:okey的规则] okey是要上传的文件的URL后半部分,上传用户头像,其okey必须是仪"user/"开头. 并且以32个字符的md5码作为文件名,文件的后缀暂不做要求,png,jpg两者都可以。

Objr_id是"ObR00013",这个使我们专门规定的一个入口,它的policy如下,从这个policy可以看出,这个只能给avatar-xdua-com/user/(也就是根目录下的user目录)上传文件。

{
    "skma": "ossram",
    "policy": {
        "Version": "1",
        "Statement": [{
            "Action": ["oss:PutObject"],
            "Effect": "Allow",
            "Resource": ["acs:oss:*:*:avatar-xdua-com/user/*"]
        }]
    }
}

所以,我们上传的file的key必须是"user/"开头,这个权限其实就隐藏在获取的SecurityTokenAccessKeySecret里了。下面我特意摘抄了后台根据预设的"ObR00013"查询的policy然后到阿里云的OSS授权中心获取临时credentials

    $stsResult = AlibabaCloud::rpc()
        ->product('Sts')
        ->scheme('https') // https | http
        ->version('2015-04-01')
        ->action('AssumeRole')
        ->method('POST')
        ->host('sts.aliyuncs.com')
        ->options([
            'query' => [
                'RegionId' => "cn-beijing",
                'RoleArn' => $arn,
                'RoleSessionName' => $token_user_id.".".$token_user_id,
                'DurationSeconds' => $timeout,
                'Policy' => json_encode($objr_policy),
            ],
        ])
        ->request();
    $stsResultArray = $stsResult->toArray();

[!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"
},

小程序上传代码必须注意模拟环境和真机的区别

这里特意介绍一下微信小程序本地头像上传到OSS的特别之处,微信小程序本地头像在模拟器和真实手机上是有区别的,举例如下: 不仅后缀不一样,一个是jepg,一个是jpg

真实手机上的本地头像地址:{"avatarUrl":"wxfile://tmp_17650296e8b0f400fa053908170162f528c6a0ef08164da5.jpg"}
在模拟器上的本地头像地址:http://tmp/EM7gpmD4aTGzb5273d95666c5cbf1066750daa2e3429.jpeg

下面的代码是张秀林提取小程序头像本地地址的代码,可以看出,它特意对模拟环境和真实地址使用了不同的提取方式。

 var keyString;
 // 微信小程序模拟器地址:http://tmp/EM7gpmD4aTGzb5273d95666c5cbf1066750daa2e3429.jpeg
 // 真机地址:wxfile://tmp_17650296e8b0f400fa053908170162f528c6a0ef08164da5.jpg
 // 这里做了各个平台的兼容
 if (config.platform == "devtools") {
   keyString = path.substr(path.indexOf("//") + 2).replace(/tmp/, "user")
 } else {
   keyString = path.substr(path.indexOf("//") + 2).replace(/tmp_/, "user/")
 }

这里你会疑问,如果提取算法出错了会怎么?如果提取算法错了,提取到的文件上传OSS的key不是"user/"开头的,那么上传就会出现被拒绝的错误,下面就是一个例子。

{
    "data": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error>\n  <Code>AccessDenied</Code>\n  <Message>Access denied by authorizer's policy.</Message>\n  <RequestId>647710E11675E73530C670E4</RequestId>\n  <HostId>avatar-xdua-com.oss-cn-beijing.aliyuncs.com</HostId>\n  <EC>0003-00000301</EC>\n</Error>\n",
    "header": {
        "x-oss-request-id": "647710E11675E73530C670E4",
        "x-oss-server-time": "11",
        "Server": "AliyunOSS",
        "Connection": "keep-alive",
        "x-oss-ec": "0003-00000301",
        "Content-Length": "281",
        "Date": "Wed, 31 May 2023 09:18:25 GMT",
        "Content-Type": "application/xml",
        "protocol": "http/1.1"
    },
    "statusCode": 403,
    "cookies": [],
    "errMsg": "uploadFile:ok"
}

对本地头像进行裁剪位移

参考微信小程序图片裁剪工具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'

如果这个路径能成功,那必然是正确的。

6. 创建照料对象

参考接口创建一个虚拟用户并关注它

POST:/caree

发送一个body 如下示例

    const api_param = {
        name:"我的爸爸",
        avatar:"https://avatar.xdua.com/user/a906449d5769fa7361d7ecc6aa3f6d27.png",
        height:178,
        weight:56,
        gender:"f",
        age:32
    }

7. 查询自己关注的老人

参考查询自己关注的对象

通过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"
}

8. 关注某个老人

参考创建关注

9. 通过设备的序列号获取设备的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
    },
},

10. 认领一个设备

当一个用户购买了一个床带传感器,他要通过扫码权认领这个床带。首先它通过上面的接口获取了dev_id,然后经过如下接口完成认领

POST:"/udevo" body字段如下 { "user_id":"就是用户自己的8个字符的id", "dev_id":"设备的8个字符的id" }

11. 查询自己关联的所有设备

    "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 ""