1. 程式人生 > >使用golang快速開發微信公眾平臺(二):獲取accessToken

使用golang快速開發微信公眾平臺(二):獲取accessToken

微信的文件有個很有意思的地方,剛開始你順著文件看,就可以一步一步完成自己需要的功能,但走著走著,就感到有些混亂,你再順著文件做,就掉坑裡了。

我們在使用golang快速開發微信公眾平臺(一)微信驗證伺服器通過後,就要開始著手獲取accessToken,這個東西很重要,在選單、客服、支付等操作中都需要用到

在文件中,有以下2點很重要:

  1. access_token每日限額獲取2000次,相當於允許你以43秒的頻率來取,但明顯這樣做會顯得很傻。
  2. access_token有效時間是7200秒

這裡寫圖片描述
以get請求獲取一段json並解析來獲取access_token,看起來很簡單對不對?但應用到實際中就稍微有些麻煩了:

  1. 需要找個什麼東西來存,可以是檔案、可以是資料庫、甚至可以直接就扔到全域性變數裡。嗯,我選資料庫。
  2. 定時傳送這個get請求,更新資料庫。
  3. 這個get請求是可能失敗的 是可能失敗的 是可能失敗的,雖然這個概率極低,但對於如此重要的引數,一旦在2個小時的空檔期內都無法呼叫,會產生極其災難性的後果,別問我怎麼知道的

好,思路捋一下,3件事:拼接get請求json解析,建個表來存取更新,定時任務

開始搓程式碼

access_token的存取

WxAccTokenUtil.go

package WxPlatUtil

import (
    "strings"
    "net/http"
"fmt" "io/ioutil" "bytes" "encoding/json" "mlshop/shopUtils/logUtils" "mlshop/models" ) type AccessTokenResponse struct { AccessToken string `json:"access_token"` ExpiresIn float64 `json:"expires_in"` } //type AccessTokenErrorResponse struct { // Errcode float64 // Errmsg string
//} //獲取wx_AccessToken 拼接get請求 解析返回json結果 返回 AccessToken和err func FetchAccessToken(appID, appSecret, accessTokenFetchUrl string) (string, error) { requestLine := strings.Join([]string{accessTokenFetchUrl, "?grant_type=client_credential&appid=", appID, "&secret=", appSecret}, "") resp, err := http.Get(requestLine) if err != nil || resp.StatusCode != http.StatusOK { fmt.Println("傳送get請求獲取 atoken 錯誤", err) logUtils.GetLog().Error("傳送get請求獲取 atoken 錯誤", err) return "", err } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println("傳送get請求獲取 atoken 讀取返回body錯誤", err) logUtils.GetLog().Error("傳送get請求獲取 atoken 讀取返回body錯誤", err) return "", err } if bytes.Contains(body, []byte("access_token")) { atr := AccessTokenResponse{} err = json.Unmarshal(body, &atr) if err != nil { fmt.Println("傳送get請求獲取 atoken 返回資料json解析錯誤", err) logUtils.GetLog().Error("傳送get請求獲取 atoken 返回資料json解析錯誤", err) return "", err } return atr.AccessToken, atr.ExpiresIn, nil } else { fmt.Println("傳送get請求獲取 微信返回 err") ater := models.AccessTokenErrorResponse{} err = json.Unmarshal(body, &ater) fmt.Printf("傳送get請求獲取 微信返回 的錯誤資訊 %+v\n", ater) if err != nil { return "", err } return "", fmt.Errorf("%s", ater.Errmsg) } }
//type WxAccessToken struct {
//  Id          int `orm:"auto"`
//  AccessToken string
//}
//微信公眾平臺的引數
//type WxBase struct {
//  Id             int `orm:"auto"`
//  AppID          string
//  AppSecret      string
//  Token          string
//  EncodingAESKey string
//}
//資料庫存取更新access_token
func GetAndUpdateDBWxAToken(o orm.Ormer) error {

    at := models.WxAccessToken{Id: 1}
    o.ReadOrCreate(&at, "id")

    wxBase := models.WxBase{Id:1}
    err := orm.NewOrm().Read(&wxBase)
    if err != nil {
        fmt.Println("從資料庫查詢WxBase失敗", err)
        return err
    }

    //向微信伺服器傳送獲取accessToken的get請求
    accessToken, err := WxPlatUtil.FetchAccessToken(wxBase.AppID, wxBase.AppSecret, "https://api.weixin.qq.com/cgi-bin/token")
    if err != nil {
        fmt.Println("向微信伺服器傳送獲取accessToken的get請求失敗", err)
        logUtils.GetLog().Error("向微信伺服器傳送獲取accessToken的get請求失敗", err)
        return err
    }

    at.AccessToken = accessToken
    o.Update(&at, "access_token")

    return nil
}

