先放小程序官方文档:获取小程序码
要求实现:获取小程序码,且无数量限制。
实现思路:
1、点击按钮后调接口,接口返回小程序码;
2、把小程序码传给Dom模板,模板是自定义的,可在页面上渲染成任意自己想要的样子。
3、注意:用户扫描小程序码进入到的指定页面, 在 onLoad() 生命周期取参时需要区分用户是扫码进入的还是正常通过url跳转进入的,2种进入页面的取参方式不同。
具体步骤:
1、js代码
- show_post() {//按钮点击事件
- var that = this;
- that.get_qrcodes(function (qrcodes) {
- wx.showLoading({
- title: ''正在生成中...'',
- mask: true
- });
- setTimeout(function () {
- wx.hideLoading();
- wx.showToast({
- title: ''海报已生成'',
- icon: ''success'',
- duration: 1500
- })
- that.setData({
- showPost: true,
- template: new ImageExample().palette(that.data.image1, qrcodes)
- });
-
- // 说明:
- // ImageExample() --自定义的海报模板
- // that.data.image1 --生成海报需要的图片
- // qrcodes --接口返回的小程序码
- }, 1000)
- });
- },
-
- get_qrcodes: function (cb) {//调接口取二维码
- var that = this;
- var paramData = {};
- paramData.sign = app.globalData.signture;//这个是自己项目请求接口时必传的参数,跟生成小程序码没关系。
- paramData.big = ''200'';//设置小程序码的宽高
- paramData.page = ''pages/activities/doubleEleven/eleven_index/eleven_index'';//设置扫描小程序码后跳转的页面
-
- /* 用scene来传参,传参时有些地方要注意:
- 一般情况下参数的拼接方式是这样的:goodsId=111&sourceUuid=222;
- 但是这里的等号要用一个特殊符号代替,因为有多个参数时,用等号拼接,在onload()里取参会取不完整。只能取到goodsId=111,后面的参数取不到。
- 具体是什么原因造成的,不知道。反正用特殊符号"*"取代就可以取到完整参数。
- 这里建议不要用"/"符号,因为如果参数里有url或者图片链接时,这些参数值里也有"/",onload()里通过"/"截取参数会有问题。
- */
- if(that.data.sourceUuid){
- paramData.scene = ''goodsId*''+that.data.goodsId+''&sourceUuid*''+that.data.sourceUuid;
- }else{
- paramData.scene = ''goodsId*''+that.data.goodsId;
- }
-
- wx.request({
- url: app.globalData.getRequestUrl(''chargeBModeKmjLinkQrimgScene''),
- data: paramData,
- method: ''POST'',
- header: {
- ''content-type'': ''application/json''
- },
- success: function (res) {
- if (res.data.data.code != 0) {
- wx.showToast({
- title: res.data.data.msg,
- icon: ''none'',
- mask: false
- });
- }
- that.setData({
- qrcodes: ''data:image/png;base64,'' + res.data.data.base64
- })
- cb(''data:image/png;base64,'' + res.data.data.base64) //返回小程序码
- },
- });
- },
-
-
- class ImageExample {//海报模板
- palette(image1, qrcodes) {
- return ({
- width: ''750rpx'',
- height: ''1040rpx'',
- borderRadius: ''15rpx'',
- views: [
- {
- type: ''image'',
- url: image1.replace(''http'', ''https''),
- css: {
- width: ''750rpx'',
- height: ''690rpx'',
- left: ''0rpx'',
- top: ''0rpx''
- },
- },
- {
- type: ''image'',
- url: qrcodes,
- css: {
- top: ''700rpx'',
- width: ''200rpx'',
- height: ''200rpx'',
- left: ''50rpx'',
- },
- },
- {
- type: ''text'',
- text: ''长按识别二维码参团哦'',
- css: {
- height: ''80rpx'',
- right: ''48rpx'',
- top: ''840rpx'',
- color: ''#999'',
- fontSize: ''30rpx'',
- lineHeight: ''84rpx'',
- textAlign: ''right''
- },
- },
- {
- type: ''image'',
- url: ''https://m.qxdaojia.com/static/html_list_static/img/list/post_bot_img.png'',
- css: {
- top: ''910rpx'',
- width: ''750rpx'',
- height: ''129rpx'',
- left: ''0rpx'',
- },
- },
- ],
- });
- };
- }
生成小程序码接口参数解释:
2、Dom部分:template就是封装好的模板。
- <!-- 海报 -->
- <view class="follow_views" wx:if=''{{showPost}}''>
- <view class="flex-column down_load_pop" bindtap="close_post">
- <view class="flex-column down_load_cont" catchtap="postcatch">
- <painter palette="{{template}}" bind:imgOK="onImgOK" style=''border-radius:15rpx;position:fixed;left:-100vw;'' />
- <scroll-view scroll-y style="width:650rpx;height:auto;max-height:76vh;box-shadow: 0 1px 18px rgba(0, 0, 0, .72);border-radius:15rpx;">
- <image src=''{{imagePath}}'' style="width:650rpx; border-radius:15rpx;display:block" mode=''widthFix'' show-menu-by-longpress/>
- </scroll-view>
- <image src=''https://m.qxdaojia.com/static/html_list_static/img/goods_detail/close.png'' class="post_close" bindtap="close_post" />
- <view class=''saveButton'' bind:tap=''saveImage''>保存图片</view>
- <view style="color:#666;font-size:12px;line-height:50rpx">保存图片到手机后,将图片分享好友、朋友圈</view>
- </view>
- </view>
- </view>
最后生成的海报样子:
3、扫小程序码之后进入指定页,onload()取参方式。
- onLoad: function (options) {
- if(options.scene){
- //scene有值说明是扫小程序码进入的当前页面,取参数的方式需要改变
- //options.scene取到的是 "goodsId*111&sourceUuid*222",要把字符串转换成obj。
- }else{
- //正常方式跳转进来,可以直接从options里取参。
- that.setData({
- goodsId: options.goodsId,
- sourceUuid: options.sourceUuid ? options.sourceUuid : "",//客户经理开团会带有sourceUuid
- })
- }
- },
4、最后有一点要注意,scene对参数长度有限制。
解决方案:
前端人员在调获取小程序码接口的时候传参,后端人员在后台对参数进行MD5加密,无论传了多少个参数,加密后会生成一个16位的字符串,这样就不会超过32个字符的限制。
前端在onload()取到加密后的16位scene,再调一个接口对参数进行解密。

