uni-app 微信小程序生成二维码带参数
今天分享一下如何在uni-app 中生成带有参数的二维码,主要用于分享和推广使用。首先分享一下思路和流程,最后总结一下需要注意的事项。
首先看一下效果图吧。【请忽略图上的二维码。】
需求:
- 1、点击生成专属二维码
- 2、弹出框展示生成的二维码,附带当前用户的个人信息
- 3、点击保存可以保存到手机相册
代码如下:
<view class="my_list_item" @click="createQrCode"> <view>生成专属二维码</view> </view>
弹出框:
<!-- 二维码弹出层 --> <view class="qrcode" v-if="showQrcode"> <view class="code_content"> <image :src="src2" style="width: 400rpx;height: 400rpx; margin: 10px auto; display: block;" mode="widthFix"></image> <button class="savePoster" @click="savePoster" type="primary">保存到相册</button> </view> <image src="../../../static/icon_close.png" class="close_code" @click="closeCode"></image> </view>
⚠️注意: 需要注意的是小程序分享二维码有三种方法,分别对应不同的需求,具体详情请看微信官方文档。
第一步: 获取 access_token
getToken() { uni.showLoading({ title: '加载中', mask: true }) let APPID = '从后台获取' let APPSECRET = '从后台获取' uni.request({ url: `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${APPID}&secret=${APPSECRET}`, method: "GET", }).then((res) => { if (res[1].data.expires_in != 7200) { uni.showToast({ title: "分享失败,请重新尝试。", icon: "none", duration: 2000 }) uni.hideLoading(); return } console.log(res) this.shareToken = res[1].data.access_token uni.hideLoading(); }).catch(err => { console.log(err) uni.hideLoading(); }) },
这里需要注意的是,现在我们是在前端写的,测试的时候设置成为不校验域名,真是线上版本的时候,是不能这么写的,因为涉及到机密的数据:APPID 和 APPSECRET,微信是强制不让在前端做这个。
报错: https://api.weixin.qq.com 不在以下 request 合法域名列表中,请参考文档:https://developers.weixin.qq.com/miniprogram/dev/framework/ability/network.html
所以必须在服务器上获取token 然后再通过后台的服务器返回 token给前端。(没有服务器的也不要担心,云开发可以解决这个难题,写一个云函数来代替服务器返回token)
第二步:将要转换的页面和参数转换为小程序码
⚠️: 请求微信的接口的时候请求方式为post,要注意设置相应的数据格式为arraybuffer,请求完毕后将数值转换为base64。
getWxCode() { let that = this let userId = uni.getStorageSync('userId') //这里是我要传递的参数 let scene='t/qrcode01*id/'+ userId; // 这里设置了渠道和分享人的信息 //let scene= 'id=123&name=jack' 也可以是这样子的格式 console.log(scene) uni.showLoading({ title: '加载中', mask: true }) uni.request({ url: `https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=${this.shareToken}`, method: "POST", data: { scene: scene, page: 'pages/index/index' }, responseType: 'arraybuffer', success: function(res) { uni.hideLoading(); let src = wx.arrayBufferToBase64(res.data); that.src2 = 'data:image/png;base64,' + src; that.showQrcode = true //控制弹出框,展示二维码 } }) },
注意⚠️⚠️⚠️:通过微信开发文档将页面转换为带参数的小程序码(一定要保证当前小程序有线上版本)
最后连贯起来就是:
createQrCode() { console.log("生成专属二维码") if(this.src2){ this.showQrcode = true } else { this.showQrcode = false this.getToken() } },
页面中如果获取传递的参数呢?
onLoad: function (options) { let scene = decodeURIComponent(options.scene) console.log(scene) },
如何解处理所接收到的 scene ?所生成的图片我们如何保存到手机相册? 下一篇文章一起分享。