得益於go語言方便的json與struct轉換和beego的orm,第一個任務很快就可以完成。
接下來,我們要考慮定時任務的問題。

定時任務

定時的話time包倒是有個ticker,出現在腦子裡的第一個思路是把時間段時間點都轉化為秒數,然後開始倒計時。。。好傻
可以搜到很多關於golang的time使用方法,比如下面這個

 func startTimer(f func()) {
        go func() {
            for {
                f()
                now := time.Now()
                // 計算下一個零點
                next := now.Add(time.Hour * 24)
                next = time.Date(next.Year(), next.Month(), next.Day(), 0, 0, 0, 0, next.Location())
                t := time.NewTimer(next.Sub(now))
                <-t.C
            }
        }()
    }

嗯 看起來還是很不錯的,群裡討論的時候,大家都喜歡在當前時間上+24小時獲取明天,然後取0點,然後加上自己想要的時間段

但是 GRD的需求是會變來變去的

今天要求是明天2點,後天要求是明天2點半,大後天又變成了9個小時來一次。結合咱們的定時任務,要是既能傳時間段,又能傳時間點就好了。
這裡寫圖片描述

github上go的time庫倒是有,可我一個都沒用到。嗯 因為懶。

這裡寫圖片描述

這就是為啥我推薦大家用pycharm、phpstrom、webstrom來寫go,看庫多方便,而且還自帶ssh ftp工具,是人都知道在Win Mac 上找不同的ftp工具是多麼的痛苦。表用IDEA…等你用了就知道為啥。

beego自帶的定時任務模組很強,而且使用簡單,雖然傳參很醜,不適合裝逼,醜到啥地步呢:

這裡寫圖片描述

如果是集團軍作戰,傳這樣的引數肯定是被罵的,但咱是單兵作戰,好用即可。到這裡,咱們的定時任務也可以出爐了:

//從task_test.go檔案裡找使用方法
func shopTimeTask(o orm.Ormer) {

    timeStr2 := "0 */60 * * * *" // 獲取wx token
    t2 := toolbox.NewTask("getAtoken", timeStr2, func() error {

         err := WxPlatUtil.GetAndUpdateDBWxAToken(o)
         if err != nil{
            //todo 向微信請求access_token失敗 結合業務邏輯處理
        }
         return nil
    })
    toolbox.AddTask("tk2", t2)
    toolbox.StartTask()

}

唉咋知道怎麼用的?test檔案啊;唉這命名真不規範,我還有資料庫備份也用程式碼寫的。。。
ok,就這麼幾句,23步咱們都幹完了,第三步其實大家自行處理就好。雖然說的很嚴重,但是隻要有處理就不會那麼慘。。。

相關推薦

使用golang快速發微公眾平臺():獲取accessToken

微信的文件有個很有意思的地方,剛開始你順著文件看,就可以一步一步完成自己需要的功能,但走著走著,就感到有些混亂,你再順著文件做,就掉坑裡了。 我們在使用golang快速開發微信公眾平臺(一)微信驗證伺服器通過後,就要開始著手獲取accessToken,這個

使用golang快速發微公眾平臺(八):獲取使用者維碼

今天終於解決了之前提到的支付url地址無效問題甚是高興,來把二維碼也寫寫。 二維碼文件寫的簡單明瞭,但是沒有寫咋個實際展示,我試了好久,連base64解碼都考慮了。。。最終發現,還是簡單粗暴的方法適合我。 業務場景如下:進入頁面,根據獲取到的使用者openI

使用golang快速發微公眾平臺(五):公眾號支付

微信又TMD改版了 2個月前我做的一個微信公眾號商城支付是正常的,但是同樣的設定,目前做的這個卻不正常了,老給我報invalid url domain,試遍了所有能找到的法子依然不行,臥槽他大爺,連寫部落格的慾望都沒了,此坑待填。 此坑已填 焚香沐浴,平

使用C# .net發微公眾號之獲取AccessToken

獲取access_token access_token是公眾號的全域性唯一介面呼叫憑據,公眾號呼叫各介面時都需使用access_token。開發者需要進行妥善儲存。access_token

使用Java語言發微公眾平臺(七)——音樂消息的回復

使用 protoc class exc message 方法 文件上傳 pre wiki 使用Java語言開發微信公眾平臺(七)——音樂消息的回復 在上一節課程中,我們學習了圖片消息的回復功能。根據微信公眾平臺的消息類型顯示,微信共支持文本、圖片、語音、視

使用JAVA發微公眾平臺(一)——環境搭建與開發接入

