生成二维码1.获取access_token1.根据小程序官方文档可以知道怎么查询,但还是有些地方需要注意
第一个参数grant_type的值固定为client_credential,对于开发者而言没有什么特殊性appid和secret都是需要登陆小程序,从微信公众平台上获取获取到的access_token有效期是两个小时,没调用微信接口获取一遍,之前获取到的access_token的值就失效,所以需要注意保存和刷新代码如下/***获取小程序的access_token*@param{*}originId小程序的originId*/constgetAccessTokenasync(appid,secret){constquery{appid,secret,grant_type:'client_credential'};const{data}awaitrequest.get(WECHAT_MINI_TOKEN_URL,query);//过期时间,因网络延迟等,将实际过期时间提前10秒,以防止临界点constexpireTimeDate.now()+(data.expires_in-10)*1000;consttokendata.access_token;return{accessToken:token,expireTime};};2.获取二维码2.微信开发文档中,提供三种,二维码的方式。
3.接口A:适用于需要的码数量较少的业务场景
4.生成小程序码,可接受path参数较长,生成个数受限
5.接口B:适用于需要的码数量极多的业务场景
6.生成小程序码,可接受页面参数较短,生成个数不受限。
7.接口C:适用于需要的码数量较少的业务场景
8.生成二维码,可接受path参数较长,生成个数受限
9.其中,接口A和接口C次数加起来,共有100,000个。我在项目中是使用的接口B,所以用它来写这个例子
10.好了,下面就是获取二维码的正式内容了,传送门
11.这个获取过程中其实还是不难的,只是文档有些地方没有说明,我就说几个我在开发过程中碰到的几个常见错误
access_token的值不是放在POST请求的参数中,而是以GET请求的方式拼接在链接的后面12.https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_tokenACCESS_TOKEN
errcode":47001,“errmsg”:“dataformaterror”13.这个错误有的是说access_token的值失效了。然而我碰到这个错误的原因不是这个,是由于我把access_token放入到了POST请求的body中导致的,把access_token从body删除,错误就解决了。
“errcode”:44002,“errmsg”:“emptypostdata”14.这个错误是我在POST请求的body中没有传递值导致的,主要是没有传递scene的值导致。
3.转换成图片15.由于第二步中微信接口返回的数据并不是图片的链接,而只是图片的二进制内容。当时给我造成挺大的困扰,因为这个接触不多,只能通过搜索找到。下面说下我的解决过程
转换成base64格式,然后把值传递给前端,前端把这个值放入到imgage标签的src位置就能显示出来。/***生成小程序二维码*@param{*}originId小程序的原始ID*@param{*}body小程序所需参数*/constgenerateQrCodeasync(originId,body){//返回的是个对象{accessToken:'token值',expireTime:'过期时间'}constaccessTokenawaitensureAccessToken(originId);//获取access_token的值,const{data}awaitrequest.post(`${WECHAT_MINI_QRCODE_UNLIMIT_URL}?access_token${accessToken.accessToken}`,body,{headers:{'Content-Type':'application/json'//POST参数需要转成JSON字符串,不支持form表单提交。},responseType:'arraybuffer'//重点});constbase64Buffer.from(data).toString('base64');return`data:image/jpg;base64,${base64}`;};写入本地文件importfsfrom'fs';/***生成小程序二维码*@param{*}originId小程序的原始ID*@param{*}body小程序所需参数*/constgenerateQrCodeasync(originId,body){constaccessTokenawaitensureAccessToken(originId);const{data}awaitrequest.post(`${WECHAT_MINI_QRCODE_UNLIMIT_URL}?access_token${accessToken.accessToken}`,body,{headers:{'Content-Type':'application/json'},responseType:'stream'//重点});data.pipe(fs.createWriteStream('./qrcode.png'));//方式二://responseType:'arraybuffer'//fs.writeFile('./test_origin.jpg',data,err{//console.log('dataerr',err);//});};以流的形式传给前端constgenerateQrCodeasync(originId,body){constaccessTokenawaitensureAccessToken(originId);const{data}awaitrequest.post(`${WECHAT_MINI_QRCODE_UNLIMIT_URL}?access_token${accessToken.accessToken}`,body,{headers:{'Content-Type':'application/json'},responseType:'arraybuffer'});returnBuffer.from(data);};constgetQrcodeasyncctx{constqrcodegenerateQrCode(originId,{});ctx.type'png';ctx.bodyqrcode;};4.完整代码16.由于传给前端的过程中出现了一些问题,最终选择了第三种方法。
17.第一种方法传给前端后,能显示,但是有时候会扫描失败,而且开发者工具有效,真机调试实现;
18.第二种方法,需要把图片上传到云服务器上,然后把链接返回前端,过程比较麻烦;麻烦包括删除上传过的二维码。
19.第三种方法比较方便,传给小程序段显示就行。
//request.jsimportaxiosfrom'axios';import{merge}from'lodash';constrequestasync(_options,method'GET'){constoptionsmerge({headers:{'user-agent':'Mozilla/5.0(Macintosh;IntelMacOSX10_13_6)AppleWebKit/537.36(KHTML,likeGecko)Chrome/69.0.3497.81Safari/537.36'}},{..._options},{method});returnaxios(options);};/***封装get请求*@param{String}url请求路径*@param{Object}请求参数*paramsGET请求参数*/constget(url,params,_options){returnrequest({..._options,params,url});};/***封装post请求*@param{Object}请求参数*dataPOST请求请求参数,对象形式*/constpost(url,data,_options){returnrequest({..._options,data,url},'POST');};export{get,post,request};//index.jsimportmongoosefrom'mongoose';import*asrequestfrom'../util/request';constWECHAT_MINI_TOKEN_URL'https://api.weixin.qq.com/cgi-bin/token';constWECHAT_MINI_QRCODE_UNLIMIT_URL'https://api.weixin.qq.com/wxa/getwxacodeunlimit';/***检查AccessToken是否有效,检查规则为当前时间和过期时间进行对比*@param{Object}tokentoken对象*/constvalidAccessToken(token){const{accessToken,expireTime}token;return!!accessTokenDate.now()expireTime;};/***获取小程序的access_token*@param{*}originId小程序的originId*/constgetAccessTokenasync(appid,secret){constquery{appid,secret,grant_type:'client_credential'};const{data}awaitrequest.get(WECHAT_MINI_TOKEN_URL,query);//过期时间,因网络延迟等,将实际过期时间提前10秒,以防止临界点constexpireTimeDate.now()+(data.expires_in-10)*1000;consttokendata.access_token;return{accessToken:token,expireTime};};/***获取有效的access_token*/constensureAccessTokenasync(originId){constWechatAccountmongoose.model('WechatAccount');constaccountawaitWechatAccount.findOne({originId:'gh_508456022339'});if(!account){returnnull;}const{accessToken,appid,secret}account;if(!validAccessToken(accessToken)){consttokenawaitgetAccessToken(appid,secret);//刷新wechatAccount的tokenaccount.accessTokentoken;awaitaccount.save();returntoken;}returnaccessToken;};/***生成小程序二维码*@param{*}originId小程序的原始ID*@param{*}body小程序所需参数*/constgenerateQrCodeasync(originId,body){constaccessTokenawaitensureAccessToken(originId);const{data}awaitrequest.post(`${WECHAT_MINI_QRCODE_UNLIMIT_URL}?access_token${accessToken.accessToken}`,body,{headers:{'Content-Type':'application/json'},responseType:'arraybuffer'});constbase64Buffer.from(data).toString('base64');returnBuffer.from(data);};//controller.js/***生成二维码*/constgetQrcodeasyncctx{const{content,path,width430}ctx.query;const{originId}ctx.header;constparams{scene:_id,width,page};constdataawaitctx.services.wechatUser.generateQrCode(originId,params);ctx.type'png';ctx.bodydata;};
小程序生成小程序码过程中遇到的问题-小程序转换成小程序码-小程序码在线生成
浏览量:2238
时间:
来源:心情后花园
版权声明
即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

最新资讯
-
抖音再现本地生活服务,咫尺同城圈商业变现新通道
短视频成为本地生活探店网红营销变现引流的新阵地,每一位网红都渴望在短视频内“一夜爆红”。即速应用团队对多商家小程序进行升级,打造了咫尺同城圈:“同城探店营销助手”,不仅完善商家营销技巧,还助力探店网红玩转本地生活服务。 -
抖音再现本地生活服务,咫尺同城圈商业变现新通道
短视频成为本地生活探店网红营销变现引流的新阵地,每一位网红都渴望在短视频内“一夜爆红”。即速应用团队对多商家小程序进行升级,打造了咫尺同城圈:“同城探店营销助手”,不仅完善商家营销技巧,还助力探店网红玩转本地生活服务。 -
阿坝小程序代理
阿坝藏族羌族小程序代理公司有哪些?阿坝藏族羌族小程序代理平台哪个好?阿坝藏族羌族小程序代理商怎么收费,代理政策如何?下面就让即速应用产品经理jisuapp.cn来告诉你吧!