введение
В последнее время возникла необходимость сгенерировать много мелких программных кодов.Сгенерированные небольшие программные коды нужно встроить в заданный шаблон изображения, поэтому я пошла искать колеса, но подходящего колеса не нашла. . В отчаянии я решил пойти на один. Теперь он закончен и выпущен в npm.
Гитхаб:GitHub.com/Jon-mill en T…
нужно
Как показано ниже
- Сгенерировать QR-код апплета с параметрами
- Указание размера и положения на чертеже-шаблоне
- Создание нескольких листов в пакетах
начать работать
Сгенерировать QR-код апплета с параметрами
В официальной документации указаны три режима генерации QR-кодов для небольших программ.
-
createWXAQRCode
Получать小程序二维码
, который подходит для бизнес-сценариев, требующих небольшого количества кодов. Код мини-программы, сгенерированный через этот интерфейс, действует постоянно и ограничен в количестве.Официальное описание -
getWXACode
Получать小程序码
, который подходит для бизнес-сценариев, требующих небольшого количества кодов. Код мини-программы, сгенерированный через этот интерфейс, действует постоянно и ограничен в количестве.Официальное описание -
getWXACodeUnlimit
Получать小程序码
, который подходит для бизнес-сценариев, требующих большого количества кодов. Код апплета, сгенерированный через этот интерфейс, действителен постоянно, а его количество временно не ограничено.Официальное описание
Эти интерфейсы должны пройти черезaccess_token
обменять. давайте сделаем класс
let AngerWechat = require('anger-wechat') // 微信操作辅助库(自己写的)
class miniQrcode {
// 存放三种模式的接口
constructor(config) {
this.mode = {
'getWXACode': 'https://api.weixin.qq.com/wxa/getwxacode',
'getWXACodeUnlimit': 'https://api.weixin.qq.com/wxa/getwxacodeunlimit',
'createWXAQRCode': 'https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode',
}
// 初始化微信辅助库
this.$wx = new AngerWechat({
appId: this.config.appId, // appId 必传
appSecret: this.config.appSecret, // appSecret 必传
})
// 临时数据存放文件,用于存放access_token,因为access_token有2个小时的生存期,避免重复获取
this.databasePath = path.join(__dirname, '../', 'database.json')
}
}
Реализовать основной метод
// 生成核心方法
async getWxQrcodeInfo(concatConfig){
// 获取已经存放的文件里的access_token,如果有的话并且有效的话就不用再掉接口
let innerDatabase = this.getDatabase()
// 如果本地的数据没有access_token 或者超过2个小时 就去请求获取
if(!innerDatabase.access_token || ((new Date().getTime() - innerDatabase.create_time) > 7200000) ) {
let accessInfo = await this.$wx.getGlobalAccessToken()
// 获取access_token然后写入文件
// 具体代码省略
}
// 获取到access_token去请求接口
let qrcodeInfo = await this.postMan(
this.getApiUrl(innerDatabase.access_token, concatConfig.mode), // 根据mode来区调用接口
concatConfig.config // 用户传的参数
)
let returnData = {
}
if(qrcodeInfo.type.indexOf('image') !== -1) { //类型是图片的就是获取成功了
// 请求成功 保存图片
returnData = {
code: 200,
image: qrcodeInfo.data,
error: null
}
} else {
returnData = {
code: 500,
error: JSON.stringify(qrcodeInfo.data.toString()),
image: null
}
}
return returnData
}
Давайте проверим это, когда оно будет написано
let qrocode = new miniQrcode({
appId: 'xxx',
appSecret: 'xxx'
});
let info = await qrocode.getWxQrcodeInfo({
mode: 'getWXACode',
config: {
path: `pages/index/main?id=123456`
},
})
fs.writeFileSync(`./output-juejin-test1.png`, info.image, 'utf8');
Эффект:
Как проверить параметры? Я добавил в этот опубликованный апплет пасхалку, то есть долгое нажатие红色圈出区域两次
Вы можете вызвать консоль, чтобы увидеть параметры
Синтезируйте QR-код в изображение шаблона
Эта операция зависит отsharp
библиотека
const sharp = require('sharp');
class miniSharp {
constructor(templateUrl){
this.templateUrl = templateUrl
}
// 重置图片大小
async resizeQrcode(imageBuffer, config){
return new Promise(resolve => {
sharp(imageBuffer).resize(config.width, config.width).toBuffer().then(function(outputBuffer) {
resolve(outputBuffer)
});
})
}
// 合并图片
async concatImage(buffer, config){
return new Promise(resolve => {
sharp(this.templateUrl)
.overlayWith(buffer, {
top: config.top,
left: config.left
}).toBuffer().then(function(outputBuffer) {
resolve(outputBuffer)
});
})
}
// 主函数
async renderImage(qrcodeBuffer, config){
let resizeQrcodeBuffer = await this.resizeQrcode(qrcodeBuffer, config)
let concatQrocdeBuffer = await this.concatImage(resizeQrcodeBuffer, config)
return concatQrocdeBuffer
}
}
module.exports = miniSharp
пройти тест
let qrocode = new miniQrcode({
appId: 'xxxx',
appSecret: 'xxx'
});
let mySharp = new miniSharp('./template.png');
let info = await qrocode.getWxQrcodeInfo({
mode: 'getWXACode',
config: {
path: `pages/index/main?id=123456`
},
})
let renderBuffer = await mySharp.renderImage(info.image, // 二维码图片的 buffer 数组
{
width: 200, // 重新设置二维码宽度
left: 362, // x轴偏移
top: 53 // y轴偏移
})
fs.writeFileSync(`./output-juejin-test1.png`, renderBuffer, 'utf8');
Пакетная обработка
В нормальных условиях серийное производство100
Чжан нуждается62.556秒
, в среднем каждый0.62556秒
, наверное нужно 10000 листов1.73小时
.Массовый пример кода
Об отладке
Используйте инструмент разработчика WeChat для отладки параметров моделирования
тестовый интерфейс
Здесь я предоставляю тестовый интерфейс, который может генерировать онлайн-код апплета с параметрами для отладки.
[get]
http://wx.toolos.cc
параметр
-
mode
Требуется один из [createWXAQRCode | getWXACode | getWXACodeUnlimit]
Уведомление
- Остальные параметры соответствуют вышеуказанным документам
mode
соответствующие параметры,path
илиpage
нужноencodeURIComponent
один раз - В настоящее время апплет имеет только один путь
pages/index/main
- Конфигурация онлайн-сервера низкая
Пример
http://wx.toolos.cc/?mode=createWXAQRCode&path=pages%2Findex%2Fmain
О режиме параметров
createWXAQRCode & getWXACode
Оба сгенерированные параметры для генерации ограниченного количества двумерного кода, параметры непосредственно после пути маршрута, например:
let info = await qrocode.getWxQrcodeInfo({
mode: 'createWXAQRCode',
config: {
page: `pages/index/main?sgr=521314&i=loveyou`
},
})
getWXACodeUnlimit
Это может генерировать неограниченное количество, но может содержать только ограниченные параметрыscene
, здесь рекомендуется аналитический методkey:value-key:value
let info = await qrocode.getWxQrcodeInfo({
mode: 'getWXACodeUnlimit',
config: {
page: `pages/index/main`,
scene: 'i:loveyou-sgr:521314'
},
})
Пример разбора
onLoad (query) {
// scene 需要使用 decodeURIComponent 才能获取到生成二维码时传入的 scene
this.scene = decodeURIComponent(query.scene)
this.queryJson = JSON.stringify(query)
// 尝试解析 scene 格式: shop:1-id:2
try {
let oneArr = this.scene.split('-')
let twoJson = {}
for(let i=0; i<oneArr.length; i++) {
let target = oneArr[i].split(':')
twoJson[target[0]] = target[1]
}
this.twoJson = JSON.stringify(twoJson)
} catch(e) {
this.twoJson = e
}
},
В инструментах разработчика, например, следующее моделирование