iges 微信平臺 校驗 後臺服務 結果 png 交互 package app 一、 初始微信公眾平臺 微信公眾平臺,即我們平時所說的“公眾號”,曾用名“官方平臺”、“媒體平臺”,但最終命名為&ldq

發微公眾平臺--新建新浪雲sae部署server

https clas 部署 info dea 上傳 ken 計算平臺 sina 創建新浪雲計算應用 申請賬號 我們使用SAE新浪雲計算平臺作為server資源。而且申請PHP環境+M

發微公眾平臺提交基本配置問題

如果檢查了你的     1>後代程式碼 正確 (需要返回從微信獲取的echostr) 2>ip能正常訪問  3>token沒寫錯(空格)   4>提交url時候不要寫埠號 (80埠可以不寫,預設80)   5>自己的tomcat埠是否改為80(8

教你3分鐘快速發微公眾號[訂閱號][服務號]

Wx-tools是基於微信公眾平臺API的輕量級框架。 基於Wx-tools你可以開速開發一個訂閱號/服務號的web應用後臺。 博主最近終於有空!!已經更新到2.0.0啦!! GitHub倉庫 下載wx-tools-2.0.0.jar

python發微公眾平臺之自定義選單實現

首先先獲取access_token,並儲存與全域性之中 def token(requset): url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid

發微公眾平臺--新建新浪雲sae部署伺服器

建立新浪雲端計算應用 申請賬號 我們使用SAE新浪雲端計算平臺作為伺服器資源,並且申請PHP環境+MySQL資料庫作為程式執行環境。 申請地址:百度搜sae,使用新浪微博賬號可以直接登入SAE,登入後SAE將贈送500個免費雲豆。認證開發者送2000豆 夠用很久的了  

PHP發微公眾平臺——天氣查詢實戰專案-陳世平-專題視訊課程

PHP開發微信公眾平臺——天氣查詢實戰專案—116人已學習 課程介紹        從基礎到專案的深入化講解,手把手帶你玩兒轉微信公眾平臺 開發基礎準備、 開發模式接入、訊息的接收與響應、 被關注回覆與關鍵詞回覆、圖文訊息的傳送與響應 、獲取access_token、上傳素

發微公眾平臺群發介面時,在對接“上傳圖文訊息素材”時,返回44003

坑爹的公眾平臺, 在呼叫 “` String url=”https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=” + tokenString; “`這個介面時明明我的內

Java發微小程式()獲取並解密小程式使用者和手機資訊

第二篇 獲取並解密小程式的加密資訊包括使用者和手機資訊。 如果對其他的資訊幹興趣,還可以點選以下的連線 1.小程式登入獲取,小程式的openId和unionId。 2.獲取並解密小程式的加密資訊包括使用者和手機資訊。 3.用小程式給使用者推送服務訊息。​​​​​​​ 4.給繫結小

使用C# .net發微公眾號之獲取模板列表

/// <summary> /// 獲取模板列表 /// </summary> /// <param name="accessToken">AccessToken</para

java發微公眾號()--測試號申請、微與java程式碼初步互動

一、申請測試號 個人不能夠免費申請服務號,訂閱號有很多限制,介面許可權出來基本的幾乎沒有,如圖, 在微信公眾平臺,檢視介面許可權 那麼怎麼使用服務號的介面許可權呢?微信推出了測試號,交給大家使用,開通的步驟是: 1.在微信平臺頁面,在服務號中,點選開發者文件 2

springboot框架發微公眾號()之訊息的接受與響應

在開發之前我們要先知道使用者傳送的資訊是先傳送到微信伺服器,微信伺服器在以xml的格式傳送給進行公眾號 開發流程圖 程式碼實現 控制層程式碼 /** * 微信核心控制器(驗證服務號是否合法,以及訊息轉發都需要通過此controller) */ package com.

Java發微公眾號()——開發請求校驗程式

開發IDE:MyEclipse或Eclipse或IDEA都可以,我現在用的是MyEclipse。 請求校驗流程分析 上一篇中我們講了微信開發環境的搭建,下面就來寫請求校驗程式的開發,目的是是為了驗證訊息的確來自微信伺服器。 開發者提交資訊後,微信伺服器將傳送GET

java發微公眾號授權

這篇文章我想記錄一下微信服務號二次開發怎麼進行授權登入獲取使用者資訊的。我用流程化的方式來闡述一下怎麼實現微信授權取使用者資訊。 第一:我們要取得微信授權,加入我們是從選單欄點選某一個連線選單進行實現的。所以此時我們選單的連線就必須是: 當然如果你選擇靜默授權,那sco

Java發微公眾號()--授權網頁獲取使用者資訊

參考:微信公眾號開發文件:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432 前提:需要申請認證的微信公眾號;獲取對應的APPID和APPSECRET;並且還需要獲取到使用者資訊