微信小程序canvas2d生成图形验证码(新)

微信小程序手势解锁完整实现:Canvas绘图、触摸交互与数据安全 手势解锁是一种常见的交互式身份验证方式,它通过识别用户绘制的特定图形图案来完成验证。其原理基于对用户触摸轨迹的坐标序列进行采集、抽象与比对。这项技术融合了前端图形绘制、实时交互响应与本地数据安全处理,在用户体验与基础安全之间取得了良好平衡。从技术价值看,它避免了传统文本密码的输入繁琐,提供了比简单图形验证码更高的安全性,适用于对安全要求适中且追求操作流畅性的场景。在微信小程序开发中,实现手势解锁涉及Canvas绘图、触摸事件处理、坐标计算、状态管理以及本地加密存储等一系列关键技术点。本文以微信小程序手势解锁 阅读详情

成品展示:

背景:

大致看了一下网上已经有一些canvas生成图形验证码的demo,发现使用的也只是旧版canvas,相比于新版canvas2d性能上略有差距,更重要的是旧版canvas在开发者工具上报警告,唉哟我这暴脾气,非得整成canvas2d的不成。成果记录在此。

wxml:

<input class="input font_14" placeholder-class="grey" type="text" 
    placeholder="输入图形验证码" maxlength="4" model:value="{{guiCode}}"
    bindinput="bindinput" />
<canvas class="guiCode" type="2d" id="guiCodeCanvas" bindtap="guiCodeTap" />

wxss:

.input {
    width: calc(165vmin / 3.75);
    height: 100%;
    padding: 0 calc(12vmin / 3.75);
    box-sizing: border-box;
}

.guiCode {
    width: calc(70vmin / 3.75);
    height: 100%;
}

js:

var guiCode = require('../../utils/guiCode.js');
const app = getApp()

Page({

    data: {
        guiCode: ''
    },

    onLoad: function (options) {
        this.guiCode = new guiCode({
            el: '#guiCodeCanvas',
            width: 70,
            height: 50,
            createCodeImg: ""
        })
    },

    bindinput() {},

    /**
     * 刷新图形验证码
     */
    guiCodeTap() {
        this.guiCode.refresh()
    },

    /**
     * 验证图形验证码
     */
    validateGuiCode() {
        if (!this.data.guiCode) {
            wx.showToast({
                title: '请输入图形验证码',
                icon: 'none'
            })
            return
        }
        let res = this.guiCode.validate(this.data.guiCode)
        if (!res) {
            wx.showToast({
                title: '图形验证码错误',
                icon: 'none'
            })
        }
    },

    /**
     * 立即验证按钮监听
     */
    toValidate() {
        //验证图形验证码
        this.validateGuiCode()
    },

})

guiCode工具类:

