天天看點

引導微信使用者關注公衆号(詳細步驟加代碼)

實作效果:

當使用者進入公衆号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
           

寫在最後:

最後其實沒有采用我上面擷取的微信關注頁面,原因是蘋果手機在關注過一次過後,取消關注再次關注時跳轉的這個頁面,關注按鈕不見了.安卓是沒有任何問題的.最後的解決方案是前端寫了一個靜态頁面,放上公衆号的二維碼,提示使用者長按關注

強制引導使用者關注公衆号是微信所不允許的,目前隻能這樣,後續再看有沒有啥好辦法吧.