引导微信用户关注公众号(详细步骤加代码)

2023-11-02

实现效果:

当用户进入公众号h5页面,弹窗提示,是否要关注公众号,点击关注,跳转到微信关注页面

流程

1.用户在微信公众号端进入h5页面时,前端从后端数据库获取到用户关注状态.
2.如果用户未关注,弹窗提示,是否关注公众号,不关注则取消弹窗,关注的话跳转到微信关注页面
3.一天内未关注用户只会接收到一次弹窗提示
4.更新用户的关注状态入库

一,用户在微信公众号端进入h5页面时,前端从后端数据库获取到用户关注状态.

微信用户是否关注公众号,需要咱们去问微信服务器要数据
微信官方文档
获取用户基本信息(包括UnionID机制和用户是否关注)
开发者可通过OpenID来获取用户基本信息。请使用https协议。

接口调用请求说明 http请求方式: GET https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

参数说明:
在这里插入图片描述
返回说明

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

{
    "subscribe": 1, 
    "openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M", 
    "nickname": "Band", 
    "sex": 1, 
    "language": "zh_CN", 
    "city": "广州", 
    "province": "广东", 
    "country": "中国", 
    "headimgurl":"http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
    "subscribe_time": 1382694957,
    "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
    "remark": "",
    "groupid": 0,
    "tagid_list":[128,2],
    "subscribe_scene": "ADD_SCENE_QR_CODE",
    "qr_scene": 98765,
    "qr_scene_str": ""
}

在这里插入图片描述

二,如果用户未关注,弹窗提示,是否关注公众号,不关注则取消弹窗,关注的话跳转到微信关注页面

关于前端的弹窗之类的就不在此啰嗦了,直接说咋得到微信关注页面
如图:
在这里插入图片描述
点击关注公众号,用户就会关注此公众号
获取此页面方法:
前置条件:在pc端上登陆自己的微信
1,在手机微信上搜索到公众号,但是先不关注,点击右上角的三个点,发送到文件传输助手:
在这里插入图片描述

2.在pc端微信上点击文件传输助手
在这里插入图片描述
3,得到如图:
在这里插入图片描述
这样的话,就获取到了关注页面.

三,一天内未关注用户只会接收到一次弹窗提示

这个功能前端来做就可以了,咱们后端及时返回用户的关注状态和弹窗次数

规定时间内,比如一天,只可以给未关注公众号的用户一次弹窗提示
后端需要控制这个次数,我采用的是redis,当未关注用户进入播放页面时,前端向后端发送一个get请求,后端拿到请求,查看redis数据库,有此用户的值没,有,说明已经提示过用户,返回True,没有,将用户id做key,存入redis,返回False,加上过期时间即可

class Isreminder(View):
    '''
    24小时内是否已经提示过用户关注公众号
    提示过返回True
    没提示过返回False
    @return 
    '''

    def get(self, request):
        messages = {}
        user = request.user
        # 存储在redsi的值
        u = 'is_reminder' + str(user.id)
        user_agent = request.META.get('HTTP_USER_AGENT', "")
        if 'micromessenger' in user_agent.lower():
            # 从redis取出当前用户is_reminder_userid
            reminder = redis.get(u)
            if reminder:
                # 已经提示过用户
                messages['code'] = 200
                messages['message'] = True
                return JsonResponse(messages)
            else:
                # 没有提示过用户,将用户存入
                redis.set(u, 'True', ex=86400)
                messages['code'] = 200
                messages['message'] = False
                return JsonResponse(messages)

        else:
            return JsonResponse({'result': '并非微信请求'}, status=status.HTTP_200_OK)

四,更新用户的关注状态入库

在什么时候获取用户的关注状态呢?那就要根据你自己项目的需要自己决定了.
我的项目是一个直播兼顾录播回看的项目,我把这个接口放在用户每次进入播放器页面时,获取并更新用户的关注状态,存储到用户表中,然后随着token(cookie)返回到前端.

