GO语言实现二维码扫码的示例代码

 更新时间:2023年06月14日 10:26:11   作者:虾滑虾滑  
你对二维码扫码的流程有困惑吗,这篇文章就结合笔者自身的开发经验进行分享,让大家熟悉并掌握此功能,感兴趣的小伙伴快跟随小编一起学习一下吧

笔者在学校开发的时候就对很多流程并不太熟悉,你对二维码扫码的流程有困惑吗?本篇文章就结合笔者自身的开发经验进行分享,让你熟悉并掌握此功能~

场景: 笔者的功能是分享二维码给他人扫码加入到组织中

分享二维码加入组织流程图

二维码状态

根据业务二维码状态大致分为4种

  • 待扫码
  • 已扫码待确认
  • 已过期
  • 使用次数限制

注:状态可以自定义,笔者的功能点在邀请他人加入组织,所以有次数限制

创建二维码

小程序二维码官方文档

笔者是小程序二维码跳转普通的二维码是不支持的要采用官方获取不限制二维码的包,因为使用官方的接口我们都需要去维护他的access_token,这里笔者采用go官网提供的包。

微信小程序服务端

第一步: 安装包

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 {
        // 这是我们内部的返回异常,请替换成自己项目的进行返回
        web.NewErrorResponse(c, QrcodeException.SetMsg(err.Error()).Return(http.StatusBadRequest)
        return
    }
    // 检验生成是否有错误
    if cmdErr.ErrCode != 0 {
        response := web.NewErrorResponse(c, QrcodeException.SetMsg(cmdErr.ErrMSG), "")
        response.Return(http.StatusBadRequest)
        return
    }
    // 我们读取数据要关闭,否则会导致链接池错误
    defer httpResponse.Body.Close()
    // qrCode就是[]byte类型的二维码了,通过json返回就可以在页面上展示了
    qrCode, err := io.ReadAll(code.Body)
    if err != nil {
        web.NewErrorResponse(c, QrcodeException.SetMsg(err.Error()).Return(http.StatusBadRequest)
        return
    }
    // 代码未结束...查看下面文章并且拼接到此位置
}

内存配置

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)

二维码状态

生成了二维码就应该保存二维码状态,稍后提供接口查询二维码状态,让pc端轮询这个接口,就能实现扫码之后会更改二维码状态为已扫码。

因为架构师让笔者使用内存的方式存储这个数据,并没有采用redis的方式存储,所以下面的例子是采用内存的方式进行存储

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)

获取二维码状态

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)
}

总结

二维码扫码并不难,只是在没做过的时候需要捋清楚流程,重要的是维护二维码的状态,以及怎么存储他。扫码本质就是扫码获取二维码需要携带的信息再去请求其他接口,扫码只是为了方便操作,希望刚刚入门的朋友不要像我一样惧怕一些陌生的业务,实际上他真的很简单只是需要我们多思考。

到此这篇关于GO语言实现二维码扫码的示例代码的文章就介绍到这了,更多相关GO二维码扫码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • go通过编码缩短字符串的长度实现方法步骤

    go通过编码缩短字符串的长度实现方法步骤

    这篇文章主要为大家介绍了go通过编码缩短字符串的长度实现方法步骤,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • golang中sync.Mutex的实现方法

    golang中sync.Mutex的实现方法

    本文主要介绍了golang中sync.Mutex的实现方法,mutex 主要有两个 method: Lock() 和 Unlock(),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • golang生成指定位数的随机数的方法

    golang生成指定位数的随机数的方法

    这篇文章主要介绍了golang生成指定位数的随机数的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • golang小游戏开发实战之飞翔的小鸟

    golang小游戏开发实战之飞翔的小鸟

    这篇文章主要给大家介绍了关于golang小游戏开发实战之飞翔的小鸟的相关资料,,本文可以带你你从零开始,一步一步的开发出这款小游戏,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • 一文带你了解Go语言中的I/O接口设计

    一文带你了解Go语言中的I/O接口设计

    I/O 操作在编程中扮演着至关重要的角色,它涉及程序与外部世界之间的数据交换,下面我们就来简单了解一下Go语言中的 I/O 接口设计吧
    2023-06-06
  • 使用Go语言编写简洁代码的最佳实践

    使用Go语言编写简洁代码的最佳实践

    简洁的代码对于创建可维护、可阅读和高效的软件至关重要,Go 是一种强调简单和代码整洁的语言,在本文中,我们将结合代码示例,探讨编写简洁 Go 代码的最佳实践,需要的朋友可以参考下
    2023-09-09
  • Go语言实现机器大小端判断代码分享

    Go语言实现机器大小端判断代码分享

    这篇文章主要介绍了Go语言实现机器大小端判断代码分享,本文直接给出实现代码,需要的朋友可以参考下
    2014-10-10
  • Go WaitGroup及Cond底层实现原理

    Go WaitGroup及Cond底层实现原理

    这篇文章主要为大家介绍了Go WaitGroup及Cond底层实现原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 详解golang函数多返回值错误处理与error类型

    详解golang函数多返回值错误处理与error类型

    这篇文章主要为大家详细介绍了golang中函数多返回值错误处理与error类型的相关知识,文中的示例代码简洁易懂,感兴趣的小伙伴快跟随小编一起学习吧
    2023-10-10
  • 基于Golang编写贪吃蛇游戏

    基于Golang编写贪吃蛇游戏

    这篇文章主要为大家学习介绍了Golang如何基于终端库termbox-go做个功能较简单的贪吃蛇游戏,文中的示例代码讲解详细,具有一定的学习价值
    2023-07-07

最新评论