管理系统必备技(12):微信开发的 openid 和 unionid 介绍

管理系统必备技(12):微信开发的 openid 和 unionid 介绍前言 本文将对微信开发过程中遇到的 OpenId、UnionId 等问题进行介绍,并提供了一种思路来绑定小程序、公众号中它们的关系。 一、openId、unionId 详情介绍 ​ 在关于微信开发的过

这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

前言

本文将对微信开发过程中遇到的 OpenId、UnionId 等问题进行介绍,并提供了一种思路来绑定小程序、公众号中它们的关系。

一、openId、unionId 详情介绍

​ 在关于微信开发的过程中,很多公司既有公众号也有小程序,例如用户向公众号发送消息时,公众号收到的消息发送者是一个 OpenId,它的生成规则是根据用户微信号加密生成的,每个用户对于公众号来说都有一个唯一的 OpenID。同理小程序也是这样的。它们的生成都是微信号,但是可能因为加密的方式不对,所

以它们的值也是不一样的,那如何判断这二者是同一个用户呢?这就需要用到第三个平台–微信开放平台,它提供了 UnionId 机制。开发者可通过OpenID来获取

用户基本信息,而如果开发者拥有多个应用(移动应用、网站应用和公众帐号,公众帐号只有在被绑定到微信开放平台帐号下后,才会获取UnionID),可通过获

取用户基本信息中的UnionID来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号,用户的UnionID是唯一的。换句话

说,同一用户,对同一个微信开放平台帐号下的不同应用,UnionID是相同的

注意事项:

  • 必须得把公众号和小程序在微信开发平台中绑定才可以获取到unionId
  • 公众号在关注的时候可以获取openid 和 unionid,公众号在取关的时候获取不到 unionId;
  • 小程序在登录的时候可以获取openid和unionid
  • 一个公众号或小程序只能绑定一个开放平台

下面目的是要将这三个id维护到数据库中。

二、绑定流程

在事实中,我们有两种情况。

  • 用户先关注公众号,在使用小程序
  • 用户先使用小程序,再关注公众号

2.1 情形1

知道了 openid 和 unionId 的获取方式,即用户在关注的时候获取,在关注的时候仅仅获取到这两个值是无法知道具体对应数据库中的哪个用户的。所以,我新建了一张公众号临时表来存储这个数据。

然后在小程序登录的时候,获取到 小程序的openid 和unionid,再去临时表中查看是否有跟它 unionid 相等的记录,如果有则将其值赋值过来。

具体的流程如下

image-20211102153749629

在用户取关的时候则去删除临时表的数据,然后更新用户表的该用户的公众号字段为null 。

2.2 情形2

用户小程序登录,先将openid 和 unionid 获取到,如果之前没有,就将它们更新,然后去临时表中查看,如果有,就更新user 的公众号字段;如果没有,则结束。等待公众号关注的时候,它会检查到小程序中有值,然后直接update user 表即可。

三、如何获取 openid 和unionid

3.1 小程序获取

前端 调用小程序 API –wx.login()获取登录凭证

App({
  onLaunch: function() {
    wx.login({
      success: function(res) {
        if (res.code) {
          //发起网络请求
          // code: 就是登录凭证(code)
        }
      }
    });
  }
})

下面是微信提供的接口,后端可以这样改动

https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code
   public static Code2SessionVO code2Session(Code2SessionDTO code2SessionDTO) {
        try{
            String result = HttpRequest
                    .get(String.format(LoginEnum.CODE_2_SESSION.getUrl(), code2SessionDTO.getAppid(), code2SessionDTO.getSecret(), code2SessionDTO.getJs_code()))
                    // 超时
                    .timeout(5000)
                    .execute()
                    .body();
            ObjectMapper objectMapper = new ObjectMapper();
            return objectMapper.readValue(result, Code2SessionVO.class);
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

我们传入目标参数 appid、secret、js_code、grant_type。js_code 是前端获取的 code(大概五分钟有效),grant_type 不用改,返回给我们这几个值:

openid	        用户唯一标识
session_key		会话密钥
unionid	        用户在开放平台的唯一标识符。本字段在满足一定条件的情况下才返回。

3.2 公众号获取

公众号的获取是需要在公网下进行的,内网开发的应该就不行了。在公众号里面设置一个域名或路径。然后这个服务就能接收到公众号的消息和事件了。发过来的是XML 类型的加密数据,经过XML工具类解析后,可以把它们都发送到 Kafak 中,通过中间件来转发这些数据给内网消费。

接口调用请求说明 http请求方式: GET api.weixin.qq.com/cgi-bin/use…

参数说明

参数 是否必须 说明
access_token 调用接口凭证
openid 普通用户的标识,对当前公众号唯一
lang 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语

正常情况下,微信会返回下述JSON数据包给公众号:

参数 说明
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 二维码扫码场景描述(开发者自定义)

公众号的流程相对于内网开发的比较麻烦的,必须在公网环境下进行。取关的时候是不能获取到 unionid 的。

以上就是关于 openid 和 unionid 的获取流程和方式。

今天的文章管理系统必备技(12):微信开发的 openid 和 unionid 介绍分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/20585.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注