module.exports = class guiCode {
    constructor(options) {
        this.options = options
        this.init()
    }
    init() {
        // 注意:如果在组件中使用,请将这里的 wx 改为 this
        wx.createSelectorQuery().select(this.options.el)
                .fields({
                    node: true,
                    size: true
                }).exec((res) => {
                    this.canvas = res[0].node
                    this.ctx = this.canvas.getContext('2d')
                    this.canvas.width = this.options.width
                    this.canvas.height = this.options.height
                    this.fontSize = this.options.height * 3 / 6
                    this.ctx.textBaseline = "middle"
                    this.ctx.fillStyle = this.randomColor(180, 240)
                    this.refresh()
                })
    }
    refresh() {
        //清除上一次绘制
        this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height)
        var code = ''
        var txtArr = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
        for (var i = 0; i < 4; i++) {
            code += txtArr[this.randomNum(0, txtArr.length)]
        }
        this.options.createCodeImg = code
        let arr = (code + '').split('')
        if (arr.length === 0) {
            arr = ['e', 'r', 'r', 'o', 'r']
        }
        let offsetLeft = this.options.width * 0.6 / (arr.length - 1)
        let marginLeft = this.options.width * 0.2
        arr.forEach((item, index) => {
            this.ctx.fillStyle = this.randomColor(0, 180)
            let size = this.randomNum(18, this.fontSize)
            this.ctx.font = size + "px Arial"
            let dis = offsetLeft * index + marginLeft - size * 0.3
            let deg = this.randomNum(-30, 30)
            this.ctx.translate(dis, this.options.height * 0.5)
            this.ctx.rotate(deg * Math.PI / 180)
            this.ctx.fillText(item, 0, 0)
            this.ctx.rotate(-deg * Math.PI / 180)
            this.ctx.translate(-dis, -this.options.height * 0.5)
        })
        for (var i = 0; i < 4; i++) {
            this.ctx.strokeStyle = this.randomColor(40, 180)
            this.ctx.beginPath()
            this.ctx.moveTo(this.randomNum(0, this.options.width), this.randomNum(0, this.options.height))
            this.ctx.lineTo(this.randomNum(0, this.options.width), this.randomNum(0, this.options.height))
            this.ctx.stroke()
        }
        for (var i = 0; i < this.options.width / 4; i++) {
            this.ctx.fillStyle = this.randomColor(0, 255)
            this.ctx.beginPath()
            this.ctx.arc(this.randomNum(0, this.options.width), this.randomNum(0, this.options.height), 1, 0, 2 * Math.PI)
            this.ctx.fill()
        }
    }
    validate(code) {
        var code = code.toLowerCase()
        var v_code = this.options.createCodeImg.toLowerCase()
        if (code == v_code.substring(v_code.length - 4)) {
            return true
        } else {
            return false
        }
    }
    randomNum(min, max) {
        return Math.floor(Math.random() * (max - min) + min)
    }
    randomColor(min, max) {
        let r = this.randomNum(min, max)
        let g = this.randomNum(min, max)
        let b = this.randomNum(min, max)
        return "rgb(" + r + "," + g + "," + b + ")"
    }
}

至此就成功了,拿走请扣 6,有啥问题请评论区留言

UniApp多端滑块验证码组件zxj-slide-verify实用指南 滑块验证码作为人机校验的轻量方案,在登录、支付、活动防刷等场景中被广泛采用。其核心原理是前端生成随机缺口位置,通过用户拖拽行为与后端校验结果相结合,拦截自动化脚本。在UniApp跨端开发中,实现滑块验证需要处理小程序、App、H5三端的Canvas渲染差异、触摸响应和单位换算,自研成本高,第三方服务又存在集成复杂度。zxj-slide-verify是一套专为UniApp设计的滑块验证码组件,基于多端适配统一封装,提供拖拽验证、事件回调、实例方法等能力,并支持前后端联动完成验证闭环。本文从滑块验证的技术原理与 阅读详情

相关推荐

微信小程序字节集图片验证码实现

