收藏
回答

使用getUnlimited小程序码的buffer 获取后 保存为图片提示格式不支持 ?

async getAccessToken() {
    return new Promise(async(resolve, reject) => {
      const model = think.model('mp_weixin');
      const sqlToken = await model.find();
      const expTime = (new Date()).getTime() + 7200000;
      if (!sqlToken.exp_time || (sqlToken.exp_time && parseInt(sqlToken.exp_time) < expTime)) {
        const url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${config.weixin.appid}&secret=${config.weixin.secret}`;
        const result = await request(url, { method: 'GET' });
        if (result && result.statusCode === 200) {
          const data = typeof result.body === 'string' ? JSON.parse(result.body) : result.body;
          const params = { ...data, exp_time: expTime };
          // 保存access_token
          if (!sqlToken.id) {
            // 新增
            model.add(params);
          } else {
            // 更新
            model.where({id: sqlToken.id}).update(params);
          }
          resolve(data);
        }
      } else {
        resolve(sqlToken);
      }
    });
  }
  async getQrCode(goodsId, accessToken) {
    return new Promise(async(resolve, reject) => {
      const url = `https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=${accessToken}`;
      var postData = {
        path: 'pages/goods/goods'// 二维码默认打开小程序页面
        scene: encodeURI(`id=${goodsId}`),
        width: 200,
        is_hyaline: true
      };
      const result = await request(url, {
        method: 'POST',
        headers: {
          'Content-Type''application/json'
        },
        data: JSON.stringify(postData)
      });
      if (result && result.statusCode === 200) {
        resolve(result.body);
      } else {
        reject(result);
      }
    });
  }
  async qrcodePosterAction() {
    const goodsId = this.get('goods_id');
    const accesssToken = await this.getAccessToken();
    const qrCode = await this.getQrCode(goodsId, accesssToken.access_token);
    const qrcodeBuffer = Buffer.from(qrCode, 'base64');
    // const steam = fs.createWriteStream(qrcodeBuffer);
    console.log(qrcodeBuffer, qrcodeBuffer.length, '//////////qrcodeBuffer');
    // 通过流 将文件传至oss
    // const ossutil = think.service('ossutil', 'api');
    // const result = await ossutil.putByStream(`/qrcodes/qrcode_${(new Date()).getTime()}.jpeg`, steam);


    // 测试读取文件buffer 并重新写入文件,图片文件正常
    // const bf = fs.readFileSync(`${think.ROOT_PATH}/www/static/user/avatar/1.jpg`);
    // const str = bf.toString('base64');
    // const bas64 = Buffer.from(qrcodeBuffer, 'base64');
    // console.log(bas64, bas64.length, '//bs');
    // console.log(bf, '/bf');
    // console.log(str, '/str');


    // console.log(bas64, '/////////bf2');
    // // // 二维码图片不正确,无法打开 待处理
    fs.writeFileSync(`${think.ROOT_PATH}/www/static/qrcode_${new Date().getTime()}.png`, qrcodeBuffer, (error) => {
      console.log(error, '///////e');
    });

  }
回答关注问题邀请回答
收藏

2 个回答

  • Mr.Zhao
    Mr.Zhao
    2021-07-04

    二维码接口不一定返回图片,没做判断

    2021-07-04
    有用 1
    回复 6
    • Flynn
      Flynn
      发表于移动端
      2021-07-04
      意思是buffer内容不一定是图片? 根据什么判断呢 我看官方api没有其他说明呢
      2021-07-04
      回复
    • Mr.Zhao
      Mr.Zhao
      2021-07-04回复Flynn
      判断response的content-type
      2021-07-04
      回复
    • Flynn
      Flynn
      2021-07-04回复Mr.Zhao
      这里是没加判断 我注意加上 但是 数据返回的是图片数据 同样通过fs创建的文件无法正常预览
      2021-07-04
      回复
    • Flynn
      Flynn
      2021-07-04回复Mr.Zhao
      有一个地方  就是 content-type 是image/jpeg 但是返回的数据我是取透明背景的 所以返回数据我看是png开头的 这个应该不影响吧
      2021-07-04
      回复
    • Mr.Zhao
      Mr.Zhao
      2021-07-04回复Flynn
      如果是图片  request 请求的时候options填上encoding:null ,就是不编码,直接获取buffer,然后转图片,你去github看看说明。
      2021-07-04
      1
      回复
    查看更多(1)
  • Flynn
    Flynn
    2021-07-04

    这是think.js 做服务端 还请各位大佬解惑

    2021-07-04
    有用
    回复
登录 后发表内容