本文基于微信公众号开发平台文档整理出来的
一、公众号(服务号)基本信息获取
1、创建微信公众平台开发账号
2、配置开发信息【这些设置都要开通认证(非个人)】
3、获取测试订阅号
我们个人的订阅号没有办法开通微信认证很多功能不能使用 ,
可以获取测试号进行开发测试
由于用户体验和安全性方面的考虑,微信公众号的注册有一定门槛,某些高级接口的权限需要微信认证后才可以获取。
所以,为了帮助开发者快速了解和上手微信公众号开发,熟悉各个接口的调用,我们推出了微信公众帐号测试号,通过手机微信扫描二维码即可获得测试号。
如果服务器没有配置好微信服务器的认证接口会配置失败
我们也可以用 ngrok 将本机的端口,进行内容穿透,变成网络路径
zzzzzz
注册之后开通隧道
-
打开客户端,配置要打开的隧道
-
将我们的花生壳域名拿去验证
4、以上接口为微信的签名认证
微信以 get 请求来验证我们的服务器,
认证成功请原样返回 echostr 参数内容,则接入生效,成为开发者成功,否则接入失败。
认证接口配置成功后,下面的提交按钮会隐藏
5、设置用户关注公众号后的微信服务器回调接口(给我们服务器发送用户信息)
这里填写的是域名(是一个字符串),而不是URL,因此请勿加http://等协议头;
到这里,我们就获取到我们必须用到的测试信息了,包括
-
公众号appID、appsecret的获取;
-
关注我们测试的公众号;
-
配置扫码用户授权后回调的域名。
二、微信授权登录并获取用户基本信息
-
通过网页授权的方式
-
第二种【三】但是原来的代码实现方式是根据 ticket 获取微信二维码,来引导用户关注二维码的
关注微信服务号时序图
1、用户统一授权,获取 code
[参考博文] https://blog.csdn.net/qq_34184943/article/details/104836671
网页是在微信中打开的,那我怎么第三方网站该怎么确定用户是否登陆呢?
其实我们前面扫码的时候传过来一个code,此时我们就可以将获取到到用户信息和code绑定,您可以将这部分信息放入数据或者redis中,然后在我们的网站中根据这code循环获取这部分信息,若查询到了网站则登陆。
-
code 说明:
code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。
-
获取 code 的链接:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
-
参数说明:
-
appid公众号的唯一标识(这个就是我们前面申请的)
-
redirect_uri 授权后重定向的回调链接地址(我们前面申请的)
-
response_type 返回类型,请填写code
-
scope 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),
-
scope = snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)
-
state 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节,该值会被微信原样返回,我们可以将其进行比对,防止别人的攻击。
-
#wechat_redirect 直接在微信打开链接,可以不填此参数。做页面302重定向时候,必须带此参数
-
2、通过 code 换取网页授权的 access_token
-
获取链接:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
-
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
appid | 是 | 公众号的唯一标识 |
secret | 是 | 公众号的appsecret |
code | 是 | 填写第一步获取的code参数 |
grant_type | 是 | 填写为authorization_code |
-
只有获取code的链接必须是在微信客户端中点开的,获取access_token和用户信息可以直接在网页打开即可
-
返回说明
{ "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE" }
参数 | 描述 |
---|---|
access_token | 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同 |
expires_in | access_token接口调用凭证超时时间,单位(秒) |
refresh_token | 用户刷新access_token |
openid | 用户唯一标识 |
scope | 用户授权的作用域,使用逗号(,)分隔 |
3、 根据 openid 查看用户是否已经关注过我们的服务号
获取用户基本信息(包括UnionID机制)
接口调用请求说明 http请求方式: GET https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
access_token | 是 | 调用接口凭证 |
openid | 是 | 普通用户的标识,对当前公众号唯一 |
lang | 否 | 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语 |
返回说明 参数说明
参数 | 说明 |
---|---|
subscribe | 用户是否订阅该公众号标识,值为0 时,代表此用户没有 关注该公众号,拉取不到其余信息。 |
openid | 用户的标识,对当前公众号唯一 |
nickname | 用户的昵称 |
sex | 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知 |
city | 用户所在城市 |
country | 用户所在国家 |
province | 用户所在省份 |
language | 用户的语言,简体中文为zh_CN |
headimgurl | 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。 |
subscribe_time | 用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间 |
unionid | 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。 |
remark | 公众号运营者对粉丝的备注,公众号运营者可在微信公众平台用户管理界面对粉丝添加备注 |
groupid | 用户所在的分组ID(兼容旧的用户分组接口) |
tagid_list | 用户被打上的标签ID列表 |
subscribe_scene | 返回用户关注的渠道来源,ADD_SCENE_SEARCH 公众号搜索,ADD_SCENE_ACCOUNT_MIGRATION 公众号迁移,ADD_SCENE_PROFILE_CARD 名片分享,ADD_SCENE_QR_CODE 扫描二维码,ADD_SCENE_PROFILE_LINK 图文页内名称点击,ADD_SCENE_PROFILE_ITEM 图文页右上角菜单,ADD_SCENE_PAID 支付后关注,ADD_SCENE_WECHAT_ADVERTISEMENT 微信广告,ADD_SCENE_OTHERS 其他 |
qr_scene | 二维码扫码场景(开发者自定义) |
qr_scene_str | 二维码扫码场景描述(开发者自定义) |
4、根据第三步中返回的 subscribe 值,判断是否跳转到关注页面
-
subscribe = 0 表示未关注
-
引导用户进入公众号
-
按下图获取关注链接方式,手机上获取不到了
5、刷新 access_token(如果需要 ,有效时间为 12 小时)
-
请求地址
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
可以在浏览器中直接执行这个。
-
参数说明
参数 描述 access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同 openid 用户的唯一标识
-
返回数据
{ "openid":" OPENID", " nickname": NICKNAME, "sex":"1", "province":"PROVINCE" "city":"CITY", "country":"COUNTRY", "headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46", "privilege":[ "PRIVILEGE1" "PRIVILEGE2" ], "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL" }
参数 | 描述 |
---|---|
openid | 用户的唯一标识 |
nickname | 用户昵称 |
sex | 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知 |
province | 用户个人资料填写的省份 |
city | 普通用户个人资料填写的城市 |
country | 国家,如中国为CN |
headimgurl | 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。 |
privilege | 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom) |
unionid | 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。详见:获取用户个人信息(UnionID机制) |
6、通过access_token、openid获取用户信息
7、获取 access_token
调用方式: get
调用参数:
正确返回:
{ "access_token": "47_v7gEVDwACEqGN-vLPnJ0IXfvpN6_kfg3J4zuEuL-XlxLuOVliCMJEchGGfJOpew-zd2NyswA5M8XVz6d0k1LtFXy4yj-PSNNgNA_uvwz6LoWcvdBrT-iGQSZb3sj6dSnM3qpEU_5Cww3rfuGYIYbAGAFPF", "expires_in": 7200 }
三、根据 Tiket 获取公众号的二维码引导用户关注公众号
-
利用生成带参数的二维码
-
微信官方文档链接
appID : wxcab027276d79d267
appsecret : 0d484cff8acb9c50eb7f8fb1e2bd73fe
1、获取 access_token
-
access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。
-
有效期目前为2个小时(7200秒),需定时刷新,重复获取将导致上次获取的access_token失效。
-
在刷新过程中,中控服务器可对外继续输出的老access_token,此时公众平台后台会保证在5分钟内,新老access_token都可用,这保证了第三方业务的平滑过渡;
-
调用方式: get
-
调用参数:
参数 | 是否必须 | 说明 |
---|---|---|
grant_type | 是 | 获取access_token填写client_credential |
appid | 是 | 第三方用户唯一凭证 |
secret | 是 | 第三方用户唯一凭证密钥,即appsecret |
正确返回:
{ "access_token": "47_TD5FaYmYu9ElK_CUA7bl-9jIZKP6c0YOdY95k5pW4J2OVZV4qnPlo0PXyg-QJddo_QENkHFfxxAnBVR1mdtyvSxN2Y7Uw6ADehgCIpDWBANsJhU-2BnLb0lkuGuolAr-t8P6KttmaIYi11HiRKDaAEAWPI", "expires_in": 7200 }
2、 创建二维码ticket
-
分两种 tiket ,一种临时的,但是数量无限;第二种永久的,但是只能由10 万个。
临时二维码请求说明
http请求方式: POST URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN POST数据格式:json POST数据例子:{"expire_seconds": 604800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}} 或者也可以使用以下POST数据创建字符串形式的二维码参数:{"expire_seconds": 604800, "action_name": "QR_STR_SCENE", "action_info": {"scene": {"scene_str": "test"}}}
永久二维码请求说明
http请求方式: POST URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN POST数据格式:json POST数据例子:{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 123}}} 或者也可以使用以下POST数据创建字符串形式的二维码参数: {"action_name": "QR_LIMIT_STR_SCENE", "action_info": {"scene": {"scene_str": "test"}}}
参数说明
param := {"expire_seconds": 600, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}
参数 | 说明 |
---|---|
expire_seconds | 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。 |
action_name | 二维码类型,QR_SCENE为临时的整型参数值,QR_STR_SCENE为临时的字符串参数值,QR_LIMIT_SCENE为永久的整型参数值,QR_LIMIT_STR_SCENE为永久的字符串参数值 |
action_info | 二维码详细信息 |
scene_id | 场景值ID,临时二维码时为32位非0整型,永久二维码时最大值为100000(目前参数只支持1--100000) |
scene_str | 场景值ID(字符串形式的ID),字符串类型,长度限制为1到64 |
-
返回说明
正确的Json返回结果:
{ "ticket": "gQEP8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyOGsyRlYyZEtlbkUxZmcxN3h4MTAAAgR4vwdhAwRYAgAA", "expire_seconds": 600, "url": "http://weixin.qq.com/q/028k2FV2dKenE1fg17xx10" }
参数 | 说明 |
---|---|
ticket | 获取的二维码ticket,凭借此ticket可以在有效时间内换取二维码。 |
expire_seconds | 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天)。 |
url | 二维码图片解析后的地址,开发者可根据该地址自行生成需要的二维码图片 |
3、 生成二维码
-
接口:https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET
-
TICKET 记得进行 UrlEncode
4、扫描带参数二维码事件——来获取用户信息
事件的回调方法就是我们在 配置认证的方法
oje6X6JuCi1c14HkK2PkEpEpCPLM
-
官方文档:https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_event_pushes.html
-
用户扫描带场景值二维码时,可能推送以下两种事件:
-
如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。
-
如果用户已经关注公众号,则微信会将带场景值扫描事件推送给开发者。
-
1、用户未关注时,进行关注后的事件推送
推送XML数据包示例:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[FromUser]]></FromUserName> <CreateTime>123456789</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[subscribe]]></Event> <EventKey><![CDATA[qrscene_123123]]></EventKey> <Ticket><![CDATA[TICKET]]></Ticket> </xml>
参数说明:
参数 | 描述 |
---|---|
ToUserName | 开发者微信号 |
FromUserName | 发送方帐号(一个OpenID) |
CreateTime | 消息创建时间 (整型) |
MsgType | 消息类型,event |
Event | 事件类型,subscribe |
EventKey | 事件KEY值,qrscene_为前缀,后面为二维码的参数值 |
Ticket | 二维码的ticket,可用来换取二维码图片 |
-
2. 用户已关注时的事件推送
推送XML数据包示例:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[FromUser]]></FromUserName> <CreateTime>123456789</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[SCAN]]></Event> <EventKey><![CDATA[SCENE_VALUE]]></EventKey> <Ticket><![CDATA[TICKET]]></Ticket> </xml>
参数说明:
参数 | 描述 |
---|---|
ToUserName | 开发者微信号 |
FromUserName | 发送方帐号(一个OpenID) |
CreateTime | 消息创建时间 (整型) |
MsgType | 消息类型,event |
Event | 事件类型,SCAN |
EventKey | 事件KEY值,是一个32位无符号整数,即创建二维码时的二维码scene_id |
Ticket | 二维码的ticket,可用来换取二维码图片 |
5、 根据 OpenID 获取用户信息
GET https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
access_token | 是 | 调用接口凭证 |
openid | 是 | 普通用户的标识,对当前公众号唯一 |
lang | 否 | 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语 |
返回说明
参数说明
参数 | 说明 |
---|---|
subscribe | 用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,拉取不到其余信息。 |
openid | 用户的标识,对当前公众号唯一 |
nickname | 用户的昵称 |
sex | 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知 |
city | 用户所在城市 |
country | 用户所在国家 |
province | 用户所在省份 |
language | 用户的语言,简体中文为zh_CN |
headimgurl | 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。 |
subscribe_time | 用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间 |
unionid | 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。 |
remark | 公众号运营者对粉丝的备注,公众号运营者可在微信公众平台用户管理界面对粉丝添加备注 |
groupid | 用户所在的分组ID(兼容旧的用户分组接口) |
tagid_list | 用户被打上的标签ID列表 |
subscribe_scene | 返回用户关注的渠道来源,ADD_SCENE_SEARCH 公众号搜索,ADD_SCENE_ACCOUNT_MIGRATION 公众号迁移,ADD_SCENE_PROFILE_CARD 名片分享,ADD_SCENE_QR_CODE 扫描二维码,ADD_SCENE_PROFILE_LINK 图文页内名称点击,ADD_SCENE_PROFILE_ITEM 图文页右上角菜单,ADD_SCENE_PAID 支付后关注,ADD_SCENE_WECHAT_ADVERTISEMENT 微信广告,ADD_SCENE_OTHERS 其他 |
qr_scene | 二维码扫码场景(开发者自定义) |
qr_scene_str | 二维码扫码场景描述(开发者自定义) |
{"xml":
{ "ToUserName": {"#cdata-section":"gh_7c126a2c8e36"},
"FromUserName":{"#cdata-section":"oje6X6JuCi1c14HkK2PkEpEpCPLM"},
"CreateTime":"1627962494",
"MsgType":{"#cdata-section":"event"},
"Event":{"#cdata-section":"SCAN"},
"EventKey":{"#cdata-section":"123"},
"Ticket":{"#cdata-section":"gQHz7zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyS1p0QlZoZEtlbkUxYmItODF4MTAAAgRzvAhhAwRYAgAA"}}}