……

微信小程序--绘制验证码

Posted on 2021-01-05 10:15  WALL*E  阅读(355)  评论(0编辑  收藏  举报
  1. utils 文件中新建 mcaptcha.js 文件,写入以下代码:
module.exports = class Mcaptcha {
    //画板
  constructor(options) {
    this.options = options;
    this.fontSize = options.height * 3 / 4;
    this.init();
    this.refresh(this.options.code);
  }
  init() {
    this.ctx = wx.createCanvasContext(this.options.el);
    this.ctx.setTextBaseline("middle");
    this.ctx.setFillStyle(this.randomColor(180, 240));
    this.ctx.fillRect(0, 0, this.options.width, this.options.height);
  }
    //绘制彩图
  refresh(code) {
    let arr = (code + '').split('');
    let width = this.options.width;
    let height = this.options.height;
    let ctx = this.ctx;
    if (arr.length === 0) {
      arr = ['e', 'r', 'r','o','r'];
    };
    let offsetLeft = width * 0.6 / (arr.length - 1);
    let marginLeft = width * 0.2;
    arr.forEach((item, index) => {
      ctx.setFillStyle(this.randomColor(0, 180));
      let size = this.randomNum(24, this.fontSize);
      ctx.setFontSize(size);
      let dis = offsetLeft * index + marginLeft - size * 0.3;
      let deg = this.randomNum(-30, 30);
      ctx.translate(dis, height*0.5);
      ctx.rotate(deg * Math.PI / 180);
      ctx.fillText(item, 0, 0);
      ctx.rotate(-deg * Math.PI / 180);
      ctx.translate(-dis, -height * 0.5);
    })
    //绘制干扰线
    for (var i = 0; i < 2; i++) {
	    ctx.strokeStyle = this.randomColor(40, 180);
	    ctx.beginPath();
	    ctx.moveTo(this.randomNum(0, width), this.randomNum(0, height));
	    ctx.lineTo(this.randomNum(20, width), this.randomNum(2, height));
	    ctx.stroke();
    }
    //绘制干扰点
    for (var i = 0; i < 30; i++) {
	    ctx.fillStyle = this.randomColor(0, 255);
	    ctx.beginPath();
	    ctx.arc(this.randomNum(0, width), this.randomNum(0, height), 1, 0, 2 * Math.PI);
	    ctx.fill();
	  }
    ctx.draw();
  }
    //设置随机数的颜色
  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 + ")";
  }
}
  1. 在需要验证码的js文件中引入
let Mcaptcha = require("../../../utils/mcaptcha.js");
  1. res.data 是要传到mcaptcha.js 中的 code 值,也就是验证码,可以随意写为如:“ho55”,“a2sd” 等等。我这里是从后台传过来的数据,(前人写的代码,不好改动,只在前端加上干扰线和彩图)。
new Mcaptcha({
    el: 'canvas',
    width: 100,
    height: 30,
    code: res.data
});	
  1. wxml 文件, bindtap="getImgYZM"new Mcaptcha 的方法名,再次点击可以换验证码图片。
<view bindtap="getImgYZM" class="yzm">
    <canvas style="width:{{cvs.width}};height:{{cvs.height}};" canvas-id="canvas"></canvas>
</view>

如果是在前端设置随机数,可以在data:{} 里面写

 data: {
     str:"0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,P,Q,R,S,T,U,V,W,X,Y,Z",
     randStr:""
 }
//获取随机数
var res = "";
for(var i = 0; i < str.length ; i ++) {
    var id = Math.ceil(Math.random()*35);
    res += chars[id];
}
return res;

这一步可不看,以下是后端C#语言产生随机数返给前端的代码:

using JobClass;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Web;
using System.Web.SessionState;

namespace WebSite.pcode
{
    /// <summary>
    /// getcode 的摘要说明
    /// </summary>
    public class getcode : IHttpHandler, IRequiresSessionState
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            string str = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,P,Q,R,S,T,U,V,W,X,Y,Z";
            string randStr = "";
            //生成随机数  Random
            Random randobj = new Random();
            string[] arr = str.Split(',');
            for (int i = 0; i < 4; i++)
            {
                randStr += arr[randobj.Next(arr.Length)];
            }
            context.Response.Write(randStr);
            return;
        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}