class Subscribe_status(View):
    '''
    请求微信服务器,查看用户是否关注公众号,更新用户关注字段
    '''
    def get(self,request):
        user = request.user
        user_agent = request.META.get('HTTP_USER_AGENT', "")
        if 'micromessenger' in user_agent.lower():
            # 请求微信服务器,查看用户是否关注公众号,更新用户关注字段,PreWechatOpenAPIClient只是我用来封装一些会在请求过程中用到的额外数据,比如通用的access_token
            client = PreWechatOpenAPIClient(WECHAT_APP_ID)
            access_token = client.get_access_token()
            # 尝试获取用户openid,如果没有,说明用户没有账号或者没有登录过公众号
            # 查询出用户三方表的openid
            oauth_user = Oauth.objects.get(user_id=user.id)
            # 发起请求,获取subscribe,WeChatOauth是我封装的一个用于请求微信服务器的类
            subscribe = WeChatOauth.get_user_subscribe_info(access_token, oauth_user.openid)
            #shixf 判断关注与否,更新用户关注字段
            user_info = user.owner
            if subscribe:
                user_info.subscribe = 1
            else:
                user_info.subscribe = 0
            user_info.save()
            return JsonResponse({'result': 'success'}, status=status.HTTP_200_OK)
        else:
            return JsonResponse({'result':'并非微信请求'}, status=status.HTTP_200_OK)

class WeChatOauth(object):
    # 获取微信用户基本信息,包含是否关注公众号subscribe字段,如果为0,则不会返回用户信息
    @classmethod
    def get_user_subscribe_info(cls,access_token, openid):
        url = 'https://api.weixin.qq.com/cgi-bin/user/info'
        data = {
            "access_token": access_token,
            "openid": openid,
            "lang": 'en'
        }
        response = requests.get(url, params=data)
        response.encoding = 'utf-8'
        data = response.json()
        subscribe = data.get('subscribe', 0)

        logger.info('wechat data:' + str(data))

        return subscribe

写在最后:

最后其实没有采用我上面获取的微信关注页面,原因是苹果手机在关注过一次过后,取消关注再次关注时跳转的这个页面,关注按钮不见了.安卓是没有任何问题的.最后的解决方案是前端写了一个静态页面,放上公众号的二维码,提示用户长按关注
强制引导用户关注公众号是微信所不允许的,目前只能这样,后续再看有没有啥好办法吧.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

引导微信用户关注公众号(详细步骤加代码) 的相关文章

