精华内容
下载资源
问答
  • 小程序生成二维码

    2018-11-28 18:28:34
    这里官方提供了3个生成小程序二维码的接口,首先,来解释下生成二维码形状的差别: 通过postman测试,发现,接口A和接口B生成的是圆形二维码,而接口C生成的是方形二维码。 并且,接口A和接...

    首先肯定是阅读咱们的官方文档。

    https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/qr-code.html

    这里官方提供了3个生成小程序二维码的接口,首先,来解释下生成二维码形状的差别:

    通过postman测试,发现,接口A和接口B生成的是圆形二维码,而接口C生成的是方形二维码。

    并且,接口A和接口B支持修改生成的二维码图片的线条颜色。而接口C不支持。

    也就是说,只有圆形小程序二维码才支持修改颜色,方形二维码不支持修改颜色。下面请看用postman测试生成的二维码:

    这里用postman测试的时候一定要注意,要将参数设置为json格式,不然会报错。

    然后将相关参数写在Body中,写上相关参数。

    更多关于生成二维码的详细介绍,还是请大家参考官方API

    https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/qr-code.html

     

    展开全文
  • 小程序生成二维码
  • 微信小程序生成二维码,完整的二维码生成案例,可以快速应用,生成所需二维码。
  • 小程序 生成二维码

    2018-12-03 17:26:51
    1.小程序调用生成二维码成功的时候,返回的是一个二维码图片的二进制文件流。 2.前端接受到图片的二进制的资源,拼接成 'data:' . $mime . ';base64,'base64_encode($wx_result), 直接返回功前端接受,前端再...
    1.小程序调用生成二维码成功的时候,返回的是一个二维码图片的二进制文件流。
    
    2.前端接受到图片的二进制的资源,拼接成 
    'data:' . $mime . ';base64,'base64_encode($wx_result),
    
    直接返回功前端接受,前端再可以cavase绘图。
    

    3.如果需要浏览器可以直接查看返回的二进制流,拼接成

    <image src="'data:' . $mime . ';base64,'base64_encode($wx_result)" >,直接浏览器可以查看。

    4.以下是代码分析:
    
    
     /*
         * 生成活动分享页二维码*/
        public function buildImgIndex()
        {
            try{
                $unionid = post('unionid');
                $fileName = $unionid.'.png';
                $fileData = WidRead($fileName);
                if($fileData){
                    echo $this->img_uri($fileData);exit;
                }else{
                    $TokenData = getAccessToken();
                    if($TokenData['code'] == 200){
                        $accessToken = $TokenData['data']['access_token'];
                    }else{
                        echo jsonOut(returnArr(410,'','error'));exit;
                    }
                    $page = "pages/activityflower/activityflower";
                    $scene = "unionid=".$unionid;
          $path = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=".$accessToken;
                    $parameter = array(
                        "access_token" => $accessToken,
                        'scene' => $scene,  //绑定该用户的unionid
                        'page' => $page,
                        'auto_color'=>false,
                        'width'=>430
                    );
                    $parameter = json_encode($parameter);
                    $curl = new \Curl\Curl();
                    $curl->setHeader('content-type','application/json; charset=utf-8');
                    $curl->setOpt(CURLOPT_SSL_VERIFYPEER,false);
                    $curl->setOpt(CURLOPT_SSL_VERIFYHOST,false);
                    $curl->post($path,$parameter);
                    if($curl->error){
                        $error_message = $curl->error_message;
                        $error_code = $curl->error_code;
                        $response = $curl->response_headers;
                        $param['response'] = $response;
                        $param['code'] = $error_code;
                        $param['msg'] = $error_message;
                        $param['contents'] = "coin connect  error";
                        $curl->close();
                        echo jsonOut(returnArr(400,'',''));
                    }else{
                        $data = $curl->response;  //返回图片文件流
                        $curl->close();
                    }
                    $dataJson = json_decode($data);//如果成功返回文件流 json_decode为null,其他就自带微信的错误返回
                    if($dataJson == null){
                        WidWrite($fileName,$data);
                        echo $this->img_uri($data);exit;
                    }else{
                        echo jsonOut(returnArr(400,'',''));exit;
                    }
                }
            }catch(\Exception $e){
                $res = array("code" => $e->getCode(), 'msg' => $e->getMessage());
                echo jsonOut(returnArr(400, $res, 'error'));exit;
            }
        }
    
    
        /*
         * 二进制转图片image/png
         * */
        public function img_uri($contents, $mime ="image/png")
        {
            $base64   = base64_encode($contents);
            return ('data:' . $mime . ';base64,' . $base64);
        }
    展开全文
  • 微信小程序生成二维码工具
  • 微信小程序生成二维码插件,可以直接生成 ,传入参数可以直接使用使用的canvas技术
  • 支付宝小程序生成二维码所需的文件,直接放在页面中引入即可使用,下面是我写的一篇博客有助于使用 https://blog.csdn.net/KingJordon/article/details/100104146
  • 微信小程序生成二维码demo
  • 小程序生成二维码名片分享朋友圈,
  • 小程序生成二维码的插件,现在小程序中引入qrcode.js,然后在页面里面创建一个canvas的html,通过 qrcode.api.draw(url, { ctx: my.createCanvasContext('myCanvas'), width: 200, height: 200 }) 来渲染二维码。
  • 主要介绍了微信小程序生成二维码的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 通过后台接口可以获取小程序任意页面的二维码,具体可以参考https://developers.weixin.qq.com/miniprogram/dev/api/qrcode.html可以选择你所需要的小程序码,给到后台相应的参数生成即可。这里说一下B接口的参数...

    一、如何生成小程序分享页面的二维码?

    通过后台接口可以获取小程序任意页面的二维码,具体可以参考https://developers.weixin.qq.com/miniprogram/dev/api/qrcode.html

    可以选择你所需要的小程序码,给到后台相应的参数生成即可。

    这里说一下B接口的参数scene,关于scene参数,小程序的解释如下:

    注意:通过该接口生成的小程序码,永久有效,数量暂无限制。用户扫描该码进入小程序后,开发者需在对应页面获取的码中 scene 字段的值,再做处理逻辑。使用如下代码可以获取到二维码中的 scene 字段的值。调试阶段可以使用开发工具的条件编译自定义参数 scene=xxxx 进行模拟,开发工具模拟时的 scene 的参数值需要进行 urlencode

    其实我理解的这个scene参数就是你要分享的那个页面的id,所以在你要分享的那个页面(也就是page参数)得做个逻辑判断,是否为二维码扫进去的

     

    可以使用这个编译工具帮助你测试,注意这个pages里面的页面必须是已经发布的小程序存在的页面。

    onLoad: function (options) {
        var that = this;
        if (options.id ) {
          that.setData({ id: options.id });
        } else {
          that.setData({ id: decodeURIComponent(options.scene) });
        }

    二、如何制作画布及分享朋友圈?

    小程序没有自带分享朋友圈的功能,因此需要自己把下载的二维码及你要分享的内容利用canvas绘制上去,画布转成图片后保存到相册,分享图片后通过长按二维码进入到相对应的页面。

    wxml里面画布布局,就随便简单写了个分享按钮。注意canvas布局的时候要定位到看不到的地方。

    <button class='share_quan' bindtap='share_quan'>分享朋友圈</button>
    <!-- 画布 -->
    <canvas  canvas-id="shareImg" style="width:600px;height:800px;"></canvas>
    <view hidden='{{hidden}}'>    
    <image src='{{imgurl}}'></image>
    <button  bindtap='save'>保存图片到相册</button>
    </view>

    1、下载图片,必须要通过wx.downloadFile()先把图片下载到本地,不然后面画不上去

    Page({
      data: {
        hidden: true,
        code: "",
        title: "",
        imgs:"",
        imgUrl:""
      },
    //我这里的imgurl是已经请求出来的图片路径。这里需要注意的是,img的域名如果是http的可能要改为https的,不然后面图片不会出来。
            wx.setStorage({ //数据存储下来,当时做这个需求时并没有存储,直接下载的图片去绘制的,但是电脑上可以出来,手机不能。所以就多了这一步,有点坑
              key: "key",
              data: that.data.imgUrl,
              success:function(res){
                // 下载图片
                wx.downloadFile({
                  url: that.data.imgUrl,
                  success: function (res) {
                    console.log('我是下载的图片:' + res.tempFilePath);
                    that.setData({
                      imgs: res.tempFilePath  
                    })
                  }
                })
              }
            })

    2、下载二维码

     // 下载二维码
            wx.downloadFile({
              url: '二维码接口scene=id&page=pages/index/index',//下载的二维码的地址和参数
              success: function (res) {
                that.setData({
                  code: res.tempFilePath  
                })
              },
              fail: function (res) {
              }
            })

    3、有了图片和二维码之后,就是绘制画布了

     // canvas绘制文字和图片
          const ctx = wx.createCanvasContext('shareImg');
          ctx.drawImage(that.data.code, 210, 525, 115, 145); //绘制二维码
          ctx.drawImage(that.data.imgs, 90, 50, 380, 350);  //绘制图片
          ctx.setTextAlign('center')                        
          ctx.setFillStyle('black')                      
          ctx.setFontSize(28)                              
          ctx.fillText("我是文字部分....", 600 / 2, 450,600)
          ctx.setFillStyle('gray') 
          ctx.fillText("长按二维码....", 600/2, 740)
          ctx.stroke()
          ctx.draw()

    4、画布生成图片

    share_quan: function () { //点击分享朋友圈,画布生成图片
        var that = this;
        wx.showLoading({
          title: '图片正在生成中...'
        })
        setTimeout(function () {  //这里要加定时器,转成图片需要一定的时间,不然是不出来图片的哦
          // canvas画布转成图片
          wx.canvasToTempFilePath({
            x: 0,
            y: 0,
            width: 600,
            height: 800,
            destWidth: 480,
            destHeight: 550,
            canvasId: 'shareImg',
            fileType: 'jpg' ,  //这里为图片格式,最好改为jpg,如果png的话,图片存到手机可能有黑色背景部分
            success: function (res) {
              that.setData({
                imgurl: res.tempFilePath,
                hidden: false    
              })
              wx.hideLoading()
            },
            fail: function () {
              console.log("保存失败......")
            }
          })
        }, 2000)
      },

    5、点击保存到相册

      save: function () {
        var that = this
        wx.saveImageToPhotosAlbum({
          filePath: that.data.imgurl,
          success(res) {
            wx.showModal({
              content: '图片已保存到相册',
              showCancel: false,
              confirmText: '好的',
              success: function (res) {
                if (res.confirm) {
                  console.log('用户确定了');
                  that.setData({
                    hidden: true
                  })
                }
              }
            })
          },
      },

    这上面的画布大小自己和那些文字以及图片的位置根据需求定,生成的图片大小也一样

    展开全文
  • 小程序生成二维码和条形码。。。。。。。。。。。。。。。。
  • 小程序生成二维码并且把二进制流转换图片
  • 微信小程序生成二维码js

    千次阅读 2019-04-24 12:21:53
    微信小程序生成二维码js 参考:https://github.com/tomfriwel/weapp-qrcode 最新的二维码工具:https://github.com/KeeeX/qrcodejs 1、通过canvas的id来绘制二维码: 效果图:(单位是px,所以小程序的rpx要...

    hao

     

    微信小程序生成二维码js

    参考:https://github.com/tomfriwel/weapp-qrcode

    最新的二维码工具:https://github.com/KeeeX/qrcodejs

    1、通过canvas的id来绘制二维码:

                效果图:(单位是px,所以小程序的rpx要进行转换px)
        
                                                  1s
        二维码计算工具:
        /*********************************************   使用的是canvas的id,绘制在整个canvas上,包括导出图片*********************************************************************** */

          weapp-qrcode.js 下载使用

    QRCode = function (canvasId, vOption) {
    	this._htOption = {
    		width: 256,
    		height: 256,
    		typeNumber: 4,
    		colorDark: "#000000",
    		colorLight: "#ffffff",
    		correctLevel: QRErrorCorrectLevel.H
    	};
    
    	if (typeof vOption === 'string') {
    		vOption = {
    			text: vOption
    		};
    	}
    
    	// Overwrites options
    	if (vOption) {
    		for (var i in vOption) {
    			this._htOption[i] = vOption[i];
    		}
    	}
    
    	this._oQRCode = null;
    	this.canvasId = canvasId
    
    	if (this._htOption.text && this.canvasId) {
    		this.makeCode(this._htOption.text);
    	}
    };
    //创建二维码code
    QRCode.prototype.makeCode = function (sText, callback) {
    	this._oQRCode = new QRCodeModel(_getTypeNumber(sText, this._htOption.correctLevel), this._htOption.correctLevel);
    	this._oQRCode.addData(sText);
    	this._oQRCode.make();
    	this.makeImage(callback);
    };
    //创建二维码图片
    QRCode.prototype.makeImage = function (callback) {
    	var _oContext
    	if (this._htOption.usingIn) {
    		_oContext = wx.createCanvasContext(this.canvasId, this._htOption.usingIn)
    	}
    	else {
    		_oContext = wx.createCanvasContext(this.canvasId)
    	}
    	var _htOption = this._htOption;
    	var oQRCode = this._oQRCode
    
    	var nCount = oQRCode.getModuleCount();
    	var nWidth = _htOption.width / nCount;
    	var nHeight = _htOption.height / nCount;
    	var nRoundedWidth = Math.round(nWidth);
    	var nRoundedHeight = Math.round(nHeight);
    
    	for (var row = 0; row < nCount; row++) {
    		for (var col = 0; col < nCount; col++) {
    			var bIsDark = oQRCode.isDark(row, col);
    			var nLeft = col * nWidth;
    			var nTop = row * nHeight;
    			_oContext.setStrokeStyle(bIsDark ? _htOption.colorDark : _htOption.colorLight)
    			// _oContext.setStrokeStyle('yellow')
    			_oContext.setLineWidth(1)
    			_oContext.setFillStyle(bIsDark ? _htOption.colorDark : _htOption.colorLight)
    			// _oContext.setFillStyle('red')
    			// if (bIsDark) {
    			_oContext.fillRect(nLeft, nTop, nWidth, nHeight);
    			// }
    
    			// 안티 앨리어싱 방지 처리
    			// if (bIsDark) {
    			_oContext.strokeRect(
    				Math.floor(nLeft) + 0.5,
    				Math.floor(nTop) + 0.5,
    				nRoundedWidth,
    				nRoundedHeight
    			);
    
    			_oContext.strokeRect(
    				Math.ceil(nLeft) - 0.5,
    				Math.ceil(nTop) - 0.5,
    				nRoundedWidth,
    				nRoundedHeight
    			);
    			// }
    			// _oContext.fillRect(
    			//     Math.floor(nLeft) + 0.5,
    			//     Math.floor(nTop) + 0.5,
    			//     nRoundedWidth,
    			//     nRoundedHeight
    			// );
    			// _oContext.fillRect(
    			//     Math.ceil(nLeft) - 0.5,
    			//     Math.ceil(nTop) - 0.5,
    			//     nRoundedWidth,
    			//     nRoundedHeight
    			// );
    			// _oContext.clearRect(
    			//     Math.floor(nLeft) + 0.5,
    			//     Math.floor(nTop) + 0.5,
    			//     nRoundedWidth,
    			//     nRoundedHeight
    			// );
    			// _oContext.clearRect(
    			//     Math.ceil(nLeft) - 0.5,
    			//     Math.ceil(nTop) - 0.5,
    			//     nRoundedWidth,
    			//     nRoundedHeight
    			// );
    		}
    	}
    
       //二维码中间的logo(计算位置并绘制)
    	if (_htOption.image && _htOption.image != '') {
    	  _oContext.drawImage(_htOption.image, 0 + (_htOption.width - _htOption.width / 4) / 2, 0 + (_htOption.height - _htOption.height/4)/2, _htOption.width/4, _htOption.height/4)
    	}
    
    	_oContext.draw(false, callback)
    };
    
    // 保存为图片,将临时路径传给回调
    QRCode.prototype.exportImage = function (callback) {
    	if (!callback) {
    		return
    	}
    	wx.canvasToTempFilePath({
    		x: 0,
    		y: 0,
    		width: this._htOption.width,
    		height: this._htOption.height,
    		destWidth: this._htOption.width,
    		destHeight: this._htOption.height,
    		canvasId: this.canvasId,
    		success: function (res) {
    			callback(res.tempFilePath)
    		},
    		fail:res=>{
    			console.log(res)
    		}
    	})
    }
    
    QRCode.CorrectLevel = QRErrorCorrectLevel;
    

        
        生成二维码:
        

    <canvas class='canvas' style="width:{{120}}px; height:{{120}}px;" canvas-id='canvas'></canvas>
    
    .canvas{
      position: absolute;
      top: 200rpx;
      left: 240rpx;
    }
    
    var QRCode = require('../../../utils/weapp-qrcode.js')
    
    let that = this;
    new QRCode('canvas', {
      // usingIn: this,
      text: "漠天,技术开发,主要涉及android、weex、微信小程序、flutter、java等等",
      image: that.data.userIcon,
      width: 120,
      height: 120,
      colorDark: "#1CA4FC",
      colorLight: "white",
      correctLevel: QRCode.CorrectLevel.H,
    });
    


        
        
    2、通过canvas的context来绘制二维码:

        效果图:
        
                                                                    2s
        
        二维码计算工具:
                 /*********************************************   使用的是canvas的context对象,绘制在canvas的固定位置*********************************************************************** */

            weapp-qrcode.js 下载使用

     /*********************************************   使用的是canvas的context对象,绘制在canvas的固定位置*********************************************************************** */
    
    // QRCode object(传入canvas的context用来绘制,适用于在 canvas上某一部分绘制,在调用后  自己canvas.draw)
    QRCode = function (contextCanvas, vOption) {
    this._htOption = {
      width: 256,
      height: 256,
      typeNumber: 4,
      colorDark: "#000000",
      colorLight: "#ffffff",
      correctLevel: QRErrorCorrectLevel.H
    };
    
    if (typeof vOption === 'string') {
      vOption = {
    	text: vOption
      };
    }
    
    //   // Overwrites options
    if (vOption) {
      for (var i in vOption) {
    	this._htOption[i] = vOption[i];
      }
    }
    
    this._oQRCode = null;
    this.contextCanvas = contextCanvas
    
    if (this._htOption.text && this.contextCanvas) {
      this.makeCodeCanvas(this._htOption.text);
    }
    };
    
    //创建二维码code
    QRCode.prototype.makeCodeCanvas = function (sText, callback) {
    this._oQRCode = new QRCodeModel(_getTypeNumber(sText, this._htOption.correctLevel), this._htOption.correctLevel);
    this._oQRCode.addData(sText);
    this._oQRCode.make();
    this.makeImageCanvas(callback);
    };
    
    //创建二维码图片
    QRCode.prototype.makeImageCanvas = function (callback) {
    var _htOption = this._htOption;
    var oQRCode = this._oQRCode
    
    var nCount = oQRCode.getModuleCount();
    var nWidth = _htOption.width / nCount;
    var nHeight = _htOption.height / nCount;
    var nRoundedWidth = Math.round(nWidth);
    var nRoundedHeight = Math.round(nHeight);
    
    for (var row = 0; row < nCount; row++) {
      for (var col = 0; col < nCount; col++) {
    	var bIsDark = oQRCode.isDark(row, col);
    	var nLeft = _htOption.startX + col * nWidth;
    	var nTop = _htOption.startY + row * nHeight;
    	this.contextCanvas.setStrokeStyle(bIsDark ? _htOption.colorDark : _htOption.colorLight)
    	// _oContext.setStrokeStyle('yellow')
    	this.contextCanvas.setLineWidth(1)
    	this.contextCanvas.setFillStyle(bIsDark ? _htOption.colorDark : _htOption.colorLight)
    	// _oContext.setFillStyle('red')
    	// if (bIsDark) {
    	this.contextCanvas.fillRect(nLeft, nTop, nWidth, nHeight);
    	// }
    
    	// if (bIsDark) {
    	this.contextCanvas.strokeRect(
    	  Math.floor(nLeft) + 0.5,
    	  Math.floor(nTop) + 0.5,
    	  nRoundedWidth,
    	  nRoundedHeight
    	);
    
    	this.contextCanvas.strokeRect(
    	  Math.ceil(nLeft) - 0.5,
    	  Math.ceil(nTop) - 0.5,
    	  nRoundedWidth,
    	  nRoundedHeight
    	);
      }
      // _oContext.fillRect(
      //     Math.floor(nLeft) + 0.5,
      //     Math.floor(nTop) + 0.5,
      //     nRoundedWidth,
      //     nRoundedHeight
      // );
      // _oContext.fillRect(
      //     Math.ceil(nLeft) - 0.5,
      //     Math.ceil(nTop) - 0.5,
      //     nRoundedWidth,
      //     nRoundedHeight
      // );
      // _oContext.clearRect(
      //     Math.floor(nLeft) + 0.5,
      //     Math.floor(nTop) + 0.5,
      //     nRoundedWidth,
      //     nRoundedHeight
      // );
      // _oContext.clearRect(
      //     Math.ceil(nLeft) - 0.5,
      //     Math.ceil(nTop) - 0.5,
      //     nRoundedWidth,
      //     nRoundedHeight
      // );
      //   }
    }
    
    //二维码中间的logo(计算位置并绘制)
    if (_htOption.image && _htOption.image != '') {
      this.contextCanvas.drawImage(_htOption.image, _htOption.startX + (_htOption.width - _htOption.width / 4) / 2, _htOption.startY + (_htOption.height - _htOption.height / 4) / 2, _htOption.width / 4, _htOption.height / 4)
    }
    
    };
    
    QRCode.CorrectLevel = QRErrorCorrectLevel;
    


        
        生成二维码:
        

     <canvas style="margin-top:30rpx;width:{{windowWidth/10*9}}px;height:{{windowHeight/10*9}}px;  image-rendering: pixelated" canvas-id="qrResultCanvas" bindlongtap="saveCanvasImage"></canvas>
    
    var QRCode = require('../../../utils/weapp-qrcode.js')
    
      /**
       * 页面的初始数据
       */
      data: {
    	userIcon:'',//用户头像
    	windowWidth: '',//屏幕的宽度
    	windowHeight: '',//屏幕的高度
      },
      
      
    	/**
       * 生命周期函数--监听页面加载
       */
      onLoad: function (options) {
    	let that = this;
    	//获取微信系统信息
    	wx.getSystemInfo({
    	  success: function (systemInfo) {
    		that.setData({
    		  windowWidth: systemInfo.windowWidth,
    		  windowHeight: systemInfo.windowHeight,
    		})
    	  }
    	})
      }
    
    // 使用 wx.createContext 获取绘图上下文 context
    const context = wx.createCanvasContext('qrResultCanvas')
    
    new QRCode(context, {
      // usingIn: this,
      text: "漠天,技术开发,主要涉及android、weex、微信小程序、flutter、java等等",
      image: that.data.userIcon,
      width: 90,
      height: 90,
      startX: that.data.windowWidth / 10 * 6-30 ,
      startY: that.data.windowHeight / 10 * 7-20,
      colorDark: "#1CA4FC",
      colorLight: "white",
      correctLevel: QRCode.CorrectLevel.H,
    });
    
    context.draw()

     

    weapp-qrcode.js 下载使用

    展开全文
  • 小程序生成二维码400 错误

    千次阅读 2018-09-26 15:08:57
    小程序生成二维码400 错误 小程序生成二维码官方文档其实很简单,就在这里,我在这里使用的是接口B:适用于需要的码数量几多的业务场景,其中的参数如下图所示: 在这里,写接口可能会报400错误,也就是说参数...
  • 微信小程序生成二维码接口调用

    千次阅读 2018-11-21 15:36:37
    小程序生成二维码这个接口可以在小程序里面做, 也可以在java后台做, 此篇博客记录的是在java后台请求微信的接口生成; 场景: 如果要生成带参数二维码拿出去做裂变推广, 生成的二维码数量多. 此时不可能一个个通过...
  • 但是不能发朋友圈,若是想发到朋友圈,采取的办法是一件生成海报,这样就产生了一个需求了,那就是小程序生成二维码海报的要求。如果是自己写的话,那肯定是要花费一番精力,这个时候要是有一款开源组件直接用那就好...
  • 调用方法在小程序canvas 海报指定位置生成二维码 ,使用引入var QR = require("../../../utils/qrcode.js"); 调用QR.api.draw(lefts.data.url, ctx, 141 / 2 * w, 141 / 2 * w, lefts, false, 87 / 2 * w, 591 / 2 *...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,165
精华内容 11,266
关键字:

小程序生成二维码