最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

GO語(yǔ)言實(shí)現(xiàn)二維碼掃碼的示例代碼

 更新時(shí)間:2023年06月14日 10:26:11   作者:蝦滑蝦滑  
你對(duì)二維碼掃碼的流程有困惑嗎,這篇文章就結(jié)合筆者自身的開發(fā)經(jīng)驗(yàn)進(jìn)行分享,讓大家熟悉并掌握此功能,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧

筆者在學(xué)校開發(fā)的時(shí)候就對(duì)很多流程并不太熟悉,你對(duì)二維碼掃碼的流程有困惑嗎?本篇文章就結(jié)合筆者自身的開發(fā)經(jīng)驗(yàn)進(jìn)行分享,讓你熟悉并掌握此功能~

場(chǎng)景: 筆者的功能是分享二維碼給他人掃碼加入到組織中

分享二維碼加入組織流程圖

二維碼狀態(tài)

根據(jù)業(yè)務(wù)二維碼狀態(tài)大致分為4種

  • 待掃碼
  • 已掃碼待確認(rèn)
  • 已過期
  • 使用次數(shù)限制

注:狀態(tài)可以自定義,筆者的功能點(diǎn)在邀請(qǐng)他人加入組織,所以有次數(shù)限制

創(chuàng)建二維碼

小程序二維碼官方文檔

筆者是小程序二維碼跳轉(zhuǎn)普通的二維碼是不支持的要采用官方獲取不限制二維碼的包,因?yàn)槭褂霉俜降慕涌谖覀兌夹枰ゾS護(hù)他的access_token,這里筆者采用go官網(wǎng)提供的包。

微信小程序服務(wù)端

第一步: 安裝包

go get -u github.com/medivhzhan/weapp/v3

第二步: 引入包

import(
    "github.com/medivhzhan/weapp/v3"
    "github.com/medivhzhan/weapp/v3/wxacode"
)
func main() {
    var key = strings.ReplaceAll(uuid.NewString(), "-", "")
    newWxaCode := weapp.NewClient(appid, secret).NewWXACode()
    httpResponse, cmdErr, err := newWxaCode.GetUnlimited(&wxacode.UnlimitedQRCode{
        Scene:     key,
        Page:      "pages/organization/receive/QR",
        Width:     300,
        AutoColor: false,
        LineColor: wxacode.Color{
            R: "0",
            G: "0",
            B: "0",
        },
        IsHyaline:  false,
        EnvVersion: "",
        CheckPath:  false,
    })
    if err != nil {
        // 這是我們內(nèi)部的返回異常,請(qǐng)?zhí)鎿Q成自己項(xiàng)目的進(jìn)行返回
        web.NewErrorResponse(c, QrcodeException.SetMsg(err.Error()).Return(http.StatusBadRequest)
        return
    }
    // 檢驗(yàn)生成是否有錯(cuò)誤
    if cmdErr.ErrCode != 0 {
        response := web.NewErrorResponse(c, QrcodeException.SetMsg(cmdErr.ErrMSG), "")
        response.Return(http.StatusBadRequest)
        return
    }
    // 我們讀取數(shù)據(jù)要關(guān)閉,否則會(huì)導(dǎo)致鏈接池錯(cuò)誤
    defer httpResponse.Body.Close()
    // qrCode就是[]byte類型的二維碼了,通過json返回就可以在頁(yè)面上展示了
    qrCode, err := io.ReadAll(code.Body)
    if err != nil {
        web.NewErrorResponse(c, QrcodeException.SetMsg(err.Error()).Return(http.StatusBadRequest)
        return
    }
    // 代碼未結(jié)束...查看下面文章并且拼接到此位置
}

內(nèi)存配置

type QRCodeKey string
var (
    QRToken          QRCodeKey = "token"
    QRScene          QRCodeKey = "scene"
    QRExpire         QRCodeKey = "expire"
    QRTokenExpire    QRCodeKey = "token_expire"
    QRUser           QRCodeKey = "user"
    QRLimit          QRCodeKey = "limit"
    QROwner          QRCodeKey = "owner"
    QRIsNeedApproval QRCodeKey = "is_need_approval"
    QRCreate         QRCodeKey = "create"
)
var MemoryQRCodeLoginStorage = make(map[string]map[QRCodeKey]any)

二維碼狀態(tài)

生成了二維碼就應(yīng)該保存二維碼狀態(tài),稍后提供接口查詢二維碼狀態(tài),讓pc端輪詢這個(gè)接口,就能實(shí)現(xiàn)掃碼之后會(huì)更改二維碼狀態(tài)為已掃碼。

因?yàn)榧軜?gòu)師讓筆者使用內(nèi)存的方式存儲(chǔ)這個(gè)數(shù)據(jù),并沒有采用redis的方式存儲(chǔ),所以下面的例子是采用內(nèi)存的方式進(jìn)行存儲(chǔ)

currentTime := time.Now()
data := make(map[QRCodeKey]any)
data[QRExpire] = currentTime.Add(time.Minute * time.Duration(params.EffectiveTime))
data[QRLimit] = params.Count
data[QRUser] = gin.H{
    "id":   user.ID,
    "name": user.Nickname,
}
data[QROwner] = gin.H{
    "id":   owner.ID,
    "name": owner.Name,
}
data[QRCreate] = currentTime.Format(time.DateTime)
data[QRIsNeedApproval] = params.IsNeedApproval
cache := MemoryQRCodeLoginStorage
cache[key] = data
web.NewSingleResponse(c, gin.H{
        "createAt": currentTime.Format(time.DateTime),
        "qrCode":   qrCodeData,
}).Return(http.StatusOK)

