入门您现在的位置是:首页 > 专栏文集 > 微信小程序开发 > 入门

微信小程序开发 如何获取openid和unionid

<a href='mailto:'>微wx笑</a>的头像微wx笑2019-10-16 10:38:50入门人已围观关键字: 微信小程序  openid  

微信小程序开发 如何获取openid和unionidUnionID 机制说明如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过 UnionID 来区分用户的唯一性,因为只要是同一

微信小程序开发 如何获取openid和unionidVHu编程技术_踩坑日志_进阶指南_无知人生


VHu编程技术_踩坑日志_进阶指南_无知人生

UnionID 机制说明

如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过 UnionID 来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的 UnionID 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。VHu编程技术_踩坑日志_进阶指南_无知人生

小程序登录VHu编程技术_踩坑日志_进阶指南_无知人生

小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。VHu编程技术_踩坑日志_进阶指南_无知人生

登录流程时序

VHu编程技术_踩坑日志_进阶指南_无知人生

说明:

  1. 调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。VHu编程技术_踩坑日志_进阶指南_无知人生

  2. 调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 和 会话密钥 session_keyVHu编程技术_踩坑日志_进阶指南_无知人生

之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。VHu编程技术_踩坑日志_进阶指南_无知人生

注意:VHu编程技术_踩坑日志_进阶指南_无知人生

  1. 会话密钥 session_key 是对用户数据进行 加密签名 的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥VHu编程技术_踩坑日志_进阶指南_无知人生

  2. 临时登录凭证 code 只能使用一次VHu编程技术_踩坑日志_进阶指南_无知人生

客户端代码

我在 app.js 的 onLaunch 中实现,也就是app一启动就去获取VHu编程技术_踩坑日志_进阶指南_无知人生

//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调用微信小程序服务端接口VHu编程技术_踩坑日志_进阶指南_无知人生

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

请求参数

属性类型默认值必填说明
appidstring
小程序 appId
secretstring
小程序 appSecret
js_codestring
登录时获取的 code
grant_typestring
授权类型,此处只需填写 authorization_code

返回值

Object

返回的 JSON 数据包VHu编程技术_踩坑日志_进阶指南_无知人生

属性类型说明
openidstring用户唯一标识
session_keystring会话密钥
unionidstring用户在开放平台的唯一标识符,在满足 UnionID 下发条件的情况下会返回,详见 UnionID 机制说明
errcodenumber错误码
errmsgstring错误信息

errcode 的合法值VHu编程技术_踩坑日志_进阶指南_无知人生

说明最低版本
-1系统繁忙,此时请开发者稍候再试
0请求成功
40029code 无效
45011频率限制,每个用户每分钟100次

参考:

auth.code2SessionVHu编程技术_踩坑日志_进阶指南_无知人生

UnionID 机制说明VHu编程技术_踩坑日志_进阶指南_无知人生

小程序登录VHu编程技术_踩坑日志_进阶指南_无知人生


VHu编程技术_踩坑日志_进阶指南_无知人生

本文由 微wx笑 创作,采用 CC BY-NC 4.0 许可协议。 非商业性使用可自由转载、引用、甚至修改,但需署名作者且注明出处。

很赞哦! () 有话说 ()