實作效果:
當使用者進入公衆号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
寫在最後:
最後其實沒有采用我上面擷取的微信關注頁面,原因是蘋果手機在關注過一次過後,取消關注再次關注時跳轉的這個頁面,關注按鈕不見了.安卓是沒有任何問題的.最後的解決方案是前端寫了一個靜态頁面,放上公衆号的二維碼,提示使用者長按關注
強制引導使用者關注公衆号是微信所不允許的,目前隻能這樣,後續再看有沒有啥好辦法吧.