微信小程序获取unionid与openid

摘要:
要获得uniid,首先需要在微信开放平台上绑定小程序,否则无法获得uniid机制来解释uniid以区分用户的唯一性。在同一个微信开放平台账户下的移动应用程序、网站应用程序、小程序和公众号中,用户工会是独一无二的。换言之,同一个用户在同一个微信开放平台下为不同的应用程序建立了相同的联盟。开发人员可以直接使用Wx。login+code2Session获取用户的UnionID,无需用户重新授权。解析参数如下:② 通过applet wx获取代码。登录,请求微信code2Session接口,获取UnionIDpublicfunctiongetXcxUserInfo{if(!

获取unionid需要先在微信开放平台绑定小程序,否则无法获取

UnionID机制说明 
unionid来区分用户的唯一性,在相同微信开放平台帐号下的移动应用、网站应用、小程序、公众号,用户的unionid是唯一的。也就是说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。

OpenID机制说明

OpenId是用来区分应用的唯一性,在相同微信开放平台账号下不用的应用,其unionid相同,OpenId而不同,比如说同一个微信开放平台绑定了多个小程序应用,每个应用的OpenId是不相同。

UnionID获取途径
绑定了开发者帐号的小程序,可以通过下面 3 种途径获取 UnionID。

调用接口 wx.getUserInfo,从解密数据中获取 UnionID。注意本接口需要用户授权,请开发者妥善处理用户拒绝授权后的情况。

如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号。开发者可以直接通过 wx.login + code2Session 获取到该用户 UnionID,无须用户再次授权。

如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用。开发者也可以直接通过 wx.login + code2Session 获取到该用户 UnionID ,无须用户再次授权。

UnionID获取两种实现方式:

① 通过小程序接口wx.getUserInfo,从解密数据中获取 UnionID。

 微信小程序获取unionid与openid第1张

微信小程序获取unionid与openid第2张

以上是微信参考文档:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/code2Session.html

通过解密wx.getUserInfo返回的 encryptedData来获取 

微信小程序获取unionid与openid第3张
encryptedData为加密后的字符串,通过微信官方的加密数据解密算法获取,直接下载官方的demo,以PHP为列

微信小程序获取unionid与openid第4张

demo.php

<?php
// 目录入口
define('AESAPI_ROOT_PATH', dirname(__FILE__)."/AES");
//define('YUNAPI_URL', 'http://cmq-queue-gz.api.qcloud.com');
require_once AESAPI_ROOT_PATH . '/wxBizDataCrypt.php';
 
class AES
{
    public function __construct()
    {
//        $this->appid = '';
//        $this->sessionKey = '';
    }
 
    /*
     * 解析$encryptedData参数
     * @param $appid 小程序id
     * @param $encryptedData 加密串
     * @param $iv 用户iv
     * @param $sessionKey 用户sessionKey
     *
     */
    public function decryption($appid,$encryptedData,$iv,$sessionKey){
        $pc = new WXBizDataCrypt($appid, $sessionKey);
        $errCode = $pc->decryptData($encryptedData, $iv, $data );
        if ($errCode == 0) {
            return $data;
        } else {
            return $errCode;
        }
    }
 
}

wxBizDataCrypt.php

<?php
 
/**
 * 对微信小程序用户加密数据的解密示例代码.
 *
 * @copyright Copyright (c) 1998-2014 Tencent Inc.
 */
 
include_once "errorCode.php";
 
class WXBizDataCrypt
{
    private $appid;
	private $sessionKey;
 
	/**
	 * 构造函数
	 * @param $sessionKey string 用户在小程序登录后获取的会话密钥
	 * @param $appid string 小程序的appid
	 */
	public function __construct( $appid, $sessionKey)
	{
		$this->sessionKey = $sessionKey;
		$this->appid = $appid;
	}
 
 
	/**
	 * 检验数据的真实性,并且获取解密后的明文.
	 * @param $encryptedData string 加密的用户数据
	 * @param $iv string 与用户数据一同返回的初始向量
	 * @param $data string 解密后的原文
     *
	 * @return int 成功0,失败返回对应的错误码
	 */
	public function decryptData( $encryptedData, $iv, &$data )
	{
		if (strlen($this->sessionKey) != 24) {
			return ErrorCode::$IllegalAesKey;
		}
		$aesKey=base64_decode($this->sessionKey);
 
        
		if (strlen($iv) != 24) {
			return ErrorCode::$IllegalIv;
		}
		$aesIV=base64_decode($iv);
 
		$aesCipher=base64_decode($encryptedData);
 
		$result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
 
		$dataObj=json_decode( $result );
		if( $dataObj  == NULL )
		{
			return ErrorCode::$IllegalBuffer;
		}
		if( $dataObj->watermark->appid != $this->appid )
		{
			return ErrorCode::$IllegalBuffer;
		}
		$data = $result;
		return ErrorCode::$OK;
	}
 
}

  

注意事项:会话密钥 session_key 有效性,wx.login 调用时,用户的 session_key 可能会被更新而致使旧 session_key 失效,每个session_key只能使用一次。

解析参数如下:

 微信小程序获取unionid与openid第5张

②通过小程序wx.login获取code,请求微信code2Session接口,获取UnionID

    public function getXcxUserInfo($code)
    {
        if (!$code) return array();
        // 小程序专用信息
        $appid = ''; // 南泥湾商户版
        $appsecret = '';
        $url = "https://api.weixin.qq.com/sns/jscode2session?appid={$appid}&secret={$appsecret}&js_code={$code}&grant_type=authorization_code";
        $res = $this->http_request($url);
        return $res;
    }
 
    /**
     * curl模拟http请求GET/POST
     * @param $url
     * @param null $data
     * @return array
     */
    public function http_request($url, $data = null)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        // 以文件流形式返回
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 
        if (!empty($data))
        {
            // POST请求
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        }
 
        $output = curl_exec($ch);
        curl_close($ch);
 
        // 返回数组
        return json_decode($output, true);
    }

  

微信小程序获取unionid与openid第6张

至此,微信小程序unionid与openid都已成功获取,大家在开发中特别注意要绑定微信开放平台
---------------------
作者:No.1117
来源:CSDN
原文:https://blog.csdn.net/qq_29920751/article/details/83109800

【PHPer技术栈】专注后端开发,倡导开源文化,做一个好玩、有趣、有灵魂的PHPer工程师,欢迎大家关注!

微信小程序获取unionid与openid第7张

免责声明:文章转载自《微信小程序获取unionid与openid》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇vite首次启动加载慢localdatetime获取本月第一天及最后一天下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

为什么每个浏览器User-Agent都是Mozilla?真相原来是这样!

转载自简明现代魔法http://www.nowamagic.net/librarys/veda/detail/2576 故事还得从头说起,最初的主角叫NCSA Mosaic,简称Mosaic(马赛克),是1992年末位于伊利诺伊大学厄巴纳-香槟分校的国家超级计算机应用中心(National Center for Supercomputing Applica...

[转贴]软件产品测试标准

[转贴]软件产品测试标准 软 件 产 品 测 试 标 准 国际标准 •  ISO/IEC 17025 General requirements for the competency of testing and calibration laboratories •  ISO/IEC 14598 Software Engineering-Product...

从手机浏览器或者 APP 中跳转到微信并跳转到指定页原理及行业内幕详解

相信很多朋友遇到过有些网站,可以直接通过一个连接就能让你的手机打开微信且跳转到某个指定的页面,许多程序员很好奇到底是怎么实现的,到处求这种方法的源码,在文本中我会介绍及剖析这种跳转实现的原理。     微信是个比较封闭的环境,至于为什么封闭,相信大家都了解,在一些应用场景中,我们要用到外部浏览器跳转到微信内部打开,比如添加好友、微信支付等,在微信内部环境...

微信分享网页的缩略图

微信公众平台很多时候都需要跳转到网页展示和实现一些功能,而这些网页也是可以被用户分享到朋友圈或发送给朋友的。分享和发送的时候一般都是一个缩略图,一个标题和一个介绍。可是有时候分享的网页缩略图部分是空白的,虽然网页里是包含了图片的,所以就需要研究一下这个缩略图到底怎么。...

Django 框架入门篇(安装与创建项目)

什么是Django框架? 官方定义:Django是一个高级Python Web框架,鼓励快速开发和简洁实用的设计。它由经验丰富的开发人员构建,可以解决大部分Web开发的麻烦,因此您可以专注于编写应用程序而无需重复造轮子。 Django is a high-level Python Web framework that encourages rapid de...

debian linux 中如何查看软件包是否已经安装和如何安装、卸载软件

练习 1 方案:确定软件包是否安装 如果您不确定某个软件包是否已经安装,可以使用dpkg的-l(L的小写) 选项: $ dpkg -l zsh No packages found matching zsh. 上面结果这表明 zsh没有安装。 练习 2 的方案. 搜索软件包 可以使用apt-cache命令和它的search子命令来搜索软件包:zsh,如清单...