獲取二維碼狀態(tài)

func (api ownerApi) QrCodeInformation(c *gin.Context) {
    var params OwnerInformationRequest
    if err := c.ShouldBindQuery(&params); err != nil {
        web.NewErrorResponse(c, ErrorParams, err.Error()).Return(http.StatusBadRequest)
        return
    }
    cache := MemoryQRCodeLoginStorage
    m := cache[params.Key]
    expire := m[v1.QRExpire]
    if t, ok := expire.(time.Time); ok {
        expire = t.Format(time.DateTime)
    }
    web.NewSingleResponse(c, gin.H{
        "expire":   expire,
        "limit":    m[v1.QRLimit],
        "owner":    m[v1.QROwner],
        "user":     m[v1.QRUser],
        "createAt": m[v1.QRCreate],
    }).Return(http.StatusOK)
}

總結(jié)

二維碼掃碼并不難,只是在沒做過的時(shí)候需要捋清楚流程,重要的是維護(hù)二維碼的狀態(tài),以及怎么存儲(chǔ)他。掃碼本質(zhì)就是掃碼獲取二維碼需要攜帶的信息再去請(qǐng)求其他接口,掃碼只是為了方便操作,希望剛剛?cè)腴T的朋友不要像我一樣懼怕一些陌生的業(yè)務(wù),實(shí)際上他真的很簡(jiǎn)單只是需要我們多思考。

到此這篇關(guān)于GO語(yǔ)言實(shí)現(xiàn)二維碼掃碼的示例代碼的文章就介紹到這了,更多相關(guān)GO二維碼掃碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go中各種newreader和newbuffer的使用總結(jié)

    Go中各種newreader和newbuffer的使用總結(jié)

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中各種newreader和newbuffer的使用的相關(guān)資料,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以了解下
    2023-11-11
  • 淺析go逆向符號(hào)恢復(fù)

    淺析go逆向符號(hào)恢復(fù)

    這篇文章主要介紹了go逆向符號(hào)恢復(fù)的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • Golang中的路由使用詳解

    Golang中的路由使用詳解

    這篇文章主要介紹了Golang中的路由使用詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • Go語(yǔ)言同步與異步執(zhí)行多個(gè)任務(wù)封裝詳解(Runner和RunnerAsync)

    Go語(yǔ)言同步與異步執(zhí)行多個(gè)任務(wù)封裝詳解(Runner和RunnerAsync)

    這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言同步與異步執(zhí)行多個(gè)任務(wù)封裝(Runner和RunnerAsync)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • golangci-lint安裝與Goland集成問題

    golangci-lint安裝與Goland集成問題

    這篇文章主要介紹了golangci-lint安裝與Goland集成,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • Go 實(shí)現(xiàn)HTTP中間人代理的操作

    Go 實(shí)現(xiàn)HTTP中間人代理的操作

    這篇文章主要介紹了Go 實(shí)現(xiàn)HTTP中間人代理的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go動(dòng)態(tài)調(diào)用函數(shù)的實(shí)例教程

    Go動(dòng)態(tài)調(diào)用函數(shù)的實(shí)例教程

    本文主要介紹了Go動(dòng)態(tài)調(diào)用函數(shù)的實(shí)例教程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Go隨機(jī)數(shù)與UUID生成原理與避坑指南

    Go隨機(jī)數(shù)與UUID生成原理與避坑指南

    本文介紹了Go中的隨機(jī)數(shù)生成和UUID生成的相關(guān)知識(shí),包括兩種隨機(jī)數(shù)生成庫(kù)的區(qū)別和使用場(chǎng)景,UUID的版本和優(yōu)缺點(diǎn),以及在實(shí)際工程中如何正確使用這兩種工具的建議,文章強(qiáng)調(diào)了在實(shí)際應(yīng)用中,開發(fā)者需要理解背后的原理和設(shè)計(jì)理念,并做出合適的選擇,需要的朋友可以參考下
    2026-05-05
  • golang 并發(fā)編程之生產(chǎn)者消費(fèi)者詳解

    golang 并發(fā)編程之生產(chǎn)者消費(fèi)者詳解

    這篇文章主要介紹了golang 并發(fā)編程之生產(chǎn)者消費(fèi)者詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • goland服務(wù)熱重啟的配置文件

    goland服務(wù)熱重啟的配置文件

    這篇文章主要介紹了goland服務(wù)熱重啟的配置文件,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12

最新評(píng)論

皮山县| 太白县| 宜君县| 延边| 海南省| 宁南县| 岢岚县| 嵩明县| 衡阳市| 龙泉市| 平顶山市| 阿拉善盟| 民权县| 泸水县| 澄江县| 东港市| 资中县| 班玛县| 巴青县| 武冈市| 韶山市| 临泉县| 临颍县| 惠安县| 交城县| 石狮市| 宁海县| 健康| 耿马| 朝阳市| 阳曲县| 乌拉特后旗| 荣成市| 富川| 金乡县| 讷河市| 民和| 武定县| 西丰县| 黔西县| 长子县|