获取小程序码(一物一码)实现方式

博客围绕无数量限制获取小程序码展开。实现思路为点击按钮调接口返回小程序码,传给自定义Dom模板渲染。需注意扫码和正常跳转进入页面取参方式不同,且scene对参数长度有限制,解决方案是前后端分别对参数加密和解密。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先放小程序官方文档:获取小程序码

要求实现:获取小程序码,且无数量限制。

 实现思路:

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
      })
    }
},

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值