GO語(yǔ)言實(shí)現(xiàn)二維碼掃碼的示例代碼
筆者在學(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)提供的包。
第一步: 安裝包
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(¶ms); 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),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06關(guān)于go語(yǔ)言編碼需要放到src 文件夾下的問(wèn)題
這篇文章主要介紹了go語(yǔ)言編碼需要放到src 文件夾下的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10Go語(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-01Windows系統(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一文詳解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-02go語(yǔ)言reflect.Type?和?reflect.Value?應(yīng)用示例詳解
這篇文章主要為大家介紹了go語(yǔ)言reflect.Type?和?reflect.Value?應(yīng)用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09