微信公眾平臺開發入門

wqy_1993發表於2020-11-04

開發簡介

公眾號的分類

我們平常在微信應用上會看到有很多的公眾號,但是各自並不一樣,公眾號也分很多種型別,不過最常見的就是服務號和訂閱號了。下面我們來看一下他們的區別:

  • 訂閱號
    為媒體和個人提供一種資訊傳播方式,主要偏於為使用者傳達資訊(類似報紙雜誌),主要的定位是閱讀,每天可以群發1條訊息;

  • 服務號
    為企業,政府或組織提供對使用者進行服務,主要偏於服務互動(類似銀行提供服務查詢),每個月只可群發4條訊息;

  • 企業微信(企業號)
    為企業,政府,事業單位,實現生產管理和協作運營的移動化,主要用於公司內部通訊使用,旨在為使用者提供移動辦公,需要先有成員的通訊資訊驗證才可以關注成功企業微信;

還有一個比較明顯的區別就是,訂閱號都是存放在一個名叫訂閱號的資料夾中,點開才能看到所有關注過的訂閱號,但是服務號卻和好友一樣直接顯示在聊天列表中。這個大家開啟微信客戶端便能看到。

對於開發者來講最明顯的區別就是訂閱號無法配置網頁授權回撥,使用此功能需要開通服務號

在這裡插入圖片描述

微信公眾平臺概述

微信公眾平臺是運營者通過公眾號為微信使用者提供資訊和服務的平臺,而公眾平臺開發介面則是提供服務的基礎為了識別使用者,每個使用者針對每個公眾號會產生一個安全的OpenID,如果需要在多公眾號、移動應用之間做使用者共通,則需前往微信開放平臺

微信公眾平臺和微信開放平臺的區別

  1. 功能不同:

微信開放平臺作為第三方移動程式提供介面,使使用者可將第三方程式的內容釋出給好友或分享至朋友圈,第三方內容藉助微信平臺獲得更廣泛的傳播。利用公眾賬號平臺進行自媒體活動,簡單來說就是進行一對多的媒體性行為活動。

  1. 面向使用者不同:

微信公眾平臺主要面向名人、政府、媒體、企業等機構推出的合作推廣業務。在這裡可以通過渠道將品牌推廣給線上平臺作用。微信開放平臺面向第三方移動程式,為第三方移動程式提供介面。

  1. 介面型別不同:

微信公眾平臺提供的是微信端的訊息推送、品牌傳播、分享、功能定位、群發推送、自動回覆、二維碼訂閱等介面型別。而微信開發平臺提供的是第三方移動程式的介面型別,即介面程式碼可以整合到第三方的APP,在第三方的APP中使用微信的分享給微信好友、朋友圈的功能。

開發需知

  • 在申請到認證公眾號之前,你可以先通過測試號申請系統,快速申請一個介面測試號,立即開始介面測試開發。

  • 在開發過程中,可以使用介面除錯工具來線上除錯某些介面。

  • 每個介面都有每日介面呼叫頻次限制,可以在公眾平臺官網-開發者中心處檢視具體頻次。

  • 在開發出現問題時,可以通過介面呼叫的返回碼,以及報警排查指引(在公眾平臺官網-開發者中心處可以設定介面報警),來發現和解決問題。

  • 公眾平臺以access_token為介面呼叫憑據,來呼叫介面,所有介面的呼叫需要先獲取access_token,access_token在2小時內有效,過期需要重新獲取,但1天內獲取次數有限,開發者需自行儲存,詳見獲取介面呼叫憑據(access_token)文件。

  • 公眾平臺介面呼叫僅支援80埠

開發模式

公眾號主要通過公眾號訊息會話公眾號內網頁來為使用者提供服務的,下面分別介紹這兩種情況:

1、公眾號訊息會話

