收藏
回答

小游戏服务端API ,setUserStorage 报:48001 api unauthorized

框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
小游戏 Bug 小游戏服务端API , storage.setUserStorage 工具 8.0.3 2.16.1

根据指南做小游戏排行榜功能,使用HTTPS的方式 调用 storage.setUserStorage API 报:48001 api unauthorized,

网上资料实在太少,想问 sig_method = 'hmac_sha256' 是这样写吗? 希望官方补充一些范例吧。

提示 “48001 ,api unauthorized”

是需要登录mp管理后台后,在游戏设置-排行榜配置中完成配置吗?我看指南说,不影响,就暂时没有配置

该配置只影响搜索、小游戏中心的排行榜展现。并不影响利用托管数据、主域和开放数据域的方式实现的游戏内好友排行榜。

服务端代码部分代码如下,

//获取accessToken
let got = require('got')
let config ={appId:'xxxxxxxxx',appSecret:'xxxxxxxxxxx'}
let url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${config.appId}&secret=${config.appSecret}`
const response = await got(url)
let { access_token } = JSON.parse(response.body) 
//数据签名
let { session_key, openid } = (await common.mysql('user_table').where({ id: userId }).select('session_key''openid'))[0]
let str_kv = '{ "kv_list":[{"key":"score","value":"100"}] }'
let signature = crypto.createHmac('sha256', session_key).update(str_kv).digest('hex')
let sig_method = 'hmac_sha256' 
//得到url,和要发送的数据
let curl = `curl -d '${str_kv}' 'https://api.weixin.qq.com/wxa/set_user_storage` 
                + `?access_token=${access_token}&signature=${signature}&openid=${openid}&sig_method=${sig_method}'`


用代码POST 和 CURL 结果都一样,如下

curl -d '{ "kv_list":[{"key":"score","value":"100"}] }' 'https://api.weixin.qq.com/wxa/set_user_storage?access_token=44_vWhpofvZmVo6BorFsJjcg_66kUlaj6dgQJRuzXDU9Gu7vX0Q-wHZ56sJlirWUAwHracF9X8QwlQTus2HieWYqr-QrzfZiFrTh2uSdmm4PqBfB3vLPYMQbApCvOPUNETuhVlO7UjvNC4u09vUSWGcAJAGKU&signature=4925b27ee196df072e41dfc46f64767b57b003e6b4d730816299b59b064a2b89&openid=oy2Rh5V5B1cM_BsDUIuErs32nBW4&sig_method=hmac_sha256'

报错

{"errcode":48001,"errmsg":"api unauthorized rid: 6093e581-0c52f67b-399463e4"}




回答关注问题邀请回答
收藏

1 个回答

  • Forever
    Forever
    2021-05-07

    2021-05-07
    有用 1
    回复 5
    • 田野
      田野
      2021-05-07
      1. 这个文档看过多遍,signature 的算法也用文档中的数据计验证过,是一致的,
      2. access_token,和session_key,都是在调用HTTPS接口,之前全新获取的,应该不存在过期问题
      3. 做的对战游戏,用服务器API就是为了解决,用户端意外掉线,无法上传比赛结果的情况
      4. 实在不行,只能曲线救国了,用这个客户端接口wx.setUserCloudStorage,在用户 恢复登录后,在把意外终止的比赛结果上传了。。。
      2021-05-07
      回复
    • 田野
      田野
      2021-05-07
      onShow,模拟了游戏开始,解密数据得到,session_key,openid并更新了数据库
      2021-05-07
      回复
    • Forever
      Forever
      2021-05-07回复田野
      你node代码不是类似这样写的?
      request.post('https://api.weixin.qq.com/wxa/set_user_storage?access_token=ACCESS_TOKEN&signature=615d2eaedb2e4a086e4362f8b71b2a2ea20e22e3e1076de4fb5df31b8b583f4e&openid=OPENID&sig_method=hmac_sha256', { "kv_list":[{"key":"score","value":"100"},{"key":"gold","value":"3000"}] })
      2021-05-07
      1
      回复
    • 田野
      田野
      2021-05-07
      想搭一套最简代码出来,给你看看,弄了一天,刚刚找到问题了,appId,appSecret,写了2个配置文件,小游戏名称确定后,注册了新的账号,迁移的时候,只改了一个地方,登录解密成功,和 setUserStatus ,accessToken 使用了旧的 配置,谢谢啦
      2021-05-07
      回复
    • 田野
      田野
      2021-05-07回复Forever
      request 库废弃了,用了got
      2021-05-07
      回复
登录 后发表内容