随机推荐

  • 新手必看!最简单的MySQL数据库详解

    本篇文章主要跟大家介绍的是详解MySQL数据库 对于新手来说帮助很大的 而且MySQL是最流行的关系型数据库管理系统 在web应用方面 MySQL也是最好的RDBMS应用软件之一 因此 感兴趣的朋友记得要看完 是什么数据库 数据库 Date
  • 微信商户平台结算周期T+1是什么意思

    我们在商户平台的管理后台 有的时候 用户支付了 可是却没有看到有资金信息 这个一般是因为您的账户类似的T 1的原因 那结算周期T 1是什么意思呢 通俗的理解就是 交易日的次日 T就是today 今天的意思 的第一个字母的大写 T 1 T 2
  • C语言中的static的用法(超级详细)

    作者 云小逸 个人主页 云小逸的主页 码云 云小逸 YunXiaoYi003 motto 要敢于一个人默默的面对自己 强大自己才是核心 不要等到什么都没有了 才下定决心去做 种一颗树 最好的时间是十年前 其次就是现在 学会自己和解 与过去和
  • yii2 ajax增删改查,Yii2 中常用的增删改查操作总结

    一 新增 1 使用save model newUser model gt name test model gt phone 13000000000 model gt email 123456 qq com model gt save 2 使
  • c语言24点核心算法,24点游戏的核心算法时.doc

    24点游戏的核心算法时 24点游戏的核心算法 时间 2010 10 15 15 10 点击 873 次 24 点游戏 就是在给定的几个数字之间加入数学运算符号 使最终结果等于 24 如下图所示 算法的思路是 1 考虑没有括号的情况 运算符为
  • 「面试」拿到B站的意向书

    此次B站服务端开发面试之旅可谓惊险 不过通过对大部分面试题套路的掌握 不出意外还是拿下了 下面我们来看看这些骚题是不是常见的不能再常见的了 这些面试题看了就能面上 当然不是 只是通过这些题让自己知道所欠缺的是什么 以及可以去看看哪些资料 1
  • React 从零开始学习(二)—— JSX

    接上一篇 搭建的项目基本结构如下 上面可以看到 React 应用程序是由 组件 组成的 一个组件是 UI 用户界面 的一部分 有自己的逻辑和外观 组件可以小到一个按钮 也可以大到整个页面 JSX React 组件是返回标签的 JavaScr
  • MySQL 用户管理

    目录 用户管理 用户 用户信息 创建用户 删除用户 修改用户密码 数据库的权限 给用户 注意 如果发现赋权限后 没有生效 执行如下指令 回收权限 用户管理 如果我们只能使用 root 用户 这样存在安全隐患 这时 就需要使用 MySQL 的
  • 【正点原子STM32连载】 第三十章 PVD电压监控实验 摘自【正点原子】APM32F407最小系统板使用指南

    1 实验平台 正点原子stm32f103战舰开发板V4 2 平台购买地址 https detail tmall com item htm id 609294757420 3 全套实验源码 手册 视频下载地址 http www openedv
  • [951]numpy.concatenate()函数

    numpy concatenate 官方文档 numpy concatenate a1 a2 axis 0 out None 将具有相同结构的array序列结合成一个array axis是拼接方向 0为横轴 1为纵轴 axis 0 拼接方向
  • clickhouse集群安装

    环境介绍 准备四台服务器搭建clickhouse集群 创建两个分片 每个分片一个副本 在任意三台服务器上安装zookeeper 服务 clickhouse集群依赖zookeeper进行服务器之间的数据同步 192 168 1 1 ch1 t
  • 自学python?一般人我还是劝你算了吧

    自我介绍 本人其实属于一枚屌丝 在真正开始学python之前 其实也就是对电脑的认知只限于上个网 玩个office办公软件 废话不多说 我为啥说自学python 一般人我还是劝你算了吧 因为我就是那个不一般的人 基础真的很简单 是个人稍微认
  • Android RxJava:图文详解 变换操作符

    前言 Rxjava 由于其基于事件流的链式调用 逻辑简洁 使用简单的特点 深受各大 Android开发者的欢迎 Github截图 如果还不了解 RxJava 请看文章 Android 这是一篇 清晰 易懂的Rxjava 入门教程 RxJav
  • 黑莓手机时代落幕;阿里巴巴为 Linux 内核调度器提出新概念;清理 Linux 内核“依赖地狱”

    整理 宋彤彤 责编 屠敏 开源吞噬世界的趋势下 借助开源软件 基于开源协议 任何人都可以得到项目的源代码 加以学习 修改 甚至是重新分发 关注 开源日报 一文速览国内外今日的开源大事件吧 一分钟速览新闻点 开源大新闻 黑莓手机时代落幕 阿里
  • 解决异常报错java.sql.SQLException: Value ‘0000-00-00 00:00:00‘ can not be represented as java.sql.Timestam

    今天在执行某个分页查询时 查询MySQL的结果集时遇到如下报错 java sql SQLException Value 0000 00 00 00 00 00 can not be represented as java sql Times
  • SpringBoot 集成PageHelper 分页组件

    第一步 添加依赖
  • 一文读懂如何使用starUML绘制类关系图

    正文 前言 接下来我们画一张比较完整的类图 类间关系有 继承 组合 聚合 依赖 关联 参照的图是 开始画图 如图所示先点击左边Toolbox 中的class 然后在中间白色画布上点击一下 这样就出来了一个类 我们会看到这个类右边有一大堆黑色
  • 嵌入式_Keil (MDK - ARM) 的调试步骤

    目录 1 编译 调试 2 复位 全速运行 3 单步调试 4 逐步调试 5 跳出调试 6 运行到光标处 7 跳转到暂停行 8 调试窗口 首先为什么需要在 MDK 中进行程序的调试呢 在 MDK 中进行程序调试的主要目的是识别和解决程序中的问题
  • kylin随笔

    1 kylin中一个segment是hbase中的一张表 可以通过修改kylin配置来决定将hbase这张表分为几个regin 以此来提高查询的并发度 2 增量日期分区表的合并 每天一个cube构建一个segment 存入hbase一张表
  • 引导微信用户关注公众号(详细步骤加代码)

    实现效果 当用户进入公众号h5页面 弹窗提示 是否要关注公众号 点击关注 跳转到微信关注页面 流程 1 用户在微信公众号端进入h5页面时 前端从后端数据库获取到用户关注状态 2 如果用户未关注 弹窗提示 是否关注公众号 不关注则取消弹窗 关