公眾號是以微信使用者的一個聯絡人形式存在的,訊息會話是公眾號與使用者互動的基礎。目前公眾號內主要有這樣幾類訊息服務的型別,分別用於不同的場景。

  1. 群發訊息:公眾號可以以一定頻次(訂閱號為每天1次,服務號為每月4次),向使用者群發訊息,包括文字訊息、圖文訊息、圖片、視訊、語音等。

  2. 被動回覆訊息:在使用者給公眾號發訊息後,微信伺服器會將訊息發到開發者預先在開發者中心設定的伺服器地址(開發者需要進行訊息真實性驗證),公眾號可以在5秒內做出回覆,可以回覆一個訊息,也可以回覆命令告訴微信伺服器這條訊息暫不回覆。被動回覆訊息可以設定加密(在公眾平臺官網的開發者中心處設定,設定後,按照訊息加解密文件來進行處理。其他3種訊息的呼叫因為是API呼叫而不是對請求的返回,所以不需要加解密)。

  3. 客服訊息:在使用者給公眾號發訊息後的48小時內,公眾號可以給使用者傳送不限數量的訊息,主要用於客服場景。使用者的行為會觸發事件推送,某些事件推送是支援公眾號據此傳送客服訊息的,詳見微信推送訊息與事件說明文件。

  4. 模板訊息:在需要對使用者傳送服務通知(如刷卡提醒、服務預約成功通知等)時,公眾號可以用特定內容模板,主動向使用者傳送訊息。

2、公眾號內網頁

