微信小程序开发 如何获取openid和unionid
微wx笑 2019-10-16【入门】 14 0关键字: 微信小程序 openid
微信小程序开发 如何获取openid和unionidUnionID 机制说明如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过 UnionID 来区分用户的唯一性,因为只要是同一
微信小程序开发 如何获取openid和unionid
UnionID 机制说明
如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过 UnionID 来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的 UnionID 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。
小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。
登录流程时序
说明:
调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 和 会话密钥 session_key。
之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。
注意:
会话密钥
session_key
是对用户数据进行 加密签名 的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥。临时登录凭证 code 只能使用一次
客户端代码
我在 app.js 的 onLaunch 中实现,也就是app一启动就去获取
//app.js App({ globalData: { userInfo: null, openId: "", appId: "你的appId(小程序ID)", userid:'' }, onLaunch: function () { let that = this; // 从本地存储中获取信息 var openid = wx.getStorageSync("openid"); var userid = wx.getStorageSync("userid"); if (userid != null && userid.length > 0) { that.globalData.userid = userid; } if (openid != null && openid.length > 15) { that.globalData.openId = openid; }else{ // 登录 wx.login({ success: function (res) { // 请求服务器接口获取 openid wx.request({ //获取openid接口 url: 'https://www.ivu4e.com/appname/jscode2session.php', data: { "code": res.code, appId: that.globalData.appId }, method: 'GET', success: function (res) { that.globalData.openId = res.data.openid; wx.setStorageSync("openid", res.data.openid); }, fail: e => { console.error("request(appname/jscode2session)==" + e) } }) } }) } // 获取用户信息 wx.getSetting({ success: res => { if (res.authSetting['scope.userInfo']) { // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框 wx.getUserInfo({ success: res => { // 可以将 res 发送给后台解码出 unionId this.globalData.userInfo = res.userInfo // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回 // 所以此处加入 callback 以防止这种情况 if (this.userInfoReadyCallback) { this.userInfoReadyCallback(res) } } }) } }, fail: e => { console.logs(e); } }); } })
服务器端代码
我使用的PHP,使用curl调用微信小程序服务端接口
<?php $code = ''; if(isset($_GET['code'])){ $code = htmlspecialchars($_GET['code']); }else{ printf('{"errcode":41008,"errmsg":"missing code"}'); exit; } $appId = '你的appId(小程序ID)'; $appSecret = '你的AppSecret(小程序密钥)'; $url = 'https://api.weixin.qq.com/sns/jscode2session?appid='.$appId.'&secret='.$appSecret.'&js_code='.$code.'&grant_type=authorization_code'; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_HEADER, 1); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);//这个是重点。 $response = curl_exec($curl); if (curl_errno($curl)) { // echo 'Errno'.curl_error($curl);//捕抓异常 printf('{"errcode":1,"errmsg":"'.curl_error($curl).'"}'); }else{ if (curl_getinfo($curl, CURLINFO_HTTP_CODE) == '200') { $header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE); // $headers = substr($response, 0, $header_size); $body = substr($response, $header_size); $data = json_decode($body); //printf('{"errcode":0,"openid":"%s","sessionkey":"%s"}', $data->openid, $data->session_key); printf('{"errcode":0,"openid":"%s"}', $data->openid); }else{ printf('{"errcode":1,"errmsg":"'.curl_getinfo($curl, CURLINFO_HTTP_CODE).'"}'); } } curl_close($curl);
接口说明
请求地址
GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
请求参数
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
appid | string | 是 | 小程序 appId | |
secret | string | 是 | 小程序 appSecret | |
js_code | string | 是 | 登录时获取的 code | |
grant_type | string | 是 | 授权类型,此处只需填写 authorization_code |
返回值
Object
返回的 JSON 数据包
属性 | 类型 | 说明 |
---|---|---|
openid | string | 用户唯一标识 |
session_key | string | 会话密钥 |
unionid | string | 用户在开放平台的唯一标识符,在满足 UnionID 下发条件的情况下会返回,详见 UnionID 机制说明。 |
errcode | number | 错误码 |
errmsg | string | 错误信息 |
errcode 的合法值
值 | 说明 | 最低版本 |
---|---|---|
-1 | 系统繁忙,此时请开发者稍候再试 | |
0 | 请求成功 | |
40029 | code 无效 | |
45011 | 频率限制,每个用户每分钟100次 |
参考:
本文由 微wx笑 创作,采用 署名-非商业性使用-相同方式共享 4.0 许可协议,转载请附上原文出处链接及本声明。
原文链接:https://www.ivu4e.cn/collection/miniprogram/started/2019-10-16/258.html
上一篇:返回列表
下一篇:微信小程序接入微信支付