服务器获取开放数据
小程序可以通过各种后端socket获取陌陌提供的开放数据。 考虑到开发者服务器也需要获取此类开放数据,微信提供了两种获取方式:
方法一:开发者后台标定、开放数据揭秘
微信将对这些开放数据进行签名和加密。 开发者后台收到开放数据后,可以对数据进行校准、签名和解密,确保数据不被篡改。
签名校准和数据解密涉及到用户的会话密钥session_key。 开发者应提前通过wx.login登录过程获取会话密钥session_key,并保存在服务器上。 为了不篡改数据,开发者不要将session_key传递给小程序客户端等服务器外部的环境。
数据签名校准
为了保证open socket返回的用户数据的安全,微信会对明文数据进行签名。 开发者可以根据业务需求对数据包进行签名和校准,保证数据完整性。
通过调用socket获取数据时(如wx.getUserInfo),接口会同时返回rawData和signature,其中signature = sha1( rawData + session_key ) 开发者将signature和rawData发送到开发者服务器进行校准。 服务器使用相同的算法与用户对应的session_key估计签名signature2网站程序添加授权,并比较signature和signature2来校准数据的完整性。
比如wx.getUserInfo的数据标定:
接口返回的rawData:
{
"nickName": "Band",
"gender": 1,
"language": "zh_CN",
"city": "Guangzhou",
"province": "Guangdong",
"country": "CN",
"avatarUrl": "http://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0"
}
用户的会话密钥:
HyVFkGl5F5OQWJZZaNzBBg==
用于签名的字符串是:
{"nickName":"Band","gender":1,"language":"zh_CN","city":"Guangzhou","province":"Guangdong","country":"CN","avatarUrl":"http://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0"}HyVFkGl5F5OQWJZZaNzBBg==
使用sha1得到的结果是
75e81ceda165f4ffa64f4068af58c64b8f54b88c
加密数据解密算法
如果接口涉及敏感数据(如wx.getUserInfo中的openId、unionId),则接口的明文内容不会包含此类敏感数据。 如果开发者需要获取敏感数据,则需要对socket返回的加密数据(encryptedData)进行对称解密。 解密算法如下:
对称解密采用的算法为AES-128-CBC,数据填充为PKCS#7。 对称解密的目标密文是Base64_Decode(encryptedData)。 对称解密密钥aeskey = Base64_Decode(session_key),aeskey为16字节。 对称解密算法的初始向量是Base64_Decode(iv),其中iv由数据套接字返回。
微信官方提供了多种编程语言的示例代码(点击下载)。 每种语言类型的套接字名称都是相同的。 调用方法可以参考示例。
另外,为了校准应用中数据的有效性,会在敏感数据上添加数据水印(watermark)
水印参数说明:
参数类型说明
应用程序标识符
细绳
敏感数据属于appId,开发者可以校准该参数是否与自己的appId一致
时间戳
INT
敏感数据采集时间戳,可供开发者进行数据时效性校准
例如socket wx.getUserInfo的敏感数据中的水印:
{
"openId": "OPENID",
"nickName": "NICKNAME",
"gender": GENDER,
"city": "CITY",
"province": "PROVINCE",
"country": "COUNTRY",
"avatarUrl": "AVATARURL",
"unionId": "UNIONID",
"watermark":
{
"appid":"APPID",
"timestamp":TIMESTAMP
}
}
笔记:
解密后得到的JSON数据可能会根据需求减少新数组,旧数组不会被改变或删除。 开发者需要为会话密钥session_key预留足够的空间
如果开发者遇到因session_key不正确导致签名或解密失败的情况,请注意以下与session_key相关的注意事项。
当调用wx.login时,用户的session_key可能会被更新,使旧的session_key失效(刷新机制有最小周期,如果同一用户在短时间内多次调用wx.login,并不是每次调用都会导致session_key 被刷新)。 开发者只有在明确需要重新登录时才调用wx.login,并及时通过code2Session接口更新服务器中存储的session_key。 微信不会告知开发者session_key的有效期。 我们会根据用户使用小程序的行为来更新session_key。 用户使用小程序的频率越高网站程序添加授权,session_key的有效期就越长。 当session_key失效后,开发者可以通过重新执行登录流程来获取有效的session_key。 使用socket wx.checkSession来校准session_key是否有效,防止小程序重复执行登录过程。 开发者实现自定义登录状态时,可以考虑使用session_key有效期作为自己的登录状态有效期,或者实现自定义时效策略。 方法二:通过云调用直接获取开放数据
如果接口涉及敏感数据(如wx.getWeRunData),则接口的明文内容不会包含此类敏感数据,但返回的socket会包含敏感数据对应的cloudID字段,并且可以通过cloud获取该数据功能。 完整流程如下:
1.获取cloudID
使用2.7.0以上版本的基础库,如果小程序开启了云开发,可以通过开放数据socket返回值中的cloudID字段获取(与encryptedData同级),cloudID有效期为5分钟。
2.调用云函数
调用云函数时,对于传入的data参数,如果有一个顶层数组,其值为wx.cloud.CloudID构造的CloudID,那么调用云函数时,这些数组的值会被替换为打开cloudID对应的数据,一次调用最多可以替换5个CloudID。
例子:
小程序获取到cloudID后发起调用:
wx.cloud.callFunction({
name: 'myFunction',
data: {
weRunData: wx.cloud.CloudID('xxx'), // 这个 CloudID 值到云函数端会被替换
obj: {
shareInfo: wx.cloud.CloudID('yyy'), // 非顶层字段的 CloudID 不会被替换,会原样字符串展示
}
}
})
云函数接收到的事件示例:
// event
{
// weRunData 的值已被替换为开放数据
"weRunData": {
"cloudID": "xxx",
"data": {
"stepInfoList": [
{
"step": 5000,
"timestamp": 1554814312,
}
],
"watermark": {
"appid": "wx1111111111",
"timestamp": 1554815786
}
}
},
"obj": {
// 非顶层字段维持原样
"shareInfo": "yyy",
}
}
如果cloudID无效或过期,则事件中获取的对象将是包含错误代码、错误消息和原始cloudID的对象。 过期cloudID交换结果示例:
// event
{
"weRunData": {
"cloudID": "xxx",
"errCode": -601006,
"errMsg": "cloudID expired."
},
// ...
}
翻译由微信翻译提供,仅供参考。 若中文版本与英文版本有任何不一致或差异,以中文版本为准。 翻译错误。
《海报BANNER》支持打开本小程序、第三方小程序、网页跳转等多种跳转形式。
“类别(二级)”可设置添加两级类别,包括最新、推荐、热门频道,提供多种选择。
“文件列表”显示不同格式的文档或云盘数据,点击可跳转至文件详情。
“分享赚积分”用户邀请1位好友可获得多少积分。
“智能客服”连接陌陌客服智能回复组件,实现自动回复程序付费下载网站,解放手掌
细节:
“内容详情”包括分享者、分享时间、分享文件等信息; 用户通过消耗积分查看文件
“喜欢/不喜欢”查看的用户可以通过喜欢和不喜欢来评论文件
“帮忙观看”智白邀请好友优惠价格获取积分或免费观看积分; 为当前文档和资料提供更多的曝光和下载机会
“查看弹幕”循环显示最近20个用户的下载记录;
「推荐列表」当前文档所在类别中最新上传的文件,增加曝光机会。
个人中心:
“基本信息”显示当前用户的头像、昵称、ID、会员等级等基本信息。
“激活/续费会员”平台可设置三个会员级别程序付费下载网站,不同会员级别可设置【上传文件权限】、【下载文件权限】、【上传文件获取奖励积分】、【下载文件会员折扣】和其他权限
“积分功能”显示与积分相关的相关功能,包括积分详情、积分套餐和购买记录
“权限显示”显示用户当前级别的权限列表
上传文件:
“格式选择”支持上传文件、压缩包和云盘选择
“文件描述”简要描述了当前文件所包含内容的详细信息
“类别选择”选择刘草所在的类别,支持二级分类
“释放积分”用户可以填写当前文件下载所需的积分,平台将根据用户等级分享给用户
“提交发布”提到发布需要在后台进行初步审核,审核通过后才会在平台上展示。