美文网首页微信小程序开发微信小程序微信小程序开发者
微信小程序之生成自定义参数小程序二维码

微信小程序之生成自定义参数小程序二维码

作者: 一斤代码 | 来源:发表于2017-11-29 22:08 被阅读1826次

扫码已经成为一种常见又方便的进入移动应用的途径,可以把线上线下的用户流量带入你的移动应用中来。微信小程序也提供了扫码进入的功能,可以通过扫描二维码或者微信小程序专有的小程序码,进入到相应的小程序页面。

微信官方提供了3个不同的REST API用于生成带参数的小程序码或者二维码,可在扫码后进入指定的小程序页面,其中接口A和C能生成的图片总数量有限制(10万张),对于那种需要生成大量二维码的使用场景(比如为每个订单生成一个二维码、餐厅的每张餐桌生成一个二维码等)是远远不能满足需求的。而接口B可以解决这个问题,我们这次主要来看一下如何使用这个接口。

总体的思路是:在我们的后端开发一个API,在其中调用微信的二维码接口,调用成功后会得到二维码图片的二进制流,最后将这个二进制流输出到前台。

以下步骤中的后端代码是基于Node.js进行编写,并使用了Koa 2框架。代码仅供参考。

步骤1:获取重要参数access_token

调用获取小程序二维码的REST API需要一个很重要的参数:access_token,这是用于获取微信公众平台API访问权限的重要参数,做过微信公众号HTML5开发的朋友对其肯定非常熟悉。没接触过的话,可以看一下微信公众平台的文档

调用微信公众平台的API,已经有很多成熟的开源SDK可以使用,从Github上可以搜到很多不同语言实现的SDK。由于我用的是Node.js开发,所以使用了co-wechat-api

以下是使用co-wechat-api来获取access_token的基本用法:

const WechatAPI = require('co-wechat-api')

const wxAppAPI = new WechatAPI('小程序的app id', '小程序的app secret')
const token = await wxAppAPI.ensureAccessToken()

console.log(token.accessToken)

步骤2:拼接url,发送请求获取二维码图片

const fs = require('fs')
const axios = require('axios')

// 拼接url
const url = `https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=${token.accessToken}`

// 发送POST请求
const response = await axios.post(url, {
  page: '小程序中Page的路径',
  scene: '自定义参数,格式你自己决定'
}, { responseType: 'stream' })

// 将请求结果中的二进制流写入到本地文件qrcode.png
response.data.pipe(fs.createWriteStream('qrcode.png'))

在上面的代码中,我们将access_token作为query string参数拼接到url上,然后向这个url发送POST请求,传递的参数主要是pagescene,其中page参数是扫码后进入的小程序页面路径(比如pages/index/index,并且不能携带参数),而scene则传入的是我们的自定义参数。

其实经过这一步,你就已经可以在你的磁盘上找到这张小程序码的图片了,用微信扫一下这张图片,就能进入你的小程序页面。

步骤3:将二维码图片输出

虽然我们已经获取到了小程序码图片,但是现在它还只是躺在我们的服务器端。而通常实际情况是,我们需要在小程序页面上去显示这张图片,让用户去保存和分享它。因此,我们需要把这张图片通过我们的API进行输出。以下是基于koa 2的示例代码:

const fs = require('fs')
const Router = require('koa-router')
const router = new Router()

router.get('/wx/common/qrcode', async (ctx) => {
  const stream = fs.createReadStream(‘qrcode.png’)
  ctx.body = stream
})

步骤4:在小程序中显示

在小程序中显示该图片就非常简单了,直接使用<image>组件来进行展示:

  <image src="https://your-domain.com/wx/common/qrcode" style="width:200px;height:200px"></image>

附录:稍微完备一些的服务端代码

上面4个步骤中给出的示例代码只是为了配合说明各个步骤,代码比较简陋,下面是经过稍微的组织过的代码,供参考:

  • 路由部分的代码:
const Router = require('koa-router')
const PassThrough = require('stream').PassThrough;
const wxapi = require('../services/wxapi')
const router = new Router()

router.get('/wx/common/qrcode', async (ctx) => {
  const stream = await wxapi.getWxaCodeUnlimit({
    page: 'pages/profile/profile',
    scene: 'abc123'
  })
  ctx.body = stream.pipe(PassThrough())
})
  • Service部分的代码:
const fs = require('fs')
const path = require('path')
const crypto = require('crypto')
const bluebird = require('bluebird')
const axios = require('axios')
const WechatAPI = require('co-wechat-api')

const wxAppAPI = new WechatAPI('小程序的app id', '小程序的app secret')

function sha1(message) {
  return crypto.createHash('sha1').update(message, 'utf8').digest('hex')
}

module.exports = {

  async getWxaCodeUnlimit({ page, scene }) {
    // 图片文件名使用page和scene等数据生成Hash
    // 以避免重复生成内容相同的小程序码
    const fileName = sha1(page + scene)
    const filePath = path.join(__dirname, `../../qrcode/${fileName}.png`)

    let readable

    try {
      // 检测该名字的小程序码图片文件是否已存在
      await bluebird.promisify(fs.access)(filePath, fs.constants.R_OK);
      readable = fs.createReadStream(filePath)
    } catch (e) {
      // 小程序码不存在,则创建一张新的
      const token = await wxAppAPI.ensureAccessToken()
      const response = await axios({
        method: 'post',
        url: 'https://api.weixin.qq.com/wxa/getwxacodeunlimit',
        responseType: 'stream',
        params: { access_token: token.accessToken },
        data: { page, scene }
      })
      readable = response.data
      readable.pipe(fs.createWriteStream(filePath))
    }

    // 返回该小程序码图片的文件流
    return readable
  }

}

