閑扯
由於公司的業務,有幸接觸到了微信平台的開發,不得不感慨下,微信的業務規划實在是宏大的很呢。看來微信是想涉及生活的各個方面啊,再加上最近微信封殺各路豪傑(網易音樂、支付寶錢包)等,不難看出微信在產品規划上的野心。
貌似閑話說的太多了,接下來我就我自己對於微信卡券功能的開發經驗進行簡單的介紹,在微信開發的交流群中也看到很多新手開發者遇到的問題,希望本文能夠幫助剛接觸微信卡券的同學盡快的入門卡券功能開發,由於鄙人是NODEJS碼農,所以本文主要以NODEJS為開發語言,其他語言的開發者可以飄過~或者借鑒~~
又一段閑話...(年紀大了,話嘮了),先簡單的介紹下微信卡券功能,卡券,說白了就是各種各樣的優惠券,會員卡,以及各種票據等等等等,涉及的方面很廣,就目前接觸到的開發者來看,大多數都是對於各類優惠券的開發,其他的種類比較少了。
首先使用卡券功能,需要現在微信公眾號平台中開啟卡券功能。具體的開啟步驟就不詳述了,文檔里面介紹的很詳細(對了,附下官方文檔下載地址),下面開始聊一聊開發步驟。
准備
微信提供了對於卡券的操作和管理接口,實質上就是向各個接口發送請求,最簡單的,你都可以在html種建立個表單,然后填寫接口需要的數據,然后POST或者GET到微信的接口地址就可以了。但是,通常我們不會這樣做,因為我們的業務中可能有很多需求是微信接口無法滿足的,有些信息是需要我們自己管理的。
在開發中,我們借助到了一個NodeJS的module,當然,大家也可以直接使用nodejs的request發送請求,但是畢竟有好多需要注意的東西,module會幫我們考慮到,我在下文也會將需要注意的地方進行說明,以便其他語言開發能夠注意到。
Access Token
首先我們先通過npm安裝一個module。不想使用module的同學自行略過本步驟。
Module為 wechat-card, 可以到github上查看其相關文檔,遺憾的是,這個module目前僅支持大多數的優惠券和紅包,對於會員卡還有其他的門票類卡券並不支持。相信之后的版本應該會完善的,好在這些類型已經可以滿足基本使用了。
npm install wechat-card --save
ok, 完整完成后要進行一個全局的設置。
var wxCard = require("wechat-card"); wxCard.setConfig({ appId: "wxXXXXXXX", appSecret: "bulabulabulabula" });
這里有東西要進行說明:首先這里有兩個量說明下,appId和appSecret,這兩個量可以在微信MP平台的開發者中心中得到,他們兩個雖然只是路人,但是,他們兩個會創造出一個結晶,叫做access_token,這個可是一個非常重要的而且脾氣古怪的小朋友了。說他重要,因為他貫穿整個接口,不僅僅是卡券會用到,所以微信平台的接口都可能會使用到他;說他脾氣古怪,是因為他有個特別的屬性,7200秒(2小時)會過期,而且每天只能請求2000次。那么,這就要求我們要去管理access_token的生成,定時去刷新他。如果使用上述的NODEJS MODULE的話,只需要在setConfig中配置appId和appSecret,Module就會自動為我們管理Token了。
題外話,如果我們的產品中不僅僅用到了微信卡券功能,還使用到了其他的微信功能,而這些功能中也用到了access token,那么這時候就不可以將token交由某個功能區管理了,因為當一邊刷新access token以后,另一邊的就會失效,針對這種情況,我們應該有一個服務來為各個功能提供access token,那么這里不可以配置appId和appSecret了,Module提供了另外一個配置:
wxCard.setConfig({ accessTokenService: "http://xxxx.xxxx.xxx/xxx" });
這里通過配置一個公開的服務來獲取access token,需要注意的是,這里的2小時過期,以及請求次數都需要這個服務自行去管理了。
創建門店
我們在創建卡券之前,需要先創建門店。這里我們先解釋下,門店,其實就是實際商戶下的店面,舉個栗子,肯德基就是一個商戶,那么肯德基北京西站店就是一個門店,我們的卡券會有一個”適用門店“的選項需要對應各個門店。所以我們需要先創建各個門店以備適用。
查看官方文檔我們可以了解到一個創建門店的接口:
https://api.weixin.qq.com/card/location/batchadd?access_token=TOKEN
前面我們介紹了獲取access token的方法,這里我們可以看到token的用途,在請求每一個接口時都需要附帶token。我們可以直接向接口發送請求來完成操作。這里我們使用Module來進行創建門店:
// Demo數據,具體的字段含義,可以參加Wechat-Card的GITHUB或者官方文檔 var shops = [{ "business_name":"麥當勞", "branch_name":"赤崗店", "province":"廣東省", "city":"廣州市", "district":"海珠區", "address":"中國廣東省廣州市海珠區藝苑路 11 號", "telephone":"020-89772059", "category":"房產小區", "longitude":"115.32375", "latitude":"25.097486" }, { "business_name":"麥當勞", "branch_name":"珠江店", "province":"廣東省", "city":"廣州市", "district":"海珠區", "address":"中國廣東省廣州市海珠區藝苑路 12 號", "telephone":"020-89772059", "category":"房產小區", "longitude":"113.32375", "latitude":"23.097486" }]; wxCard.shop.batchAddShops(shops, function(err, ids) { // 這里添加成功了,ids為添加的門店的ID });
這里需要說明的是:添加成功后,回到函數返回值ids為之前添加數據對應的id,如果其中有數據添加失敗了,那么對應的ID為-1.
查詢門店列表
和創建門店相同,我們可以獲取到已經添加的門店列表。接口為:
https://api.weixin.qq.com/card/location/batchget?access_token=TOKEN
Module中的查詢方法為:
// 微信提供的查詢方法為一種分頁式的查詢方法 // offset為起始記錄的位置,count為返回數據的數量 var offset = 0, count = 10; wxCard.shop.batchGetShops(offset, count, function(err, shops) { // 查詢成功,shops為返回的信息 });
這里需要說明的是:微信限制了最大返回的數量為50,即count最大值為50,接口返回的字段可以參考Module文檔或者官方文檔。
小結
時間不早了,明天還得上班~~這一篇先寫到這,其他的接口大家可以參照本文中介紹的方法進行嘗試,方法都是大同小異的,也可以參考Module文檔,作為一個入門的經驗,希望可以幫助到大家。如果其中有什么錯誤或者不好的地方, 希望大家能夠指明,萬分感謝,明晚咱們繼續~~