常规的实现方法可以使用Image标签,通过Src指定一个图片地址即可显示验证码。 但是微信小程序的请求是没有Session的,如果将验证码存入Session,那么验证Session就会出错。 解决Session的本质在于Cookie,浏览器会存储,但是小程序不会。所以我们需要请求图片的同时将Response Head中的Set-Cookie获取出来,这样在登录验证Session的时候才可以。 上代码 获取验证码的方法: getValidateCode(){//获取验证码 var that

小流氓哥哥 2010

微信小程序实现图形验证码登陆+手机验证码登陆

【代码】微信小程序实现图形验证码登陆+手机验证码登陆。

乐一的博客 4188

MySQL下载和安装教程

1.下载MySQL数据库可以访问官方网站:https://www.mysql.com/ 2.点击DOWNLOADS模块下的Community模块下的MySQL Community Server进行下载。 由于目前最新版本是:MySQL Community Server 5.7.21 建议博友下载历史版本,本博下载的是5.6.39 下载步骤: 进入,选择MySQL的版本及主机 根据自己的电脑选择相应的位数进行下载,本机是64位,点击download。 进入下.

残雪的剑的博客 4万+

小程序图形验证码

该篇文章介绍了如何在微信小程序中使用JavaScript和canvasAPI实现动态验证码的生成,包括随机代码生成、字符颜色和位置的随机变化,以及干扰线和点的绘制。最近需要使用到图形验证码,起初使用旧版的api。发现官方已经弃用了,不能实现需要的效果了,折腾好久终于使用新版的api做了出来。以上代码为微信小程序原生代码,可直接复制粘贴就可以运行使用。以及css中的width和height属性,进行大小调整。

bulaider的博客 1286

用Python实现古诗词填字游戏(三)

古诗词做填字游戏的第三部分代码,也是最核心的部分。实现对诗文和关键字的选定,并确定文字的输出位置。

PosPro的专栏 6117

通过两个mark点确定某一个点的位置

read_image (Image0, '0.bmp') binary_threshold (Image0, Region, 'max_separability', 'dark', UsedThreshold) connection (Region, ConnectedRegions) fill_up (ConnectedRegions, RegionFillUp) select_shape_std (RegionFillUp, SelectedRegions, 'max_area', 70) red...

优快云博客 3887

如何在微信开发者工具中插入图片

首先,在资源管理器一行,右键选择新建文件夹,将新建文件命名为image,该新建文件夹就会变为当前项目的媒体库 之后右键image文件,选择在资源管理器中打开 双击image文件,将你要的图片拖进去,那么在编辑器中就会出现你的图片 (以下操作将图片布置在index页面为例) 在index.wxml文件中: 在下面这个代码之前 <view class="usermotto"> <text class="user-motto">{{motto}}</text> &

全栈师的博客 3万+

运算放大器多谐振荡器设计实战:从施密特触发器到波形生成

本文详细介绍了运算放大器在多谐振荡器设计中的实战应用,涵盖施密特触发器的迟滞比较原理、非稳态振荡器的自激机制以及单稳态和双稳态电路的设计技巧。通过具体案例和参数计算,帮助工程师掌握波形生成与信号处理的核心技术,提升电路设计效率与稳定性。

pz89012345的博客 217

【微信小程序-原生开发】实用教程05-首页(含自定义调试模式、插入图片、图文排版、底部留白、添加本地图片)

微信小程序首页(含自定义调试模式、插入图片、图文排版、底部留白、添加本地图片)

朝阳39的博客 1699

拆解全球18大“支付清算”体系:CLS、中国、美国、欧洲、日本、mBridge...

拆解全球18大“支付清算”体系:CLS、中国、美国、欧洲、日本、mBridge...

银行信息系统应用架构详解 882

Magisk如何针对性隐藏Root避免被检测

Magisk隐藏特征码有两种途径,一种是通过插件,一种是定制源码。插件的方式相对简单,但是使用范围也有限,好处是成本低好上手。定制源码难度大,成本高,好处是稳定,后续也好更新维护。

zhonglunshun的专栏 1万+

微信小程序上如何使用图形验证码

这样图片就可以正常显示了,提交的方法里要带上cookie,这样就可以验证验证码了。注意红框部分的代码,生成的是ArrayBuffer类型的二进制图片。

小川搞开发的博客 971

让 ABAP Screen Variant 安稳上车:SHD0 与 SHD0_MANDT 的 Transport 全攻略

摘要: SAP项目常需优化交易码界面,通过SHD0的Transaction Variant和Screen Variant可实现字段精简、默认值预设及权限控制,避免修改标准代码。但跨系统迁移时易出现变式丢失或版本兼容问题。核心概念包括: Screen Variant:针对单个屏幕的字段属性配置(跨Client); Transaction Variant:串联多屏幕变式(分跨Client和Client-specific); 版本差异:4.70/6.x后需区分SHD0(跨Client)与SHD0_MANDT(Cl

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 225

微信小程序图形验证码,canvas,type为2d

微信小程序图形验证码,canvas,type为2d index.wxml <!--index.wxml--> <view class="canvas"> <canvas type="2d" id="myCanvas" bindtap='crash'></canvas> </view> index.wxss /**index.wxss**/ .canvas { overflow: hidden; width: 89px; .

烂人醉 1383

两点调制原理以及RF DAC和PLL SDM两条输入路径理解

特性数据本质原始数字比特流 (0/1)平滑后的预失真波形数据连接对象Σ-Δ调制器 (SDM)的小数输入RF DAC在系统中的角色主调制路径:通过改变PLL分频比产生频率偏移辅助补偿路径:通过RF DAC产生补偿电压,校正PLL失真可否加入延时可以且必须。用于数字时序对齐,对性能无影响。绝对不可以。会导致补偿失配,严重破坏信号频谱。功能目标实现数字域的频率调制确保模拟域的波形和频谱完美因此,在您所描述的这种先进发射机架构中,2-point数据是数字指令,送给SDM;

m0_49540263的博客 604

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

微信小程序绘制验证码(canvas)

canvas绘制登录验证码

可可的博客 697

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

微信小程序-滑动拼图安全验证

本文介绍了一个基于Taro框架开发的滑动拼图验证组件,使用微信小程序Canvas组件实现纯前端验证功能。组件包含安全验证弹窗、拼图区域和滑块三部分,用户需拖动滑块完成拼图验证。关键实现包括:1)通过Canvas绘制拼图背景和裁剪区域;2)监听触摸事件实现滑块交互;3)提供验证状态反馈(成功/失败)。组件支持自定义验证图片,采用响应式设计适配不同屏幕尺寸。该解决方案适用于小程序场景下的前端验证需求,无需后端参与即可完成基础验证功能。