祝大家开发出更好的小程序!

相关文章

  • 微信带参小程序码测试方法

    一款微信小程序带参数二维码生成工具,可模拟测试分享卡片、公众号小程序链接、小程序码带参数跳转至小程序。 在线 De...

  • 微信小程序获取query.scene问题

    生成自定义微信小程序二维码时,往scene里传的参数需要在onLoad里获取。微信小游戏是在onShow方法获取。...

  • uniapp定制小程序码+海报

    需求 1.生成微信小程序自定义参数二维码2.将二维码拼接背景图生成活动海报保存至相册 文末已发布代码,有需要请自行...

  • 小程序动态生成带参数的二维码

    前景 最近用 taro 搞小程序要动态生成二维码,需要加二维码里面添加不同的参数,看了一下微信小程序码提供的几种方...

  • 微信小程序码

    获取小程序码 接口b 通过该接口生成的小程序码,永久有效,数量暂无限制。 PHP微信小程序生成带参二维码getwx...

  • 小程序生成小程序码或二维码

    微信提供3种接口: B、生成首页小程序码,无个数限制A、生成任意页面小程序码,有个数限制C、生成二维码,有个数限制...

  • 微信小程序资料集(中)

    12月1日小程序Demo集合 微信小程序Demo:金融理财计算器 微信小程序Demo:支付宝+微信二维码收款小程序...

  • java微信小程序参数二维码生成带背景图加字体(无限生成)

    java微信小程序参数二维码生成带背景图加字体开发教程: 需求 : 1,因为项目需求 ,生成数以万计的二维码 2 ...

  • 微信小程序之十:分享

    分享代码 分享注意事项 分享小程序二维码开发流程 二维码调用的接口,请阅读 ‘微信小程序之九:二维码’ 微信扫码...

  • 小程序canvas 遇到的一些坑

    最近公司要实现小程序端生成海报,用到了小程序码,商品图,自定义背景,用户头像二维码等 由于一直用的微信开发者工具开...

网友评论

  • 切图仔_Howe:楼主我想请教下,在h5生成小程序的菊花码,是让后台生成吗?需要给参数给后台吗?h5的公众号和小程序所在的公众号需要是同一个吗?
    一斤代码:可以是不同的公众号,可以申请将公众号绑定某个小程序。
    一斤代码:小程序菊花码是后台生成的,如果需要前台传入不同参数生成不同的码的话(比如为每篇文章生成一个码),则在调用后台api的时候前端需要传入参数,让后端根据参数来生成。
  • 来之星星的欧巴:我想问的是可以不保存这么多图片在服务端吗,直接返回图片数据到前端可以吗
    来之星星的欧巴:@一斤代码 另外服务端保存图片多了,岂不是要定期去清理
    来之星星的欧巴:@一斤代码 直接返回图片数据,貌似画布又画不了图片
    一斤代码:当然可以。将图片保存在服务器是为了减少每次都重新生成图片的工作。
  • 9cf49b1d7929:什么项目 ,还引入vue来做。
    一斤代码:额,这里没有Vue啊。。。
  • 地球上的石榴:你好 ,我想到OC项目中 根据不同的商品生成不同的小程序路径的二维码 可以实现? 还是说二维码只能通过后台 调用文档规定的那个东西 生成后 返回给我们
    地球上的石榴:@一斤代码 谢谢了,让后台给个接口返回他们生成的二维码了
    一斤代码:你是想直接在OC前端生成是么?这个目前看来是不可行,需要调用后台的那个rest api来生成。
  • 金逸凌云:大神,有个问题,就是在开发调试的时候,扫描生成的二维码默认是打开线上的小程序版本,而不会打开我的开发版,这样带来的问题就是,我只能提审后才能扫码测试吗?有相应的解决方案吗
    金逸凌云:@一斤代码 麻烦看下我的帖子,我那样模拟出来的有错误吗
    一斤代码:开发的时候,可以用开发工具的自定义条件编译,扫预览生成的二维码,进行模拟测试。
    金逸凌云:我在开发者论坛详细描述了我遇到的问题,麻烦大神帮忙看下了
    https://developers.weixin.qq.com/blogdetail?action=get_post_info&lang=zh_CN&token=1168637974&docid=36743bf4a156f5b4c272d6a3804a1c2e
  • 金逸凌云:楼主,现在公司让研究个新需求,App分享出来到微信中,直接可以打开小程序,我网上找了些资源,写的都不够清楚,麻烦您有空看看能不能分享一篇:smiley: :smiley:
    d930f9d36831:楼主大神与其他朋友有没有分享新人入门借助阿里云操作实现一些小程序在微信公众号的?
    金逸凌云:@一斤代码 好的,谢谢:clap:
    一斤代码:这里是官方文档:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317332&token=&lang=zh_CN

本文标题:微信小程序之生成自定义参数小程序二维码

本文链接:https://www.haomeiwen.com/subject/gchubxtx.html