天天看點

PB開發微信公衆号

    如果你有這樣的需求,需要為使用者或者自己開發一個微信公衆号,當有使用者關注該公衆号,或者發消息時,我們的系統可以自動處理,并進行回複,還需要把其中一些資訊推送到我們的pb用戶端。

   這個功能如何用pb實作?

配置微信公衆号

進入微信公衆平台測試,可以進行相關公衆平台的測試開發。隻需要 設定兩個地方就可以,比較簡單,不多說。不過有個坑比較大,坑了我好久,用紅字标記。

PB開發微信公衆号

注意:1. 必須填寫域名  2.url不能太短

PB開發和運作

當使用者關注或者發消息時,微信平台會調用前面配置的url位址進行通知,是以需要用PB開發一個服務背景,這個不是pb的強項,不過借助satrda元件可以很容易這個功能。satrda提供了服務端,類似tomcat等應用伺服器,可以支援PB開發的pbl,pbd,dll部署到伺服器上運作。satrda元件可以到QQ群:345559891下載下傳

下載下傳完成解壓後,

1.打開server\plugins\config.cfg插件配置檔案進行配置(建議使用用notepad++打開),打開後翻到最後名稱為wx的項,效果如下:

PB開發微信公衆号

其中Dir代表pb程式所在的目錄,wxdemo代表目錄在插件所在目錄的wxdemo下面。

URL是目前插件需要響應的網址,這裡和我們在微信平台配置的url一緻。細心的朋友看到這裡其實不一緻,是/wx/**,而微信平台是https://www.mywx.com/wx/push這樣的,這個url其實是/wx/**的一個子集,代表可以響應https://www.mywx.com/wx/push,同樣也可以響應https://www.mywx.com/wx/msg等等。

task代表插件背景的定時任務,"period":0表示在插件加載時執行一次,"period":30 每隔30秒執行一次。這個應用場景可以很多,大家自己想:)

DLL代表pb運作庫,示例是9.0,其它版本請填入實際的值,這個dll需要放在satserver.exe的相同目錄或者系統目錄下面能夠找到,當然如果沒有安裝pb環境,pb程式運作時依賴的其它dll還是需要一塊包括

其它參數請參考下載下傳demo裡的文檔,這裡不進行改動,關掉。

2.打開示例的pb工程,找到n_wx對象,修改appid,appsecret,token為微信平台中設定的值

PB開發微信公衆号

儲存後,将plugin.pbl拷到server\plugins\wxdemo目錄。

3.将server目錄拷備到伺服器,配置運作端口為80端口并運作(參考文檔,這裡要保證伺服器的80端口不能被其它程式占用,微信公衆平台http隻能用80端口)

4.打開微信關注測試訂閱号,到這裡不出錯就可以看到效果了。

5.運作pb示例看推送示例,點選推送示範進入推送視窗,server填上伺服器域名或者ip,主題填上wxmsg,當公衆号收到消息時就會發送到用戶端,效果如圖:

PB開發微信公衆号

主要代碼說明

打開示例的pb工程,找到satrda_service 如下:

PB開發微信公衆号

代碼判斷了當task2任務,即啟動時,先去取微信accesstoken,如果不取accesstoken,回複會發生錯誤。

of_getaccesstoken()代碼如下:

//得到通路token
String ls_url,ls_null,ls_json
long ll_rtn,ll_http,ll_buffer,ll_data
string ls_token,ls_expire
long ll_time

//從緩存取出accesstoken,如果存在并且沒有過期,則直接傳回
ls_token = n_api.of_memcacheget("wx","access_token")
n_api.of_writeLog(n_api.log_debug,"get memcache token:" + ls_token)
if ls_token <> "" then
	ls_expire = n_api.of_memcacheget("wx","expires_in")
	n_api.of_writeLog(n_api.log_debug,"get memcache expire:" + ls_expire)
	ll_time = n_api.satrda_unixtime( )
	if long(ls_expire) >= ll_time then
		return ls_token
	end if
end if


ls_url = weixinHost + "/token?grant_type=client_credential&appid=" + appid + "&secret=" + appsecret

ll_http = n_api.SATHTTP_Create()
ll_rtn = n_api.SATHTTP_Get(ll_http, ls_url)

if ll_rtn <> 200 then
	n_api.of_writeLog(n_api.log_debug,"Https Get token error:" + string(ll_rtn))
	return ""
end if

ll_buffer = n_api.SATHTTP_GetBuffer(ll_http)
	
//String以0結尾,插入1個0
n_api.Buffer_Append(ll_buffer,n_api.StringToPtr(ls_null),1)
ll_data = n_api.Buffer_Data(ll_buffer)
ls_json = n_api.of_utf8tostring( ll_data)

n_api.of_writeLog(n_api.log_debug,ls_json)

n_api.SATHTTP_Destroy(ll_http)

//正常得到token,寫入緩存
ls_token = of_getmidstr( ls_json, '"access_token":"','","')
ls_expire = of_getmidstr( ls_json, '"expires_in":','}')

ll_time = n_api.satrda_unixtime( ) + long(ls_expire)
if ls_token <> "" then
	n_api.of_writeLog(n_api.log_debug,"write to memcache access_token:" + ls_token)
	n_api.memcacheset( "wx","access_token", ls_token)
	n_api.memcacheset( "wx","expires_in", string(ll_time))
end if

return ls_token
           

注意:token需要通過api儲存在memcache中,不能是全局變量。因為每次調用可能是相同的也可能是不同的pb應用,全局變量不能通用。

主要處理在n_wx的of_service中,可以打開看主要代碼

PB開發微信公衆号

微信公衆号還包括很多功能,示例示範了主要功能,其它功能可以根據微信的官方文檔自己進行添加。突然發現可以使用的場景有好多,發揮大家智慧的時候到了:)

公衆号示範

手機掃描二維碼,關注訂閱号,可以看到上面開發的效果

PB開發微信公衆号

繼續閱讀