初揭微信的面纱

31次阅读

共计 3391 个字符,预计需要花费 9 分钟才能阅读完成。

前言

在《微课堂》这个项目中,我们采用了 php 与微信结合的方法,来实现我们想要的功能,如“上课签到”、“上课提醒”等功能,后来随着功能的不断完善,对微信的依赖也越来越多,不过微信开发这部分是另一个队友负责的,自己了解的还是太少了,了解到接下来的项目会用到微信小程序,觉得自己还是先提前了解一下的好。
主要想了解的就是几个概念性的东西,那就从“是什么”、“用来干什么”、“怎么用”来进行分析吧。


OpenID


是什么

openid 是微信用户在公众号 appid 下的唯一用户标识(appid 不同,则获取到的 openid 就不同),可用于永久标记一个用户,同时也是微信 JSAPI 支付的必传参数。 ——摘自 《微信支付开发文档》
在《微课堂》项目的开发调试初期,我以为 OpenID 是不唯一的,就像 cookie 一样,cookie 是有自己的有效期的,上一个 cookie 失效后,会重新生成一个新的 cookie,但是在后期查看 Navicat 的数据表的过程中,我发现 OpenID 是唯一且不会改变的(当然仅限于当前公众号)

也就是说,即使我从当前数据表中删除我的数据,我再次注册后,表单里所存储的我的 OpenID 还是这个 OpenID, 就像上面的文档里说的“永久标记一个用户,下面的图片也说明了这一点。

什么是 appid 呢?

在微信开发文档的获取 Access token 一页,我们可以大致了解到 appid 的作用,接下来我们再详细了解一下 appid:appid 是微信公众账号或开放平台 APP 的唯一标识,在公众平台申请公众账号或者在开放平台申请 APP 账号后,微信会自动分配对应的 appid,用于标识该应用。
也就是说,appid 是公众号或平台的“身份证”,用来区分和识别他们。

用来干什么

OpenID 算是用户在本公众号或平台下的“身份证”,举个不太形象的例子吧,假如把微信比作整个地球,那么公众号或平台就可以看作国家,每个国家的人都有自己的身份证,不同国家的身份证也是不同的,有了这个身份证,用户才能与公众号交互,假如用户取关了该公众号,那么用户将无法与该公众号交互。

怎么用

对于我们的项目来说,OpenID 的唯一性为我们判断用户是否注册提供了便利,当用户点击对应的主页按钮,如“学生主页”,后台就会先查看该 OpenID 的用户是否已存在在数据表中,若存在,就执行登录方法,若不存在,就跳转到注册方法,当然 OpenID 也在其他功能上起到了很大的作用,在此我也就不一一列举了。


access_token


是什么

access_token 是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用 access_token。开发者需要进行妥善保存。access_token 的存储至少要保留 512 个字符空间。access_token 的有效期目前为 2 个小时,需定时刷新,重复获取将导致上次获取的 access_token 失效。 ——摘自《微信官方文档》

用来干什么

公众平台以 access_token 为接口调用凭据,来调用接口,所有接口的调用需要先获取 access_token,access_token 在 2 小时内有效,过期需要重新获取,但 1 天内获取次数有限。
可以把 access_token 作为接口的钥匙,开发者要拿着 access_token 这把钥匙去调用接口,两小时后接口换锁,开发者在两小时后要更换钥匙再去调用接口。

怎么用


由于在项目中对方法进行了封装,并且我没有从开始进行了解,只能引用开发文档中的信息进行阐释了。

  public function getAccessToken($code){$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={$this->appid}&secret={$this->appsecret}&code={$code}&grant_type=authorization_code";
        $res = file_get_contents($url); // 获取文件内容或获取网络请求的内容
        $access_token = json_decode($res,true);
        return $access_token;
    }

这是项目中获取 access_token 的代码,和官方文档给的没有太大差别。


UnionID


是什么

在解释什么是 UnionID 之前,我们先来看一下 UnionID 机制。

UnionID 机制说明

如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过 UnionID 来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的 UnionID 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid 是相同的。——摘自 《微信官方文档. 小程序》
UnionID 机制说明
如果说 OpenID 是“身份证”,那么 UnionID 可以看做“指纹”,在不同的“国家”有不同的“身份证”验证信息和实现交互,而在全球,我们可以通过“指纹”验证信息和实现交互,无论你在那个国家,你的指纹都是相同且唯一的。

用来干什么

假如用户拥有了 UnionID,在他进入一个平台时,无论是选择公众号进入还是选择小程序进入,我们可以用 UnionID 判断这个用户是同一个人,因为用户的 OpenID 在公众号和小程序上是不同的,所以我们无法通过 OpenID 去判断。
开发者还可以通过 OpenID 来获取用户基本信息。

怎么用


由于我们在项目中并未使用到公众号或小程序分别进入的功能,所以对其引用没有进行实践,想了解更多可以进入官方文档查看。
获取用户个人信息(UnionID 机制)


code


是什么

code 作为换取 access_token 的票据,每次用户授权带上的 code 将不一样,code 只能使用一次,5 分钟未被使用自动过期。

请注意,这里通过 code 换取的是一个特殊的网页授权 access_token, 与基础支持中的 access_token(该 access_token 用于调用其他接口)不同。公众号可通过下述接口来获取网页授权 access_token。如果网页授权的作用域为 snsapi_base,则本步骤中获取到网页授权 access_token 的同时,也获取到了 openid,snsapi_base 式的网页授权流程即到此为止。

尤其注意:由于公众号的 secret 和获取到的 access_token 安全级别都非常高,必须只保存在服务器,不允许传给客户端。后续刷新 access_token、通过 access_token 获取用户信息等步骤,也必须从服务器发起。
原文地址:通过 code 换取网页授权 access_token

用来干什么

由上文我们可以知道,code 用来换取特殊网页授权 access_token。
那么这个 access_token 和我们之前介绍的 access_token 有啥区别呢,我查询了一下资料,发现简书上的一位大佬对它们做了区分,在此我引用一下

原文链接:微信网页授权基本步骤
也就是说,在用户授权给公众号后,便会得到这个网页授权 access_token,用这个 access_token 可以进行授权后的接口调用,而其他的微信接口,需要通过“获取 acess_token”接口获取普通的 access_token 进行调用。

怎么用

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code


| 参数 | 说明 |access_token | 接口调用凭证 |expires_in |access_token 接口调用凭证超时时间,单位(秒)|refresh_token | 用户刷新 access_token |openid | 授权用户唯一标识 |scope | 用户授权的作用域,使用逗号(,)分隔

由于本人没有接触太多微信开发,对其调用也是了解的不深,在此便引用了官方文档给出的示例。
通过 code 获取 access_token

总结

由于在项目中没有太多的接触微信,所以对这些概念性的东西还是一知半解,好在新的项目马上就要开始了,与微信也是密切相关,跃跃欲试,想更深入的了解微信,相信在不久后,我会再发布一篇关于微信的博客,相信那时候也是收获满满的。

正文完
 0