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

    技术2023-11-23  116

    实现效果:

    当用户进入公众号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

    写在最后:

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

    Processed: 0.032, SQL: 9