Files
soul/app/api/miniprogram/qrcode/route.ts
卡若 afa8c59376 feat: 海报优化+小程序码生成API
1. 阅读页&推广中心海报去掉邀请码
2. 新增小程序码生成API(带推荐人ID参数)
3. 海报使用真实小程序码(扫码绑定推荐关系)
4. 修复章节数据库同步
2026-01-25 21:04:31 +08:00

78 lines
2.3 KiB
TypeScript

// app/api/miniprogram/qrcode/route.ts
// 生成带参数的小程序码 - 绑定推荐人ID
import { NextRequest, NextResponse } from 'next/server'
const APPID = process.env.WECHAT_APPID || 'wxb8bbb2b10dec74aa'
const APPSECRET = process.env.WECHAT_APPSECRET || '25b7e7fdb7998e5107e242ebb6ddabd0'
// 获取access_token
async function getAccessToken() {
const url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${APPID}&secret=${APPSECRET}`
const res = await fetch(url)
const data = await res.json()
if (data.access_token) {
return data.access_token
}
throw new Error(data.errmsg || '获取access_token失败')
}
export async function POST(req: NextRequest) {
try {
const { scene, page, width = 280 } = await req.json()
if (!scene) {
return NextResponse.json({ error: '缺少scene参数' }, { status: 400 })
}
// 获取access_token
const accessToken = await getAccessToken()
// 生成小程序码
const qrcodeUrl = `https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=${accessToken}`
const qrcodeRes = await fetch(qrcodeUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
scene: scene.slice(0, 32), // 最多32个字符
page: page || 'pages/index/index',
width,
auto_color: false,
line_color: { r: 0, g: 206, b: 209 },
is_hyaline: false
})
})
// 检查响应类型
const contentType = qrcodeRes.headers.get('content-type')
if (contentType?.includes('application/json')) {
// 返回了错误信息
const errorData = await qrcodeRes.json()
console.error('[QRCode] 生成失败:', errorData)
return NextResponse.json({
error: errorData.errmsg || '生成小程序码失败',
errcode: errorData.errcode
}, { status: 500 })
}
// 返回图片
const imageBuffer = await qrcodeRes.arrayBuffer()
const base64 = Buffer.from(imageBuffer).toString('base64')
return NextResponse.json({
success: true,
image: `data:image/png;base64,${base64}`
})
} catch (error) {
console.error('[QRCode] Error:', error)
return NextResponse.json(
{ error: '生成小程序码失败' },
{ status: 500 }
)
}
}