微信公眾號(hào)的兩種開(kāi)發(fā)模式
你可能會(huì)有一個(gè)疑惑?我為什么要用小號(hào)做測(cè)試呢?其實(shí)微信公眾號(hào)開(kāi)發(fā)分兩種模式:
編輯模式:主要針對(duì)非編程人員及信息發(fā)布類公眾帳號(hào)使用。開(kāi)啟該模式后,可以方便地通過(guò)界面配置“自定義菜單”和“自動(dòng)回復(fù)的消息”。
開(kāi)發(fā)模式:主要針對(duì)具備開(kāi)發(fā)能力的人使用。開(kāi)啟該模式后,能夠使用微信公眾平臺(tái)開(kāi)放的接口,通過(guò)編程方式實(shí)現(xiàn)自定義菜單的創(chuàng)建、用戶消息的接收/處理/響應(yīng)。這種模式更加靈活,建議有開(kāi)發(fā)能力的公司或個(gè)人都采用該模式。
簡(jiǎn)單來(lái)說(shuō),就是不用寫(xiě)代碼直接在微信公眾號(hào)網(wǎng)頁(yè)上配置自定義菜單或者自動(dòng)回復(fù),這叫編輯模式;需要寫(xiě)代碼實(shí)現(xiàn)自動(dòng)回復(fù)或者更高級(jí)的邏輯,這叫開(kāi)發(fā)模式;并且這兩種模式是互斥的,就是說(shuō),一旦開(kāi)啟了開(kāi)發(fā)模式,編輯模式就失效了,之前配置的自定義菜單和自動(dòng)回復(fù)全部失效,這對(duì)我現(xiàn)在這個(gè)公眾號(hào)是不可接受的,因?yàn)樵诰庉嬆J嚼锱渲锰嗔?,遷移到開(kāi)發(fā)者模式一來(lái)多耗了時(shí)間成本,二來(lái)還不穩(wěn)定,所以我想起了我塵封已久的小號(hào)。
在正式開(kāi)發(fā)前,你需要有以下“紙”或者“筆”:
一臺(tái)服務(wù)器(最好 location 華中華南華北華東華西)
一個(gè)最好備案好的域名
服務(wù)器接入微信公眾號(hào)
然后呢,其實(shí)在微信公眾號(hào)開(kāi)發(fā)過(guò)程中,微信公眾號(hào)后臺(tái)就像是一臺(tái)代理服務(wù)器,微信公眾號(hào)消息先由微信公眾號(hào)后臺(tái)處理,再轉(zhuǎn)發(fā)給我們自己的服務(wù)器處理,這過(guò)程就必須要遵循微信公眾號(hào)的開(kāi)發(fā)規(guī)范了;那么,怎么讓微信公眾號(hào)和我們自己的服務(wù)器對(duì)接呢?接入微信公眾平臺(tái)開(kāi)發(fā),開(kāi)發(fā)者需要按照如下步驟完成:
填寫(xiě)服務(wù)器配置:填寫(xiě) URL(只支持 80(http) 和 443(https) 端口,開(kāi)發(fā)者文檔說(shuō)是服務(wù)器域名,準(zhǔn)確來(lái)說(shuō)不是你的服務(wù)器域名,而是你服務(wù)器上處理微信公眾號(hào)轉(zhuǎn)發(fā)消息的根路由)、Token(可隨便填) 和 EncodingAESKey(可自動(dòng)生成),這兩個(gè)參數(shù)只在接入時(shí)可能有用,是為了安全性起見(jiàn)而采用 sha1 加密的幾個(gè)參數(shù)之二,無(wú)需過(guò)多關(guān)心,這一步主要是注意 URL 的正確性。
驗(yàn)證服務(wù)器地址的有效性:點(diǎn)一下驗(yàn)證按鈕即可,網(wǎng)頁(yè)上會(huì)出現(xiàn) Token 驗(yàn)證成功或者失敗的提示。
依據(jù)接口文檔實(shí)現(xiàn)業(yè)務(wù)邏輯:這個(gè)就是我們大展身手寫(xiě)代碼的部分了。
應(yīng)用邏輯
有個(gè)坑需要填一下,個(gè)人微信公眾號(hào)不能夠獲取用戶的基本信息:昵稱和頭像等等
需要認(rèn)證才能獲得這個(gè)權(quán)限,但是認(rèn)證需要 take money,但是我滿臉都寫(xiě)著窮
回到我們的創(chuàng)作初衷,涉及個(gè)性化預(yù)測(cè)海報(bào),個(gè)性化部分我就簡(jiǎn)單處理,直接隨機(jī)字符串,如果深挖的話需要個(gè)性化推薦,但是沒(méi)有用戶信息,難道要寫(xiě)幾個(gè)邏輯讓用戶自己輸興趣愛(ài)好并返回?這已經(jīng)脫離本次創(chuàng)作的初衷了,下次補(bǔ)上。
至于制作海報(bào),我用的的 PIL 庫(kù)中的 ImageDraw 對(duì)象,直接在預(yù)設(shè)的海報(bào)上填充字符串即可。
PIL 庫(kù)的安裝姿勢(shì)是 pip install pillow 而不是 pip install PIL
然后應(yīng)用服務(wù)器采用的是 Flask 框架(Flask 是應(yīng)用框架,nginx 是 web 服務(wù)器,他們都屬于軟件,F(xiàn)lask 自帶的生產(chǎn)環(huán)境服務(wù)器不足以支持實(shí)際應(yīng)用,需要 uwsgi 應(yīng)用服務(wù)器,nginx 直接處理靜態(tài)資源請(qǐng)求,邏輯請(qǐng)求轉(zhuǎn)發(fā)給 uwsgi ;阿里云服務(wù)器是虛擬化的 PC,包括軟件和硬件;
回到主題,假設(shè)我們的根路由是
https://doamin/wechat/
我們可以給這個(gè)路由綁定一個(gè)視圖函數(shù),my_view(),并同時(shí)開(kāi)啟處理 post 請(qǐng)求開(kāi)關(guān)(默認(rèn)只處理 get),我們所有的邏輯都可以由這一個(gè)視圖函數(shù)實(shí)現(xiàn),接入公眾號(hào)開(kāi)發(fā)時(shí) Token 驗(yàn)證公眾號(hào)是通過(guò) get 方式請(qǐng)求到我們的服務(wù)器的,驗(yàn)證通過(guò)后的轉(zhuǎn)發(fā)消息都是通過(guò) post 方式,那么,我們就可以通過(guò)請(qǐng)求方式區(qū)分是驗(yàn)證還是轉(zhuǎn)發(fā)了。
f request.method == ‘GET’:
signature = request.args[‘signature’]
timestamp = request.args[‘timestamp’]
echostr = request.args[‘echostr’]
nonce = request.args[‘nonce’]
token = ‘好想愛(ài)這個(gè)世界’
tempList = [token, timestamp, nonce]
# 字典序排序
tempList.sort()
# 轉(zhuǎn)成字符串
tempStr = ”.join(tempList)
# sha1 加密
tempStr = hashlib.sha1(tempStr.encode(‘utf-8’)).hexdigest()
if tempStr == signature:
print(‘token verify succes’)
return echostr
else:
#可以發(fā)現(xiàn),前面的驗(yàn)證代碼其實(shí)無(wú)關(guān)緊要,只要返回了 echostr ,就算驗(yàn)證成功
return echostr
elif request.method == ‘POST’:
print(‘在這里寫(xiě)業(yè)務(wù)邏輯’)
我們還需要在自己的服務(wù)器上調(diào)用微信的接口,比如海報(bào)制作完成后,通過(guò)微信轉(zhuǎn)發(fā)給用戶,不能直接返回圖片的二進(jìn)制數(shù)據(jù),事實(shí)上這是微信公眾號(hào)做的,我們需要上傳該海報(bào)至微信公眾號(hào)素材庫(kù),獲得這個(gè)海報(bào)的 id,然后封裝成 xml 數(shù)據(jù)返回給微信公眾號(hào)(吐槽一下還沒(méi)有升級(jí)到 json 交換數(shù)據(jù)),這樣用戶就收到我們的海報(bào)了。
那么問(wèn)題來(lái)了,上傳該海報(bào)至微信公眾號(hào)素材庫(kù),在公眾號(hào)文章編輯界面呆久了,我還以為要手動(dòng)上傳,還好找到了接口 1,我們可以在服務(wù)器上調(diào)用這個(gè)接口 1,為了防止濫用這個(gè)接口 1, 必須提供 access_token , 但是 access_token 哪里來(lái)呢?需要通過(guò)調(diào)用另一個(gè)接口 2,接口 2 需要提供 AppId 和 AppSecret 參數(shù),如果不自己修改,這兩個(gè)是長(zhǎng)期有效的,可以直接獲取。
接口 1:POST https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
接口 2:GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
還有一個(gè)坑就是,這個(gè) access_token 有效期只有 2 個(gè)小時(shí),所以我們需要不斷更新它,所以需要給我們的 Flask 引入循環(huán)任務(wù)配置
# 定時(shí)任務(wù)配置class Config(object):? # 創(chuàng)建配置
# 任務(wù)列表
JOBS = [
{
‘id’: ‘1’,
‘func’: ‘__main__:refreshToken’,? # 定時(shí)執(zhí)行的方法名
‘trigger’: ‘interval’,? # interval表示循環(huán)任務(wù)
‘hours’: 2, # 每?jī)蓚€(gè)小時(shí)的執(zhí)行一次
}
]
app.config.from_object(Config())? # 為實(shí)例化的flask引入配置
本文原地址:http://www.dawoos.com/459.html
鄭重聲明內(nèi)容版權(quán)聲明:除非注明,否則皆為本站原創(chuàng)文章。如有侵權(quán)聯(lián)系進(jìn)行刪除!