实现效果:

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

写在最后:

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