1.需求描述:商家用扫描枪扫用户条形码或二维码实现支付。
2.效果图:
3.
4.说明:微信小程序、支付宝小程序的条形码和二维码都可以由一串数字通过barcode.js和qrcode.js插件绘制在页面的Canvas元素上。
5.两个插件的内容我贴在文章末尾
下面我总结一下基于微信小程序的整个实现流程:6.(支付宝小程序类似,只要在微信小程序的基础上稍微改一下就行了)
7.1.从后台获取要转换成条形码和二维码的一串数字code
8.2.分别用barcode.js和qrcode.js把数字绘制成页面canvas里的条形码和二维码
9.wxml:
viewcanvascanvas-id="barcode"/view{{codeStr}}/viewcanvascanvas-id="qrcode"//view10.utils.js
importqrcodefrom'./qrcode';importbarcodefrom'./barcode';//插件内部是根据width,height参数的rpx值来进行绘画//把数字转换成条形码functiontoBarcode(canvasId,code,width,height){barcode.code128(wx.createCanvasContext(canvasId),code,width,height);}//把数字转换成二维码functiontoQrcode(canvasId,code,width,height){qrcode.api.draw(code,{ctx:wx.createCanvasContext(canvasId),width,height})}export{toBarcode,toQrcode}11.//使用api
constcode='1221334122546765342';toBarcode('barcode',code,680,200);toQrcode('qrcode',code,420,420);constcodeStr=`${code.slice(0,4)}****${code.slice(20)}`;12.3.轮询请求后台,查看是否已被扫码(其实就是判断后台返回的code状态)
getStatus(code);functiongetStatus(code){wx.request({url:'/api/xxx',method:'GET',data:{code},success:(res)={if(res.isSuccess){//支付成功后的操作}else{//还未支付并且允许轮训的话就继续轮训if(this.state.caninterval){setTimeout(()={getStatus(code);},1500)}}}})}13.完整代码:
import{toBarcode,toQrcode}from'../utils';Page({data:{canInterval:true,//判断能不能轮询,作用是控制小程序切换到后台时不进行轮训code:'',//转换成条形码、二维码的数字codeStr:''},onLoad(){wx.request({url:'/api/xxx',method:'GET',success:(res)={const{code}=res.data;toBarcode('barcode',code,680,200);toQrcode('qrcode',code,420,420);constcodeStr=`${code.slice(0,4)}****${code.slice(20)}`;this.setData({code,codeStr})this.getStatus(code);}})},onShow(){const{code}=this.data;this.setData({canInterval:true});code&&this.getStatus(code);},getStatus(code){wx.request({url:'',method:'GET',data:{code},success:(res)={if(res.isSuccess){//支付成功后的操作}else{//还未支付并且允许轮训的话就继续轮训if(this.state.canInterval){setTimeout(()={this.getStatus(code);},1000)}}}})},onHide(){this.setData({canInterval:false})},onUnload(){this.setData({canInterval:false})}})附赠两个插件14.barcode.js
/**//https://github.com/alsey/wxbarcode//最后一位显示_问题//https://github.com/alsey/wxbarcode/issues/2////oksometypeofshiftisnessecaryif(shifter!=-1){result.push(shifter);result.push(codeValue(chr1));//把这里的chr2改成chr1即可。}**/!(function(){varCHAR_TILDE=126;varCODE_FNC1=102;varSET_STARTA=103;varSET_STARTB=104;varSET_STARTC=105;varSET_SHIFT=98;varSET_CODEA=101;varSET_CODEB=100;varSET_STOP=106;varREPLACE_CODES={CHAR_TILDE:CODE_FNC1//~correspondstoFNC1inGS1-128standard}varCODESET={ANY:1,AB:2,A:3,B:4,C:5};functiongetBytes(str){varbytes=[];for(vari=0;istr.length;i++){bytes.push(str.charCodeAt(i));}returnbytes;}exports.code128=function(ctx,text,width,height){width=parseInt(width);height=parseInt(height);varcodes=stringToCode128(text);varg=newGraphics(ctx,width,height);varbarWeight=g.area.width/((codes.length-3)*11+35);varx=g.area.left;vary=g.area.top;for(vari=0;icodes.length;i++){varc=codes[i];//twobarsatatime:1blackand1whitefor(varbar=0;bar8;bar+=2){varbarW=PATTERNS[c][bar]*barWeight;//varbarH=height-y-this.border;varbarH=height-y;varspcW=PATTERNS[c][bar+1]*barWeight;//noneedtodrawif0widthif(barW0){g.fillFgRect(x,y,barW,barH);}x+=barW+spcW;}}ctx.draw();}functionstringToCode128(text){varbarc={currcs:CODESET.C};varbytes=getBytes(text);//decidestartingcodesetvarindex=bytes[0]==CHAR_TILDE?1:0;varcsa1=bytes.length0?codeSetAllowedFor(bytes[index++]):CODESET.AB;varcsa2=bytes.length0?codeSetAllowedFor(bytes[index++]):CODESET.AB;barc.currcs=getBestStartSet(csa1,csa2);barc.currcs=perhapsCodeC(bytes,barc.currcs);//ifnocodesetchangesthiswillendupwithbytes.length+3//start,checksumandstopvarcodes=newArray();switch(barc.currcs){caseCODESET.A:codes.push(SET_STARTA);break;caseCODESET.B:codes.push(SET_STARTB);break;default:codes.push(SET_STARTC);break;}for(vari=0;ibytes.length;i++){varb1=bytes[i];//getthefirstofapair//shouldwetranslate/replaceif(b1inREPLACE_CODES){codes.push(REPLACE_CODES[b1]);i++//jumptonextb1=bytes[i];}//getthenextinthepairifpossiblevarb2=bytes.length(i+1)?bytes[i+1]:-1;codes=codes.concat(codesForChar(b1,b2,barc.currcs));//codeCtakes2charseachtimeif(barc.currcs==CODESET.C)i++;}//calculatechecksumaccordingtoCode128standardsvarchecksum=codes[0];for(varweight=1;weightcodes.length;weight++){checksum+=(weight*codes[weight]);}codes.push(checksum%103);codes.push(SET_STOP);//encodingshouldnowbecompletereturncodes;functiongetBestStartSet(csa1,csa2){//triestofigureoutthebestcodeset//tostartwithtogetthemostcompactcodevarvote=0;vote+=csa1==CODESET.A?1:0;vote+=csa1==CODESET.B?-1:0;vote+=csa2==CODESET.A?1:0;vote+=csa2==CODESET.B?-1:0;//tiegoestoBduetomyownpredudicesreturnvote0?CODESET.A:CODESET.B;}functionperhapsCodeC(bytes,codeset){for(vari=0;ibytes.length;i++){varb=bytes[i]if((b48||b57)&&b!=CHAR_TILDE)returncodeset;}returnCODESET.C;}//chr1iscurrentbyte//chr2isthenextbytetoprocess.looksahead.functioncodesForChar(chr1,chr2,currcs){varresult=[];varshifter=-1;if(charCompatible(chr1,currcs)){if(currcs==CODESET.C){if(chr2==-1){shifter=SET_CODEB;currcs=CODESET.B;}elseif((chr2!=-1)&&!charCompatible(chr2,currcs)){//needtocheckaheadaswellif(charCompatible(chr2,CODESET.A)){shifter=SET_CODEA;currcs=CODESET.A;}else{shifter=SET_CODEB;currcs=CODESET.B;}}}}else{//ifthereisanextcharANDthatnextcharisalsonotcompatibleif((chr2!=-1)&&!charCompatible(chr2,currcs)){//needtoswitchcodesetsswitch(currcs){caseCODESET.A:shifter=SET_CODEB;currcs=CODESET.B;break;caseCODESET.B:shifter=SET_CODEA;currcs=CODESET.A;break;}}else{//noneedtoshiftcodesets,atemporarySHIFTwillsufficeshifter=SET_SHIFT;}}//oksometypeofshiftisnessecaryif(shifter!=-1){result.push(shifter);result.push(codeValue(chr1));}else{if(currcs==CODESET.C){//includenextaswellresult.push(codeValue(chr1,chr2));}else{result.push(codeValue(chr1));}}barc.currcs=currcs;returnresult;}}//reducetheasciicodetofitintotheCode128chartablefunctioncodeValue(chr1,chr2){if(typeofchr2=="undefined"){returnchr1=32?chr1-32:chr1+64;}else{returnparseInt(String.fromCharCode(chr1)+String.fromCharCode(chr2));}}functioncharCompatible(chr,codeset){varcsa=codeSetAllowedFor(chr);if(csa==CODESET.ANY)returntrue;//ifweneedtochangefromcurrentif(csa==CODESET.AB)returntrue;if(csa==CODESET.A&&codeset==CODESET.A)returntrue;if(csa==CODESET.B&&codeset==CODESET.B)returntrue;returnfalse;}functioncodeSetAllowedFor(chr){if(chr=48&&chr=57){//0-9returnCODESET.ANY;}elseif(chr=32&&chr=95){//0-9A-ZreturnCODESET.AB;}else{//ifnonprintablereturnchr32?CODESET.A:CODESET.B;}}varGraphics=function(ctx,width,height){this.width=width;this.height=height;this.quiet=Math.round(this.width/40);this.border_size=0;this.padding_width=0;this.area={width:width-this.padding_width*2-this.quiet*2,height:height-this.border_size*2,top:this.border_size-4,left:this.padding_width+this.quiet};this.ctx=ctx;this.fg="#000000";this.bg="#ffffff";//fillbackgroundthis.fillBgRect(0,0,width,height);//fillcentertocreateborderthis.fillBgRect(0,this.border_size,width,height-this.border_size*2);}//usenativecolorGraphics.prototype._fillRect=function(x,y,width,height,color){this.ctx.setFillStyle(color)this.ctx.fillRect(x,y,width,height)}Graphics.prototype.fillFgRect=function(x,y,width,height){this._fillRect(x,y,width,height,this.fg);}Graphics.prototype.fillBgRect=function(x,y,width,height){this._fillRect(x,y,width,height,this.bg);}varPATTERNS=[[2,1,2,2,2,2,0,0],//0[2,2,2,1,2,2,0,0],//1[2,2,2,2,2,1,0,0],//2[1,2,1,2,2,3,0,0],//3[1,2,1,3,2,2,0,0],//4[1,3,1,2,2,2,0,0],//5[1,2,2,2,1,3,0,0],//6[1,2,2,3,1,2,0,0],//7[1,3,2,2,1,2,0,0],//8[2,2,1,2,1,3,0,0],//9[2,2,1,3,1,2,0,0],//10[2,3,1,2,1,2,0,0],//11[1,1,2,2,3,2,0,0],//12[1,2,2,1,3,2,0,0],//13[1,2,2,2,3,1,0,0],//14[1,1,3,2,2,2,0,0],//15[1,2,3,1,2,2,0,0],//16[1,2,3,2,2,1,0,0],//17[2,2,3,2,1,1,0,0],//18[2,2,1,1,3,2,0,0],//19[2,2,1,2,3,1,0,0],//20[2,1,3,2,1,2,0,0],//21[2,2,3,1,1,2,0,0],//22[3,1,2,1,3,1,0,0],//23[3,1,1,2,2,2,0,0],//24[3,2,1,1,2,2,0,0],//25[3,2,1,2,2,1,0,0],//26[3,1,2,2,1,2,0,0],//27[3,2,2,1,1,2,0,0],//28[3,2,2,2,1,1,0,0],//29[2,1,2,1,2,3,0,0],//30[2,1,2,3,2,1,0,0],//31[2,3,2,1,2,1,0,0],//32[1,1,1,3,2,3,0,0],//33[1,3,1,1,2,3,0,0],//34[1,3,1,3,2,1,0,0],//35[1,1,2,3,1,3,0,0],//36[1,3,2,1,1,3,0,0],//37[1,3,2,3,1,1,0,0],//38[2,1,1,3,1,3,0,0],//39[2,3,1,1,1,3,0,0],//40[2,3,1,3,1,1,0,0],//41[1,1,2,1,3,3,0,0],//42[1,1,2,3,3,1,0,0],//43[1,3,2,1,3,1,0,0],//44[1,1,3,1,2,3,0,0],//45[1,1,3,3,2,1,0,0],//46[1,3,3,1,2,1,0,0],//47[3,1,3,1,2,1,0,0],//48[2,1,1,3,3,1,0,0],//49[2,3,1,1,3,1,0,0],//50[2,1,3,1,1,3,0,0],//51[2,1,3,3,1,1,0,0],//52[2,1,3,1,3,1,0,0],//53[3,1,1,1,2,3,0,0],//54[3,1,1,3,2,1,0,0],//55[3,3,1,1,2,1,0,0],//56[3,1,2,1,1,3,0,0],//57[3,1,2,3,1,1,0,0],//58[3,3,2,1,1,1,0,0],//59[3,1,4,1,1,1,0,0],//60[2,2,1,4,1,1,0,0],//61[4,3,1,1,1,1,0,0],//62[1,1,1,2,2,4,0,0],//63[1,1,1,4,2,2,0,0],//64[1,2,1,1,2,4,0,0],//65[1,2,1,4,2,1,0,0],//66[1,4,1,1,2,2,0,0],//67[1,4,1,2,2,1,0,0],//68[1,1,2,2,1,4,0,0],//69[1,1,2,4,1,2,0,0],//70[1,2,2,1,1,4,0,0],//71[1,2,2,4,1,1,0,0],//72[1,4,2,1,1,2,0,0],//73[1,4,2,2,1,1,0,0],//74[2,4,1,2,1,1,0,0],//75[2,2,1,1,1,4,0,0],//76[4,1,3,1,1,1,0,0],//77[2,4,1,1,1,2,0,0],//78[1,3,4,1,1,1,0,0],//79[1,1,1,2,4,2,0,0],//80[1,2,1,1,4,2,0,0],//81[1,2,1,2,4,1,0,0],//82[1,1,4,2,1,2,0,0],//83[1,2,4,1,1,2,0,0],//84[1,2,4,2,1,1,0,0],//85[4,1,1,2,1,2,0,0],//86[4,2,1,1,1,2,0,0],//87[4,2,1,2,1,1,0,0],//88[2,1,2,1,4,1,0,0],//89[2,1,4,1,2,1,0,0],//90[4,1,2,1,2,1,0,0],//91[1,1,1,1,4,3,0,0],//92[1,1,1,3,4,1,0,0],//93[1,3,1,1,4,1,0,0],//94[1,1,4,1,1,3,0,0],//95[1,1,4,3,1,1,0,0],//96[4,1,1,1,1,3,0,0],//97[4,1,1,3,1,1,0,0],//98[1,1,3,1,4,1,0,0],//99[1,1,4,1,3,1,0,0],//100[3,1,1,1,4,1,0,0],//101[4,1,1,1,3,1,0,0],//102[2,1,1,4,1,2,0,0],//103[2,1,1,2,1,4,0,0],//104[2,1,1,2,3,2,0,0],//105[2,3,3,1,1,1,2,0]//106]})();15.qrcode.js
varQR=(function(){//alignmentpatternvaradelta=[0,11,15,19,23,27,31,//force1pat16,18,20,22,24,26,28,20,22,24,24,26,28,28,22,24,24,26,26,28,28,24,24,26,26,26,28,28,24,26,26,26,28,28];//versionblockvarvpat=[0xc94,0x5bc,0xa99,0x4d3,0xbf6,0x762,0x847,0x60d,0x928,0xb78,0x45d,0xa17,0x532,0x9a6,0x683,0x8c9,0x7ec,0xec4,0x1e1,0xfab,0x08e,0xc1a,0x33f,0xd75,0x250,0x9d5,0x6f0,0x8ba,0x79f,0xb0b,0x42e,0xa64,0x541,0xc69];//finalformatbitswithmask:level3|maskvarfmtword=[0x77c4,0x72f3,0x7daa,0x789d,0x662f,0x6318,0x6c41,0x6976,//L0x5412,0x5125,0x5e7c,0x5b4b,0x45f9,0x40ce,0x4f97,0x4aa0,//M0x355f,0x3068,0x3f31,0x3a06,0x24b4,0x2183,0x2eda,0x2bed,//Q0x1689,0x13be,0x1ce7,0x19d0,0x0762,0x0255,0x0d0c,0x083b//H];//4perversion:numberofblocks1,2;datawidth;eccwidthvareccblocks=[1,0,19,7,1,0,16,10,1,0,13,13,1,0,9,17,1,0,34,10,1,0,28,16,1,0,22,22,1,0,16,28,1,0,55,15,1,0,44,26,2,0,17,18,2,0,13,22,1,0,80,20,2,0,32,18,2,0,24,26,4,0,9,16,1,0,108,26,2,0,43,24,2,2,15,18,2,2,11,22,2,0,68,18,4,0,27,16,4,0,19,24,4,0,15,28,2,0,78,20,4,0,31,18,2,4,14,18,4,1,13,26,2,0,97,24,2,2,38,22,4,2,18,22,4,2,14,26,2,0,116,30,3,2,36,22,4,4,16,20,4,4,12,24,2,2,68,18,4,1,43,26,6,2,19,24,6,2,15,28,4,0,81,20,1,4,50,30,4,4,22,28,3,8,12,24,2,2,92,24,6,2,36,22,4,6,20,26,7,4,14,28,4,0,107,26,8,1,37,22,8,4,20,24,12,4,11,22,3,1,115,30,4,5,40,24,11,5,16,20,11,5,12,24,5,1,87,22,5,5,41,24,5,7,24,30,11,7,12,24,5,1,98,24,7,3,45,28,15,2,19,24,3,13,15,30,1,5,107,28,10,1,46,28,1,15,22,28,2,17,14,28,5,1,120,30,9,4,43,26,17,1,22,28,2,19,14,28,3,4,113,28,3,11,44,26,17,4,21,26,9,16,13,26,3,5,107,28,3,13,41,26,15,5,24,30,15,10,15,28,4,4,116,28,17,0,42,26,17,6,22,28,19,6,16,30,2,7,111,28,17,0,46,28,7,16,24,30,34,0,13,24,4,5,121,30,4,14,47,28,11,14,24,30,16,14,15,30,6,4,117,30,6,14,45,28,11,16,24,30,30,2,16,30,8,4,106,26,8,13,47,28,7,22,24,30,22,13,15,30,10,2,114,28,19,4,46,28,28,6,22,28,33,4,16,30,8,4,122,30,22,3,45,28,8,26,23,30,12,28,15,30,3,10,117,30,3,23,45,28,4,31,24,30,11,31,15,30,7,7,116,30,21,7,45,28,1,37,23,30,19,26,15,30,5,10,115,30,19,10,47,28,15,25,24,30,23,25,15,30,13,3,115,30,2,29,46,28,42,1,24,30,23,28,15,30,17,0,115,30,10,23,46,28,10,35,24,30,19,35,15,30,17,1,115,30,14,21,46,28,29,19,24,30,11,46,15,30,13,6,115,30,14,23,46,28,44,7,24,30,59,1,16,30,12,7,121,30,12,26,47,28,39,14,24,30,22,41,15,30,6,14,121,30,6,34,47,28,46,10,24,30,2,64,15,30,17,4,122,30,29,14,46,28,49,10,24,30,24,46,15,30,4,18,122,30,13,32,46,28,48,14,24,30,42,32,15,30,20,4,117,30,40,7,47,28,43,22,24,30,10,67,15,30,19,6,118,30,18,31,47,28,34,34,24,30,20,61,15,30];//Galoisfieldlogtablevarglog=[0xff,0x00,0x01,0x19,0x02,0x32,0x1a,0xc6,0x03,0xdf,0x33,0xee,0x1b,0x68,0xc7,0x4b,0x04,0x64,0xe0,0x0e,0x34,0x8d,0xef,0x81,0x1c,0xc1,0x69,0xf8,0xc8,0x08,0x4c,0x71,0x05,0x8a,0x65,0x2f,0xe1,0x24,0x0f,0x21,0x35,0x93,0x8e,0xda,0xf0,0x12,0x82,0x45,0x1d,0xb5,0xc2,0x7d,0x6a,0x27,0xf9,0xb9,0xc9,0x9a,0x09,0x78,0x4d,0xe4,0x72,0xa6,0x06,0xbf,0x8b,0x62,0x66,0xdd,0x30,0xfd,0xe2,0x98,0x25,0xb3,0x10,0x91,0x22,0x88,0x36,0xd0,0x94,0xce,0x8f,0x96,0xdb,0xbd,0xf1,0xd2,0x13,0x5c,0x83,0x38,0x46,0x40,0x1e,0x42,0xb6,0xa3,0xc3,0x48,0x7e,0x6e,0x6b,0x3a,0x28,0x54,0xfa,0x85,0xba,0x3d,0xca,0x5e,0x9b,0x9f,0x0a,0x15,0x79,0x2b,0x4e,0xd4,0xe5,0xac,0x73,0xf3,0xa7,0x57,0x07,0x70,0xc0,0xf7,0x8c,0x80,0x63,0x0d,0x67,0x4a,0xde,0xed,0x31,0xc5,0xfe,0x18,0xe3,0xa5,0x99,0x77,0x26,0xb8,0xb4,0x7c,0x11,0x44,0x92,0xd9,0x23,0x20,0x89,0x2e,0x37,0x3f,0xd1,0x5b,0x95,0xbc,0xcf,0xcd,0x90,0x87,0x97,0xb2,0xdc,0xfc,0xbe,0x61,0xf2,0x56,0xd3,0xab,0x14,0x2a,0x5d,0x9e,0x84,0x3c,0x39,0x53,0x47,0x6d,0x41,0xa2,0x1f,0x2d,0x43,0xd8,0xb7,0x7b,0xa4,0x76,0xc4,0x17,0x49,0xec,0x7f,0x0c,0x6f,0xf6,0x6c,0xa1,0x3b,0x52,0x29,0x9d,0x55,0xaa,0xfb,0x60,0x86,0xb1,0xbb,0xcc,0x3e,0x5a,0xcb,0x59,0x5f,0xb0,0x9c,0xa9,0xa0,0x51,0x0b,0xf5,0x16,0xeb,0x7a,0x75,0x2c,0xd7,0x4f,0xae,0xd5,0xe9,0xe6,0xe7,0xad,0xe8,0x74,0xd6,0xf4,0xea,0xa8,0x50,0x58,0xaf];//Galiosfieldexponenttablevargexp=[0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1d,0x3a,0x74,0xe8,0xcd,0x87,0x13,0x26,0x4c,0x98,0x2d,0x5a,0xb4,0x75,0xea,0xc9,0x8f,0x03,0x06,0x0c,0x18,0x30,0x60,0xc0,0x9d,0x27,0x4e,0x9c,0x25,0x4a,0x94,0x35,0x6a,0xd4,0xb5,0x77,0xee,0xc1,0x9f,0x23,0x46,0x8c,0x05,0x0a,0x14,0x28,0x50,0xa0,0x5d,0xba,0x69,0xd2,0xb9,0x6f,0xde,0xa1,0x5f,0xbe,0x61,0xc2,0x99,0x2f,0x5e,0xbc,0x65,0xca,0x89,0x0f,0x1e,0x3c,0x78,0xf0,0xfd,0xe7,0xd3,0xbb,0x6b,0xd6,0xb1,0x7f,0xfe,0xe1,0xdf,0xa3,0x5b,0xb6,0x71,0xe2,0xd9,0xaf,0x43,0x86,0x11,0x22,0x44,0x88,0x0d,0x1a,0x34,0x68,0xd0,0xbd,0x67,0xce,0x81,0x1f,0x3e,0x7c,0xf8,0xed,0xc7,0x93,0x3b,0x76,0xec,0xc5,0x97,0x33,0x66,0xcc,0x85,0x17,0x2e,0x5c,0xb8,0x6d,0xda,0xa9,0x4f,0x9e,0x21,0x42,0x84,0x15,0x2a,0x54,0xa8,0x4d,0x9a,0x29,0x52,0xa4,0x55,0xaa,0x49,0x92,0x39,0x72,0xe4,0xd5,0xb7,0x73,0xe6,0xd1,0xbf,0x63,0xc6,0x91,0x3f,0x7e,0xfc,0xe5,0xd7,0xb3,0x7b,0xf6,0xf1,0xff,0xe3,0xdb,0xab,0x4b,0x96,0x31,0x62,0xc4,0x95,0x37,0x6e,0xdc,0xa5,0x57,0xae,0x41,0x82,0x19,0x32,0x64,0xc8,0x8d,0x07,0x0e,0x1c,0x38,0x70,0xe0,0xdd,0xa7,0x53,0xa6,0x51,0xa2,0x59,0xb2,0x79,0xf2,0xf9,0xef,0xc3,0x9b,0x2b,0x56,0xac,0x45,0x8a,0x09,0x12,0x24,0x48,0x90,0x3d,0x7a,0xf4,0xf5,0xf7,0xf3,0xfb,0xeb,0xcb,0x8b,0x0b,0x16,0x2c,0x58,0xb0,0x7d,0xfa,0xe9,0xcf,0x83,0x1b,0x36,0x6c,0xd8,0xad,0x47,0x8e,0x00];//Workingbuffers://datainputandeccappend,imageworkingbuffer,fixedpartofimage,runlengthsforbadnessvarstrinbuf=[],eccbuf=[],qrframe=[],framask=[],rlens=[];//Controlvalues-widthisbasedonversion,last4arefromtable.varversion,width,neccblk1,neccblk2,datablkw,eccblkwid;varecclevel=2;//setbittoindicatecellinqrframeisimmutable.symmetricarounddiagonalfunctionsetmask(x,y){varbt;if(xy){bt=x;x=y;y=bt;}//y*y=1+3+5...bt=y;bt*=y;bt+=y;bt=1;bt+=x;framask[bt]=1;}//enteralignmentpattern-blacktoqrframe,whitetomask(laterblackframemergedtomask)functionputalign(x,y){varj;qrframe[x+width*y]=1;for(j=-2;j2;j++){qrframe[(x+j)+width*(y-2)]=1;qrframe[(x-2)+width*(y+j+1)]=1;qrframe[(x+2)+width*(y+j)]=1;qrframe[(x+j+1)+width*(y+2)]=1;}for(j=0;j2;j++){setmask(x-1,y+j);setmask(x+1,y-j);setmask(x-j,y-1);setmask(x+j,y+1);}}//========================================================================//ReedSolomonerrorcorrection//exponentiationmodNfunctionmodnn(x){while(x=255){x-=255;x=(x8)+(x&255);}returnx;}vargenpoly=[];//CalculateandappendECCdatatodatablock.Blockisinstrinbuf,indexestobuffersgiven.functionappendrs(data,dlen,ecbuf,eclen){vari,j,fb;for(i=0;ieclen;i++)strinbuf[ecbuf+i]=0;for(i=0;idlen;i++){fb=glog[strinbuf[data+i]^strinbuf[ecbuf]];if(fb!=255)/*fbtermisnon-zero*/for(j=1;jeclen;j++)strinbuf[ecbuf+j-1]=strinbuf[ecbuf+j]^gexp[modnn(fb+genpoly[eclen-j])];elsefor(j=ecbuf;jecbuf+eclen;j++)strinbuf[j]=strinbuf[j+1];strinbuf[ecbuf+eclen-1]=fb==255?0:gexp[modnn(fb+genpoly[0])];}}//========================================================================//Framedatainsertfollowingthepathrules//checkmask-sincesymmetricalusehalf.functionismasked(x,y){varbt;if(xy){bt=x;x=y;y=bt;}bt=y;bt+=y*y;bt=1;bt+=x;returnframask[bt];}//========================================================================//Applytheselectedmaskoutofthe8.functionapplymask(m){varx,y,r3x,r3y;switch(m){case0:for(y=0;ywidth;y++)for(x=0;xwidth;x++)if(!((x+y)&1)&&!ismasked(x,y))qrframe[x+y*width]^=1;break;case1:for(y=0;ywidth;y++)for(x=0;xwidth;x++)if(!(y&1)&&!ismasked(x,y))qrframe[x+y*width]^=1;break;case2:for(y=0;ywidth;y++)for(r3x=0,x=0;xwidth;x++,r3x++){if(r3x==3)r3x=0;if(!r3x&&!ismasked(x,y))qrframe[x+y*width]^=1;}break;case3:for(r3y=0,y=0;ywidth;y++,r3y++){if(r3y==3)r3y=0;for(r3x=r3y,x=0;xwidth;x++,r3x++){if(r3x==3)r3x=0;if(!r3x&&!ismasked(x,y))qrframe[x+y*width]^=1;}}break;case4:for(y=0;ywidth;y++)for(r3x=0,r3y=((y1)&1),x=0;xwidth;x++,r3x++){if(r3x==3){r3x=0;r3y=!r3y;}if(!r3y&&!ismasked(x,y))qrframe[x+y*width]^=1;}break;case5:for(r3y=0,y=0;ywidth;y++,r3y++){if(r3y==3)r3y=0;for(r3x=0,x=0;xwidth;x++,r3x++){if(r3x==3)r3x=0;if(!((x&y&1)+!(!r3x|!r3y))&&!ismasked(x,y))qrframe[x+y*width]^=1;}}break;case6:for(r3y=0,y=0;ywidth;y++,r3y++){if(r3y==3)r3y=0;for(r3x=0,x=0;xwidth;x++,r3x++){if(r3x==3)r3x=0;if(!(((x&y&1)+(r3x&&(r3x==r3y)))&1)&&!ismasked(x,y))qrframe[x+y*width]^=1;}}break;case7:for(r3y=0,y=0;ywidth;y++,r3y++){if(r3y==3)r3y=0;for(r3x=0,x=0;xwidth;x++,r3x++){if(r3x==3)r3x=0;if(!(((r3x&&(r3x==r3y))+((x+y)&1))&1)&&!ismasked(x,y))qrframe[x+y*width]^=1;}}break;}return;}//Badnesscoefficients.varN1=3,N2=3,N3=40,N4=10;//Usingthetableofthelengthofeachrun,calculatetheamountofbadimage//-longrunsorthosethatlooklikefinders;calledtwice,onceeachforXandYfunctionbadruns(length){vari;varrunsbad=0;for(i=0;i=length;i++)if(rlens[i]=5)runsbad+=N1+rlens[i]-5;//BwBBBwBasinfinderfor(i=3;ilength-1;i+=2)if(rlens[i-2]==rlens[i+2]&&rlens[i+2]==rlens[i-1]&&rlens[i-1]==rlens[i+1]&&rlens[i-1]*3==rlens[i]//whitearoundtheblackpattern?Notpartofspec&&(rlens[i-3]==0//beginning||i+3length//end||rlens[i-3]*3=rlens[i]*4||rlens[i+3]*3=rlens[i]*4))runsbad+=N3;returnrunsbad;}//Calculatehowbadthemaskedimageis-blocks,imbalance,runs,orfinders.functionbadcheck(){varx,y,h,b,b1;varthisbad=0;varbw=0;//blocksofsamecolor.for(y=0;ywidth-1;y++)for(x=0;xwidth-1;x++)if((qrframe[x+width*y]&&qrframe[(x+1)+width*y]&&qrframe[x+width*(y+1)]&&qrframe[(x+1)+width*(y+1)])//allblack||!(qrframe[x+width*y]||qrframe[(x+1)+width*y]||qrframe[x+width*(y+1)]||qrframe[(x+1)+width*(y+1)]))//allwhitethisbad+=N2;//Xrunsfor(y=0;ywidth;y++){rlens[0]=0;for(h=b=x=0;xwidth;x++){if((b1=qrframe[x+width*y])==b)rlens[h]++;elserlens[++h]=1;b=b1;bw+=b?1:-1;}thisbad+=badruns(h);}//black/whiteimbalanceif(bw0)bw=-bw;varbig=bw;varcount=0;big+=big2;big=1;while(bigwidth*width)big-=width*width,count++;thisbad+=count*N4;//Yrunsfor(x=0;xwidth;x++){rlens[0]=0;for(h=b=y=0;ywidth;y++){if((b1=qrframe[x+width*y])==b)rlens[h]++;elserlens[++h]=1;b=b1;}thisbad+=badruns(h);}returnthisbad;}functiongenframe(instring){varx,y,k,t,v,i,j,m;//findthesmallestversionthatfitsthestringt=instring.length;version=0;do{version++;k=(ecclevel-1)*4+(version-1)*16;neccblk1=eccblocks[k++];neccblk2=eccblocks[k++];datablkw=eccblocks[k++];eccblkwid=eccblocks[k];k=datablkw*(neccblk1+neccblk2)+neccblk2-3+(version=9);if(t=k)break;}while(version40);//FIXME-insurethatitfitsinstedofbeingtruncatedwidth=17+4*version;//allocate,clearandsetupdatastructuresv=datablkw+(datablkw+eccblkwid)*(neccblk1+neccblk2)+neccblk2;for(t=0;tv;t++)eccbuf[t]=0;strinbuf=instring.slice(0);for(t=0;twidth*width;t++)qrframe[t]=0;for(t=0;t(width*(width+1)+1)/2;t++)framask[t]=0;//insertfinders-blacktoframe,whitetomaskfor(t=0;t3;t++){k=0;y=0;if(t==1)k=(width-7);if(t==2)y=(width-7);qrframe[(y+3)+width*(k+3)]=1;for(x=0;x6;x++){qrframe[(y+x)+width*k]=1;qrframe[y+width*(k+x+1)]=1;qrframe[(y+6)+width*(k+x)]=1;qrframe[(y+x+1)+width*(k+6)]=1;}for(x=1;x5;x++){setmask(y+x,k+1);setmask(y+1,k+x+1);setmask(y+5,k+x);setmask(y+x+1,k+5);}for(x=2;x4;x++){qrframe[(y+x)+width*(k+2)]=1;qrframe[(y+2)+width*(k+x+1)]=1;qrframe[(y+4)+width*(k+x)]=1;qrframe[(y+x+1)+width*(k+4)]=1;}}//alignmentblocksif(version1){t=adelta[version];y=width-7;for(;;){x=width-7;while(xt-3){putalign(x,y);if(xt)break;x-=t;}if(y=t+9)break;y-=t;putalign(6,y);putalign(y,6);}}//singleblackqrframe[8+width*(width-8)]=1;//timinggap-maskonlyfor(y=0;y7;y++){setmask(7,y);setmask(width-8,y);setmask(7,y+width-7);}for(x=0;x8;x++){setmask(x,7);setmask(x+width-8,7);setmask(x,width-8);}//reservemask-formatareafor(x=0;x9;x++)setmask(x,8);for(x=0;x8;x++){setmask(x+width-8,8);setmask(8,x);}for(y=0;y7;y++)setmask(8,y+width-7);//timingrow/colfor(x=0;xwidth-14;x++)if(x&1){setmask(8+x,6);setmask(6,8+x);}else{qrframe[(8+x)+width*6]=1;qrframe[6+width*(8+x)]=1;}//versionblockif(version6){t=vpat[version-7];k=17;for(x=0;x6;x++)for(y=0;y3;y++,k--)if(1&(k11?version(k-12):tk)){qrframe[(5-x)+width*(2-y+width-11)]=1;qrframe[(2-y+width-11)+width*(5-x)]=1;}else{setmask(5-x,2-y+width-11);setmask(2-y+width-11,5-x);}}//syncmaskbits-onlysetaboveforwhitespaces,soaddinblackbitsfor(y=0;ywidth;y++)for(x=0;x=y;x++)if(qrframe[x+width*y])setmask(x,y);//convertstringtobitstream//8bitdatatoQR-coded8bitdata(numericoralphanum,orkanjinotsupported)v=strinbuf.length;//stringtoarrayfor(i=0;iv;i++)eccbuf[i]=strinbuf.charCodeAt(i);strinbuf=eccbuf.slice(0);//calculatemaxstringlengthx=datablkw*(neccblk1+neccblk2)+neccblk2;if(v=x-2){v=x-2;if(version9)v--;}//shiftandrepacktoinsertlengthprefixi=v;if(version9){strinbuf[i+2]=0;strinbuf[i+3]=0;while(i--){t=strinbuf[i];strinbuf[i+3]|=255&(t4);strinbuf[i+2]=t4;}strinbuf[2]|=255&(v4);strinbuf[1]=v4;strinbuf[0]=0x40|(v12);}else{strinbuf[i+1]=0;strinbuf[i+2]=0;while(i--){t=strinbuf[i];strinbuf[i+2]|=255&(t4);strinbuf[i+1]=t4;}strinbuf[1]|=255&(v4);strinbuf[0]=0x40|(v4);}//filltoendwithpadpatterni=v+3-(version10);while(ix){strinbuf[i++]=0xec;//bufferhasroomif(i==x)break;strinbuf[i++]=0x11;}//calculateandappendECC//calculategeneratorpolynomialgenpoly[0]=1;for(i=0;ieccblkwid;i++){genpoly[i+1]=1;for(j=i;j0;j--)genpoly[j]=genpoly[j]?genpoly[j-1]^gexp[modnn(glog[genpoly[j]]+i)]:genpoly[j-1];genpoly[0]=gexp[modnn(glog[genpoly[0]]+i)];}for(i=0;i=eccblkwid;i++)genpoly[i]=glog[genpoly[i]];//uselogsforgenpoly[]tosavecalcstep//appendecctodatabufferk=x;y=0;for(i=0;ineccblk1;i++){appendrs(y,datablkw,k,eccblkwid);y+=datablkw;k+=eccblkwid;}for(i=0;ineccblk2;i++){appendrs(y,datablkw+1,k,eccblkwid);y+=datablkw+1;k+=eccblkwid;}//interleaveblocksy=0;for(i=0;idatablkw;i++){for(j=0;jneccblk1;j++)eccbuf[y++]=strinbuf[i+j*datablkw];for(j=0;jneccblk2;j++)eccbuf[y++]=strinbuf[(neccblk1*datablkw)+i+(j*(datablkw+1))];}for(j=0;jneccblk2;j++)eccbuf[y++]=strinbuf[(neccblk1*datablkw)+i+(j*(datablkw+1))];for(i=0;ieccblkwid;i++)for(j=0;jneccblk1+neccblk2;j++)eccbuf[y++]=strinbuf[x+i+j*eccblkwid];strinbuf=eccbuf;//packbitsintoframeavoidingmaskedarea.x=y=width-1;k=v=1;//up,minus/*inteleaveddataandecccodes*/m=(datablkw+eccblkwid)*(neccblk1+neccblk2)+neccblk2;for(i=0;im;i++){t=strinbuf[i];for(j=0;j8;j++,t=1){if(0x80&t)qrframe[x+width*y]=1;do{//findnextfillpositionif(v)x--;else{x++;if(k){if(y!=0)y--;else{x-=2;k=!k;if(x==6){x--;y=9;}}}else{if(y!=width-1)y++;else{x-=2;k=!k;if(x==6){x--;y-=8;}}}}v=!v;}while(ismasked(x,y));}}//savepre-maskcopyofframestrinbuf=qrframe.slice(0);t=0;//besty=30000;//demerit//forinsteadofwhilesinceinoriginalarduinocode//ifanearlymaskwas"goodenough"itwouldn'ttryforabetterone//sincetheygetmorecomplexandtakelonger.for(k=0;k8;k++){applymask(k);//returnsblack-whiteimbalancex=badcheck();if(xy){//currentmaskbetterthanpreviousbest?y=x;t=k;}if(t==7)break;//don'tincrementitoavoidredoingmaskqrframe=strinbuf.slice(0);//resetfornextpass}if(t!=k)//redobestmask-nonegoodenough,lastwasn'ttapplymask(t);//addinfinalmask/ecclevelbytesy=fmtword[t+((ecclevel-1)3)];//lowbytefor(k=0;k8;k++,y=1)if(y&1){qrframe[(width-1-k)+width*8]=1;if(k6)qrframe[8+width*k]=1;elseqrframe[8+width*(k+1)]=1;}//highbytefor(k=0;k7;k++,y=1)if(y&1){qrframe[8+width*(width-7+k)]=1;if(k)qrframe[(6-k)+width*8]=1;elseqrframe[7+width*8]=1;}//returnimagereturnqrframe;}var_canvas=null,_size=null;varapi={getecclevel(){returnecclevel;},setecclevel(val){ecclevel=val;},getsize(){return_size;},setsize(val){_size=val},getcanvas(){return_canvas;},setcanvas(el){_canvas=el;},getFrame:function(string){returngenframe(string);},draw:function(string,canvas,size,ecc){ecclevel=ecc||ecclevel;canvas=canvas||_canvas;if(!canvas){console.warn('NocanvasprovidedtodrawQRcodein!')return;}size=size||_size||Math.min(canvas.width,canvas.height);varframe=genframe(string),ctx=canvas.ctx,px=Math.round(size/(width+8));varroundedSize=px*(width+8),offset=Math.floor((size-roundedSize)/2);size=roundedSize;ctx.clearRect(0,0,canvas.width,canvas.height);ctx.setFillStyle('#000000');for(vari=0;iwidth;i++){for(varj=0;jwidth;j++){if(frame[j*width+i]){ctx.fillRect(px*(4+i)+offset,px*(4+j)+offset,px,px);}}}ctx.draw();}}module.exports={api:api}})()
二维码和小程序码有啥区别-微信小程序之生成条形码和二维码-小程序二维码
浏览量:2065
时间:
来源:huangpb0624
版权声明
即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。
最新资讯
-

即速应用,赋能企业玩转微信小程序智慧经营
作为国内领军的智慧商业经营服务商,即速应用始终秉承“让每个企业都拥有自己的智慧店铺”的愿景,持续赋能更多企业玩转智慧经营。即速应用旗下拥有“小程序搭建工具-即速应用”、“私域流量专家-即客云”等产品,帮助商家打通互联网全生态营销闭环。 -

即客云2.0重磅更新,让微信小程序运营更简单!
即客云作为一款基于企业微信的第三方工具,现从多维度提供超过30种功能,自上线以来,已服务多家企业,受到一致好评。近期,我们根据客户反馈和市场调研正式推出升级版 即客云2.0!更新了私域运营SOP,群日历功能,批量拓客,客户雷达,消息推送,个人欢迎语,帮助企业更好运用企业微信;同时提升了社群运营工作标准化,提升运营效率,帮助企业实现客户增长,玩转私域流量。 -

零代码 + AI 双轮驱动|即速应用解锁人工智能小程序开发新范式
无需代码、无需 AI 算法功底,普通人也能快速搭建智能小程序。即速应用将人工智能与零代码开发深度融合,推出 AI 智能生成能力,用户通过自然语言描述需求,AI 自动生成小程序页面、功能模块与后台配置,覆盖商城、预约、同城、社区团购等全场景。平台内置 AI 智能推荐、智能客服、用户画像分析等能力,一键对接微信生态,打通视频号、企业微信、短信跳转,帮企业快速落地 AI 应用,抢占智慧经营先机,让每家企业都拥有 AI 驱动的智慧店铺。












