网页关注微信服务号登录

本文基于微信公众号开发平台文档整理出来的

一、公众号(服务号)基本信息获取

1、创建微信公众平台开发账号

https://mp.weixin.qq.com/

2、配置开发信息【这些设置都要开通认证(非个人)】

3、获取测试订阅号

我们个人的订阅号没有办法开通微信认证很多功能不能使用 ,

可以获取测试号进行开发测试

https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Requesting_an_API_Test_Account.html

由于用户体验和安全性方面的考虑,微信公众号的注册有一定门槛,某些高级接口的权限需要微信认证后才可以获取。

所以,为了帮助开发者快速了解和上手微信公众号开发,熟悉各个接口的调用,我们推出了微信公众帐号测试号,通过手机微信扫描二维码即可获得测试号。

如果服务器没有配置好微信服务器的认证接口会配置失败

我们也可以用 ngrok 将本机的端口,进行内容穿透,变成网络路径

官网: https://www.ngrok.cc/

1558286985@qq.com

zzzzzz

注册之后开通隧道

打开客户端,配置要打开的隧道

将我们的花生壳域名拿去验证

http://dragon.free.idcfengye.com

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是公众号的appsecretcode是填写第一步获取的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_inaccess_token接口调用凭证超时时间,单位(秒)refresh_token用户刷新access_tokenopenid用户唯一标识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_CNheadimgurl用户头像,最后一个数值代表正方形头像大小(有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 表示未关注

引导用户进入公众号

按下图获取关注链接方式,手机上获取不到了

https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzU3MjU5MDIyOQ==&scene=124&uin=&key=&devicetype=Windows+10+x64&version=63030073&lang=zh_CN&a8scene=7&fontgear=2

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国家,如中国为CNheadimgurl用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。privilege用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)unionid只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。详见:获取用户个人信息(UnionID机制)

6、通过access_token、openid获取用户信息

7、获取 access_token

获取地址: https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wxcab027276d79d267&secret=0d484cff8acb9c50eb7f8fb1e2bd73fe

调用方式: get

调用参数:

正确返回:

{

"access_token": "47_v7gEVDwACEqGN-vLPnJ0IXfvpN6_kfg3J4zuEuL-XlxLuOVliCMJEchGGfJOpew-zd2NyswA5M8XVz6d0k1LtFXy4yj-PSNNgNA_uvwz6LoWcvdBrT-iGQSZb3sj6dSnM3qpEU_5Cww3rfuGYIYbAGAFPF",

"expires_in": 7200

}

三、根据 Tiket 获取公众号的二维码引导用户关注公众号

利用生成带参数的二维码

微信官方文档链接

https://developers.weixin.qq.com/doc/offiaccount/Account_Management/Generating_a_Parametric_QR_Code.html

appID : wxcab027276d79d267

appsecret : 0d484cff8acb9c50eb7f8fb1e2bd73fe

1、获取 access_token

access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。

有效期目前为2个小时(7200秒),需定时刷新,重复获取将导致上次获取的access_token失效。

在刷新过程中,中控服务器可对外继续输出的老access_token,此时公众平台后台会保证在5分钟内,新老access_token都可用,这保证了第三方业务的平滑过渡;

获取地址: https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wxcab027276d79d267&secret=0d484cff8acb9c50eb7f8fb1e2bd73fe

调用方式: get

调用参数:

参数是否必须说明grant_type是获取access_token填写client_credentialappid是第三方用户唯一凭证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、扫描带参数二维码事件——来获取用户信息

事件的回调方法就是我们在 配置认证的方法

关注后回调链接 http://dragon.free.idcfengye.com/Wechat/WeChatAuth?signature=1e51029bcb45aaa65ac30795cafe74563ad3de2b×tamp=1627901301&nonce=404090000&openid=oje6X6JuCi1c14HkK2PkEpEpCPLM

oje6X6JuCi1c14HkK2PkEpEpCPLM

官方文档:https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_event_pushes.html

用户扫描带场景值二维码时,可能推送以下两种事件:

如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。

如果用户已经关注公众号,则微信会将带场景值扫描事件推送给开发者。

1、用户未关注时,进行关注后的事件推送

推送XML数据包示例:

123456789

参数说明:

参数描述ToUserName开发者微信号FromUserName发送方帐号(一个OpenID)CreateTime消息创建时间 (整型)MsgType消息类型,eventEvent事件类型,subscribeEventKey事件KEY值,qrscene_为前缀,后面为二维码的参数值Ticket二维码的ticket,可用来换取二维码图片

2. 用户已关注时的事件推送

推送XML数据包示例:

123456789

参数说明:

参数描述ToUserName开发者微信号FromUserName发送方帐号(一个OpenID)CreateTime消息创建时间 (整型)MsgType消息类型,eventEvent事件类型,SCANEventKey事件KEY值,是一个32位无符号整数,即创建二维码时的二维码scene_idTicket二维码的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_CNheadimgurl用户头像,最后一个数值代表正方形头像大小(有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"}}}