許多複雜的業務場景,需要通過網頁形式來提供服務,這時需要用到:

  1. 網頁授權獲取使用者基本資訊:通過該介面,可以獲取使用者的基本資訊(獲取使用者的OpenID是無需使用者同意的,獲取使用者的基本資訊則需使用者同意

  2. 微信JS-SDK:是開發者在網頁上通過JavaScript程式碼使用微信原生功能的工具包,開發者可以使用它在網頁上錄製和播放微信語音、監聽微信分享、上傳手機本地圖片、拍照等許多能力。

開始開發

接入微信公眾平臺開發,開發者需要按照如下步驟完成:

  1. 填寫伺服器配置

① 公眾平臺官網登入之後,找到基本配置選單欄
在這裡插入圖片描述
② 填寫配置url,填寫:http://服務地址/wx 。 http的埠號固定使用80,不可填寫其他。 Token:自主設定,這個token與公眾平臺wiki中常提的access_token不是一回事。這個token只用於驗證開發者伺服器。
在這裡插入圖片描述

  1. 驗證伺服器地址的有效性
  • 微信驗證伺服器地址邏輯流程圖

在這裡插入圖片描述

  • 封裝配置介面,響應微信請求
from django.http import HttpResponse

def handle(request):
    # 微信驗證
    if request.method == 'GET':
        if len(request.GET) == 0:
            return HttpResponse('Hello, world')
        # 請按照公眾平臺官網\基本配置中資訊填寫
        token = 'hello520'
        _str = ''.join(sorted([request.GET.get('timestamp', ''), request.GET.get('timestamp', ''), token]))
        if hashlib.sha1(_str.encode('utf-8')).hexdigest() == request.GET.get('signature'):
            return HttpResponse(request.GET.get('echostr'))
        else:
            return HttpResponse('Hello, world')
  • 公眾平臺網頁點選提交按鈕。若提示”token驗證失敗”, 請認真檢查程式碼或網路連結等。若token驗證成功,會自動返回基本配置的主頁面,點選啟動按鈕,即成功建立了連線
  1. 依據介面文件實現業務邏輯

公眾號訊息會話開發

配置完開發者伺服器之後,當普通微信使用者向公眾賬號發訊息時,微信伺服器將POST訊息的XML資料包到開發者填寫的URL上。訊息按型別分為文字訊息圖片訊息語音訊息視訊訊息。在微信使用者和公眾號產生互動的過程中,使用者的某些操作會使得微信伺服器通過事件推送的形式通知到開發者在開發者中心處設定的伺服器地址,從而開發者可以獲取到該資訊。其中,某些事件推送在發生後,是允許開發者回覆使用者的,某些則不允許,事件分別有: 關注/取消關注事件掃描帶引數二維碼事件上報地理位置事件自定義選單事件點選選單拉取訊息時的事件推送點選選單跳轉連結時的事件推送關注/取消關注事件

  • 簡單的處理會話訊息
from wechatpy import parse_message
from six.moves.urllib.parse import quote
from wechatpy.replies import TextReply, ImageReply
from django.http import HttpResponse

def handle(request):
    if request.method == 'POST':
        msg = parse_message(request.body)
        # 處理訊息,文字類訊息為text,圖片類訊息為image...
        if msg.type == 'text':
            # 獲取文字訊息為抽獎,推送抽獎超連結
            reply = None
            if msg.content == '抽獎':
                content = '<a href="https://open.weixin.qq.com/connect/oauth2/authorize?' \
                          'appid={}&redirect_uri={}&response_type=code&scope=snsapi_userinfo&' \
                          'state=STATE#wechat_redirect">點此處抽獎</a>'.format(WX_CONFIG['AppId'],
                                                                          quote(WX_CONFIG['uri'] + '/api/auth'))
                reply = TextReply(
                    content=content,
                    message=msg)
            # 獲取文字訊息為企業介紹,推送企業介紹圖片
            if msg.content == '企業介紹':
                reply = ImageReply(image='Ni3sYweVA3M3e43hrAoWGTPIkQw26TFQjaurGrpE', message=msg)
            if reply:
                r_xml = reply.render()
                return HttpResponse(r_xml)
            else:
                return HttpResponse('')
        if msg.event == 'subscribe':
            return HttpResponse('')

上面程式碼我們在介面邏輯中回覆了空串,為什麼呢,因為微信伺服器在五秒內收不到響應會斷掉連線,並且重新發起請求,總共重試三次。假如伺服器無法保證在五秒內處理並回復,可以直接回復空串,微信伺服器不會對此作任何處理,並且不會發起重試。

不處理微信伺服器的請求會出現什麼呢?請看下圖

在這裡插入圖片描述
公眾號內網頁授權

網頁授權是什麼呢,在日常生活中,我們掃碼或者點選某個連結之後微信會彈出如下資訊

在這裡插入圖片描述
這就是接下來要介紹的微信網頁授權

  • 公眾平臺配置網頁授權
    進入微信公眾平臺
    -

在這裡插入圖片描述
在這裡插入圖片描述

  • 碼程式碼
  1. 檔案介面
from django.http import HttpResponse
from django.urls import path
from rest_framework.decorators import api_view


@api_view(['GET'])
def wx_file(request):
    """ 微信授權檔案驗證介面 """
    return HttpResponse('R6M51GVKVhCgCJal')


urlpatterns = [
    # 此介面放置在域名根目錄下
    path('MP_verify_R6M51GVKVhCgCJal.txt', wx_file, name='微信授權檔案驗證介面'),
]

  1. 回撥介面
from rest_framework.decorators import api_view
from wechatpy.oauth import WeChatOAuth
from django.http import HttpResponse
from django.shortcuts import redirect

from core.settings import WX_CONFIG
from api.models import User


@api_view(['GET'])
def auth(request):
    """
    微信網頁授權 通過code換取網頁授權access_token,
    """
    # 微信認證服務例項化
    oauth_client = WeChatOAuth(
        app_id=WX_CONFIG['AppId'],
        secret=WX_CONFIG['AppSecret'],
        redirect_uri=WX_CONFIG['DOMAIN']
    )
    code = request.GET.get('code')
    if not code:
        return HttpResponse('')
    res = oauth_client.fetch_access_token(code=code)
    refresh_token = res.get('refresh_token')
    # 檢查access_token有效性,如果無效則返回4001,拿著refresh_token重新整理access_token
    if not oauth_client.check_access_token():
        # 重新整理 access_token
        oauth_client.refresh_access_token(refresh_token)
    # 利用access_token獲取使用者資訊
    user_info = oauth_client.get_user_info()
    # 使用openid作為使用者唯一識別標識
    user = User.objects.filter(openid=user_info.get('openid')).first()
    if not user:
        user = User.objects.create(
            openid=user_info.get('openid', ''),
            nickname=user_info.get('nickname', ''),
            headimgurl=user_info.get('headimgurl', '')
        )
    request.session['user_id'] = user.id
    # 重定向到網頁業務邏輯頁,根據伺服器儲存使用者資訊處理業務邏輯
    return redirect('/')
  1. 愉快地脫離微信開始網頁開發(抽獎、答題、抽完獎答題、答完題抽獎…)

開發中遇到的問題

  • 獲取到微信使用者暱稱存在特殊字元及表情儲存到資料庫報錯
    解決辦法:正則替換掉字元
import re

nickname = re.sub('[^\u4e00-\uafa5a-zA-Z0-9]', '', str(user_info.get('nickname', '')))

相關文章