欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

二維碼狀態(tài)

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

  • 待掃碼
  • 已掃碼待確認(rèn)
  • 已過(guò)期
  • 使用次數(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類(lèi)型的二維碼了,通過(guò)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),稍后提供接口查詢(xún)二維碼狀態(tài),讓pc端輪詢(xún)這個(gè)接口,就能實(shí)現(xiàn)掃碼之后會(huì)更改二維碼狀態(tài)為已掃碼。

因?yàn)榧軜?gòu)師讓筆者使用內(nèi)存的方式存儲(chǔ)這個(gè)數(shù)據(jù),并沒(méi)有采用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é)

二維碼掃碼并不難,只是在沒(méi)做過(guò)的時(shí)候需要捋清楚流程,重要的是維護(hù)二維碼的狀態(tài),以及怎么存儲(chǔ)他。掃碼本質(zhì)就是掃碼獲取二維碼需要攜帶的信息再去請(qǐng)求其他接口,掃碼只是為了方便操作,希望剛剛?cè)腴T(mén)的朋友不要像我一樣懼怕一些陌生的業(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的interface{}底層原理實(shí)現(xiàn)

    深入了解Go的interface{}底層原理實(shí)現(xiàn)

    本文主要介紹了Go的interface{}底層原理實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 關(guān)于go語(yǔ)言編碼需要放到src 文件夾下的問(wèn)題

    關(guān)于go語(yǔ)言編碼需要放到src 文件夾下的問(wèn)題

    這篇文章主要介紹了go語(yǔ)言編碼需要放到src 文件夾下的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Go?gRPC服務(wù)客戶(hù)端流式RPC教程

    Go?gRPC服務(wù)客戶(hù)端流式RPC教程

    這篇文章主要為大家介紹了Go?gRPC服務(wù)客戶(hù)端流式RPC教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go語(yǔ)言單元測(cè)試的實(shí)現(xiàn)及用例

    Go語(yǔ)言單元測(cè)試的實(shí)現(xiàn)及用例

    在日常開(kāi)發(fā)中,我們通常需要針對(duì)現(xiàn)有的功能進(jìn)行單元測(cè)試,以驗(yàn)證開(kāi)發(fā)的正確性,本文主要介紹了Go語(yǔ)言單元測(cè)試的實(shí)現(xiàn)及用例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • Go時(shí)間操作常用方法(推薦!)

    Go時(shí)間操作常用方法(推薦!)

    平時(shí)開(kāi)發(fā)過(guò)程中,時(shí)間相關(guān)的操作用的還是很多的,下面這篇文章主要給大家介紹了關(guān)于Go時(shí)間操作常用方法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • Windows系統(tǒng)中搭建Go語(yǔ)言開(kāi)發(fā)環(huán)境圖文詳解

    Windows系統(tǒng)中搭建Go語(yǔ)言開(kāi)發(fā)環(huán)境圖文詳解

    GoLand?是?JetBrains?公司推出的商業(yè)?Go?語(yǔ)言集成開(kāi)發(fā)環(huán)境(IDE),這篇文章主要介紹了Windows系統(tǒng)中搭建Go語(yǔ)言開(kāi)發(fā)環(huán)境詳解,需要的朋友可以參考下
    2022-10-10
  • GoLang切片相關(guān)問(wèn)題梳理講解

    GoLang切片相關(guān)問(wèn)題梳理講解

    這篇文章主要介紹了GoLang切片相關(guān)的七個(gè)問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-10-10
  • 一文詳解Go語(yǔ)言中對(duì)象池的正確打開(kāi)方式

    一文詳解Go語(yǔ)言中對(duì)象池的正確打開(kāi)方式

    對(duì)象池是一種設(shè)計(jì)模式,它維護(hù)一組已經(jīng)創(chuàng)建好的對(duì)象,當(dāng)需要使用對(duì)象時(shí),直接從對(duì)象池中獲取,使用完畢后再放回對(duì)象池,而不是頻繁地創(chuàng)建和銷(xiāo)毀對(duì)象,下面我們就來(lái)看看Go語(yǔ)言中對(duì)象池的具體使用吧
    2025-02-02
  • go語(yǔ)言reflect.Type?和?reflect.Value?應(yīng)用示例詳解

    go語(yǔ)言reflect.Type?和?reflect.Value?應(yīng)用示例詳解

    這篇文章主要為大家介紹了go語(yǔ)言reflect.Type?和?reflect.Value?應(yīng)用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 一文帶你了解Go語(yǔ)言中方法的調(diào)用

    一文帶你了解Go語(yǔ)言中方法的調(diào)用

    這篇文章主要和大家分享一下Go語(yǔ)言中的方法的調(diào)用,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的小伙伴可以參考一下
    2022-12-12

最新評(píng)論