onload() 代码如下:
-
- onLoad: function (options) {
- var that = this;
- if(options.scene){
- //scene有值说明是扫小程序码进入的当前页面,取参数的方式需要改变
- //调接口把加密的参数进行解密
- var paramData = {sceneEn:options.scene};
-
- wx.request({
- url: app.globalData.getRequestUrl(''sceneEncrypt''),
- data: paramData,
- method: ''get'',
- header: {
- ''content-type'': ''application/json''
- },
- success: function (res) {
- // console.log(res.data);
- if (res.data.code == 0) {
- var sceneStr = res.data.scene_decrypt;
- var arr = sceneStr.split("&");
- var obj={};
- arr.forEach(function(e){
- var nameStr = e.substring(0,e.indexOf("*"));
- var valueStr = e.substring(e.indexOf("*")+1,e.length);
- obj[nameStr] = valueStr;
- })
- console.log("解密后的参数:");console.log(obj);
-
- that.setData({
- goodsId: obj.goodsId,
- sourceUuid: obj.sourceUuid ? obj.sourceUuid : "",
- })
- }else{
- wx.showToast({
- title: "页面参数解密失败,请重试!",
- icon: ''none'',
- mask: false
- });
- }
- }
- });
- }else{
- //正常方式跳转进来,可以直接从options里取参。
- that.setData({
- goodsId: options.goodsId,
- sourceUuid: options.sourceUuid ? options.sourceUuid : "",//客户经理开团会带有sourceUuid
- })
- }
- },