官方文档中给出了示例代码:
wx.login({
success (res) {
if (res.code) {
//发起网络请求
wx.request({
url: 'https://example.com/onLogin',
data: {
code: res.code
}
})
} else {
console.log('登录失败!' + res.errMsg)
}
}
})
能用吗?经反复摸索,终于得到下述用法:
wx.login({
success: res => {
if (res.code) {
let URL='https://api.weixin.qq.com/sns/jscode2session?appid=##################&secret=*****************
***************&js_code='+res.code+'&grant_type=authorization_code'
wx.request({
url: URL ,
success:function(res){
console.log(res.data)//res.data中有openid
}
})
}
} })
注:###......#为小程序ID;***……*为小程序密钥。res.code为临时获得的码。还得注意编译程序时本地设置中勾选“不校验合法域名”
小程序中的坑太多了!官方文档多单不实用!!!
所有api.weixin.qq.com开头的接口,都得服务端调用。前端调用上线不了,小程序后台不支持配置api.weixin.qq.com开头的服务器域名
官方有图,比实例代码清晰。是发到开发者服务器,后端自己获取到openid再返回。
如果小程序的功能完全无需后台服务器交互——确实可以没有,就跟古老的单机PC游戏一样。但那样你是无法获取授权的,不过可以通过getProfielUserinfo获取用户信息保存在手机端。
获取授权的意思是,你的小程序应用,需要有用户管理系统,后台记录每个前端用户的数据(也就是通过openid映射到某个小程序用户),那样你的小程序运营过程中可以给某些确定的用户发积分/邮件什么的。
/** * TODO 通过 code 获取 OpenID 注册,并记录登录状态 * @route /api/wxa/getOpenidByCode/:code * @method POST * @param string $code 通过小程序接口(wx.login)获取到 * @return array(user, token) */ public function getOpenidByCode(string $code): array { /** * 调用微信的接口,获取 openid、unionid、session_key * https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-login/code2Session.html * @type array */ [$code, $openid] = WechatUserService::auth($code); if ($code === false) return $this->fail($openid); // 通过openid注册用户,并返回一个 token [$user, $token] = $this->store($openid); return $this->successful(compact('user', 'token')); }
把appid和secret放在小程序,这不是闹么?你这个用法等于告诉人家你家的门钥匙放在了砖头下面。url和data当然是由服务端告诉你,这文档这么基础都看不懂的话,得从自身找原因了。
我刚刚发现的bug 比你们刺激多了。
添加page页面的时候必须要操作一次构建NPM,不然就是要报错。说找不到文件
另外就是源代码没有任何问题,保存一次可能就报错无法生成,再试一次就可以了。再保存一次又报错缺文件。诶,对就是这样反复整,人都搞懵了!
为什么不推荐客户端直接调用?
AppSecret
是调用jscode2session
必须的参数。为了保护 AppSecret,不应该在客户端暴露它,否则会被恶意用户截取,导致你的小程序被攻击。AppSecret
泄露,攻击者可以伪造请求,窃取用户信息甚至冒充用户。openid
,你无法保证数据的来源可信。任何人都可以伪造请求并传递虚假的code
。code
并直接与微信服务器通信,可以确保数据的真实性。openid
属于个人敏感数据。如果直接在客户端处理,可能违反隐私相关规定,尤其是在敏感场景下。这个链接不对了吗
我现在获取不到了
一个登录获取用户信息的流程,用n个函数+回调,神一般的设计。
你确定这样能获取到openid?js_code不是得通过post传参吗?这样获取不到的