GO語(yǔ)言實(shí)現(xiàn)二維碼掃碼的示例代碼
筆者在學(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)提供的包。
第一步: 安裝包
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(¶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é)
二維碼掃碼并不難,只是在沒做過的時(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的interface{}底層原理實(shí)現(xiàn)
本文主要介紹了Go的interface{}底層原理實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
關(guān)于go語(yǔ)言編碼需要放到src 文件夾下的問題
這篇文章主要介紹了go語(yǔ)言編碼需要放到src 文件夾下的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
Go語(yǔ)言單元測(cè)試的實(shí)現(xiàn)及用例
在日常開發(fā)中,我們通常需要針對(duì)現(xiàn)有的功能進(jìn)行單元測(cè)試,以驗(yàn)證開發(fā)的正確性,本文主要介紹了Go語(yǔ)言單元測(cè)試的實(shí)現(xiàn)及用例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
Windows系統(tǒng)中搭建Go語(yǔ)言開發(fā)環(huán)境圖文詳解
GoLand?是?JetBrains?公司推出的商業(yè)?Go?語(yǔ)言集成開發(fā)環(huán)境(IDE),這篇文章主要介紹了Windows系統(tǒng)中搭建Go語(yǔ)言開發(fā)環(huán)境詳解,需要的朋友可以參考下2022-10-10
go語(yǔ)言reflect.Type?和?reflect.Value?應(yīng)用示例詳解
這篇文章主要為大家介紹了go語(yǔ)言reflect.Type?和?reflect.Value?應(yīng)用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09

