我请求scene值生成小程序码请求参数: {
scene: 'mdcp=NNMI3LY&wx=20040939&t=58404',
page: 'pages/tuangou/getcoupons/getcoupons',
env_version: 'release'
},但是每次生成小程序码解析后的scene是mdcp=UQYHHGG&wx=20040939&t=25412,这个是我之前生成的,这是什么原因呀?跪求大佬解释下?
'use strict'
;
const db = uniCloud.database()
const CONFIG = {
appid: '',
secret: '',
page: ''
}
const handleError = (message, details = null) => {
console.error(message, details);
return {
code: -1,
message,
details: details || ''
}
}
function generateRandomNumber() {
let result = '';
for(let i = 0; i < 13; i++) {
result += Math.floor(Math.random() * 10);
}
return result;
}
exports.main = async (event, context) => {
try {
if (!event.picihao || !event.wxcode) {
return handleError('缺少必要参数')
}
const cmd = db.command
const qrData = await db.collection('coupons-quuid')
.where({
use_branch: null,
use: 0,
picihao: event.picihao
})
.limit(1)
.get()
console.log('查询结果:', {
picihao: event.picihao,
hasData: !!qrData.data,
dataLength: qrData.data?.length,
firstRecord: qrData.data?.[0]
})
if (!qrData.data || qrData.data.length === 0) {
return handleError('没有可用的券数据')
}
const dbdata = qrData.data[0]
console.log("数据库查询结果:", {
quuid: dbdata.quuid,
picihao: event.picihao,
wxcode: event.wxcode
});
try {
const updateResult = await db.collection('coupons-quuid')
.doc(dbdata._id)
.update({
use_branch: event.use_branch || '',
use_time: formatDate(),
update_time: Date.now()
})
if (!updateResult.updated && !updateResult.affectedDocs) {
return handleError('更新数据失败')
}
console.log('更新成功:', updateResult)
const tokenResponse = await uniCloud.httpclient.request(
`https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${CONFIG.appid}&secret=${CONFIG.secret}&_t=${Date.now()}`,
{
dataType: 'json',
timeout: 10000,
headers: {
'Cache-Control': 'no-cache, no-store, must-revalidate',
'Pragma': 'no-cache',
'Expires': '0'
}
}
)
if (!tokenResponse.data?.access_token) {
throw new Error('获取access_token失败')
}
const randomNumber = generateRandomNumber();
const scene = `mdcp=${dbdata.quuid}&wx=${event.wxcode}&t=${randomNumber}`
if (scene.length > 32) {
console.warn('场景值超过32字符,将被截断')
}
const encodedScene = encodeURIComponent(scene.substr(0,32));
const wxacodeParams = {
scene: scene.substr(0,32),
page: CONFIG.page,
check_path: true,
env_version: "release",
width: 430,
is_hyaline: true
}
console.log("生成的scene参数:", {
原始scene: scene,
截断后scene: scene.substr(0,32),
URL编码后scene: encodedScene,
quuid: dbdata.quuid,
wxcode: event.wxcode,
随机数: randomNumber
});
console.log("生成小程序码请求参数:", {
scene: wxacodeParams.scene,
page: wxacodeParams.page,
env_version: wxacodeParams.env_version,
})
const codeResponse = await uniCloud.httpclient.request(
`https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=${tokenResponse.data.access_token}&_t=${Date.now()}`,
{
method: 'POST',
data: wxacodeParams,
headers: {
'content-type': 'application/json',
'Cache-Control': 'no-cache, no-store, must-revalidate',
'Pragma': 'no-cache',
'Expires': '0'
},
dataType: 'buffer',
timeout: 20000
}
)
if (codeResponse.status !== 200) {
console.error("微信接口返回错误:", codeResponse);
return handleError('微信接口返回错误');
}
console.log("返回的文件名:", codeResponse.headers['content-disposition']);
const contentType = codeResponse.headers['content-type']
console.log("2",contentType);
try {
if (!Buffer.isBuffer(codeResponse.data)) {
console.error("返回数据不是Buffer类型:", typeof codeResponse.data);
return handleError('返回数据格式错误');
}
let base64Image;
try {
base64Image = codeResponse.data.toString('base64');
} catch (e) {
console.error("Buffer转base64失败:", e);
return handleError('图片转换失败');
}
const mimeType = 'image/jpeg';
console.log("3", "转换成功,base64前100个字符:", base64Image.substring(0, 100));
console.log("3.1", "base64数据总长度:", base64Image.length);
return {
code: 0,
data: {
img: `data:${mimeType};base64,${base64Image}`,
code: dbdata,
scene: wxacodeParams.scene
}
}
} catch (error) {
console.error("转换base64失败:", error);
return handleError('生成小程序码失败', error.message);
}
} catch (err) {
console.error('更新失败:', err)
return handleError('数据更新失败', err.message)
}
} catch (error) {
console.error('执行错误:', error)
return handleError(error.message, error.stack)
}
}
function formatDate() {
const d = new Date()
const timestamp = d.getTime()
const beijingDate = new Date(timestamp + 8 * 60 * 60 * 1000)
return beijingDate.toISOString()
.replace('T', ' ')
.replace(/\.\d+Z$/, '')
}
用微信开发者工具解析生成小程序码,先确定是生成码错误还是小程序端解析小程序码逻辑问题.
1.可以采用 wx.getEnterOptionsSync 解决https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/miniapp/api/diffapi/getEnterOptionsSync.html
2.也可以onload获取scene之后,采用关闭当前页面,解决onload获取scene只执行一次的问题(例如redirectTo https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.redirectTo.html)
1.可以采用 wx.getEnterOptionsSync
https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/miniapp/api/diffapi/getEnterOptionsSync.html
2.也可以onload获取scene之后,采用关闭当前页面,解决onload获取scene只执行一次的问题(例如redirectTo
https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.redirectTo.html)
1.可以采用 wx.getEnterOptionsSync
2.也可以onload获取scene之后,采用关闭当前页面,解决onload获取scene只执行一次的问题
用小程序模拟器解析生成小程序码,先确定是生成码错误还是小程序端解析小程序码逻辑问题.
逻辑问题处理,
1.可以采用 wx.getEnterOptionsSync 解决https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/miniapp/api/diffapi/getEnterOptionsSync.html
2.也可以onload获取scene之后,采用关闭当前页面,解决onload获取scene只执行一次的问题(例如redirectTo https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.redirectTo.html)
生成小程序码用微信开发工具中解码下,确定是生成问题还是小程序解码时候逻辑问题.
逻辑问题处理,
1.可以采用 wx.getEnterOptionsSync 解决https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/miniapp/api/diffapi/getEnterOptionsSync.html
2.也可以onload获取scene之后,采用关闭当前页面,解决onload获取scene只执行一次的问题(例如redirectTo https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.redirectTo.html)