kaolagirl的博客 515

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

PDF扫描、PDF合并与拆分、语音识别、二维码生成、贴图水印、证件照、拍照计数全能小程序万能工具的设计与实现

PDF扫描(类似于扫描王那种效果,支持自定义扫描件尺寸和滤镜),PDF拆分与合并,二维码生成(二维码自定义能力对标国内顶尖的二维码工具),语音识别(语音转文本、区分发言人、语音文本实现播放跟随),证件照生成(支持拖曳人像、人像增强修复),拍照计数(数钢筋、数串串,可以在后台动态上传识别的onnx模型动态实现能力扩展),长图拼接,贴图与水印(支持与PDF扫描功能联动),图片裁剪功能(三种模式的图片裁剪,覆盖大部分使用场景),图片压缩功能,签字提取(自动去除字体背景,背景效果为行业标杆级效果)

dj_xyp的博客 1085

uni-app x canvasToTempFilePath 指南:画布指定区域导出为临时图片文件

`uni.canvasToTempFilePath(options, componentInstance)` 用于把当前画布指定区域的内容导出,生成指定大小的图片,是 uni-app 体系中实现画布绘图导出、海报生成、图片合成等需求的核心 API。本文基于官方 API 文档,完整梳理其参数定义、兼容性边界与回调返回值,并结合当前仓库中的组件示例与变更记录,说明它在 Web、微信小程序平台上的标准用

gitblog_00571的博客 1071

图形验证码 uniapp 微信小程序

【代码】图形验证码 uniapp 微信小程序。

AAAXiaoApple的博客 897

微信小程序开发实现验证码生成

本文介绍了微信小程序开发过程生成验证码的两种方案,直接字符串显示和image组件加载base64编码字符串的方式

baorant24的博客 1253

小程序基本命令

onLoad: function () { // 生命周期函数--监听页面加载 onReady: function () { // 生命周期函数--监听页面初次渲染完成 }, onShow: function () { // 生命周期函数--监听页面显示 }, onHide: function () { // 生命周期函数--监...

aiven1637的博客 3558

微信小程序添加图片验证码

生成验证码代码来源:https://blog.youkuaiyun.com/java558/article/details/118105910,我把业务代码抽出来弄成一个组件。自己调试过程中遇到了一点问题。

C_hydar的博客 1132

微信小程序中的图形验证码

可以在utils中新建一个mcaptcha.js 代码如下: module.exports = class Mcaptcha { constructor(options) { this.options = options; this.fontSize = options.height * 3 / 6; this.init(); this.refresh(); } init()...

weixin_34008805的博客 4282

微信小程序点击切换图形验证码

点击切换图形验证码:给图片绑定一个点击事件,每次点击的时候赋值一个随机数 将图片地址传到绑定的事件中    赋一个初始值  img: "https://aaafs.top/com.jiminsheng.m/index.php/home/user/piccode" 图片点击事件   nextPic:function(e){   var that = t

qq_34609337的博客 3790

微信小程序方格子验证码复制粘贴就能用,卧龙凤雏前来报到

【代码】微信小程序方格子验证码复制粘贴就能用,卧龙凤雏前来报到大哥大姐过来捧捧场。

syp15729112236的博客 1560
上一篇: 微信小程序局部清除button默认样式(自定义样式)
下一篇: 小程序长按识别公众号二维码-已实现
盛国强
博客等级 码龄11年 105粉丝 22原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值