修复一些错误-待测试
This commit is contained in:
@@ -52,32 +52,6 @@
|
|||||||
"kuaishouConsumeShopId": "4269276762",
|
"kuaishouConsumeShopId": "4269276762",
|
||||||
"kuaishouConsumeShopName": "稚嫩游戏交易店",
|
"kuaishouConsumeShopName": "稚嫩游戏交易店",
|
||||||
"notes": "从 khhao 订单 2612400002308936 导入"
|
"notes": "从 khhao 订单 2612400002308936 导入"
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "套装-浪漫天命",
|
|
||||||
"enabled": false,
|
|
||||||
"priority": 100,
|
|
||||||
"provider": "khhao",
|
|
||||||
"platform": "kuaishou",
|
|
||||||
"shopId": "4269276762",
|
|
||||||
"khhaoShopId": "10",
|
|
||||||
"internalSkuCode": "套装-浪漫天命",
|
|
||||||
"internalSkuName": "测试1",
|
|
||||||
"externalSkuCode": "830",
|
|
||||||
"externalItemId": "830",
|
|
||||||
"externalSkuName": "测试1",
|
|
||||||
"resolvedSkuName": "测试1",
|
|
||||||
"cloudSourceKey": "default",
|
|
||||||
"cloudSkuId": 28,
|
|
||||||
"cloudSkuName": "套装-浪漫天命",
|
|
||||||
"vnKey": "1",
|
|
||||||
"autoBuyEnabled": true,
|
|
||||||
"minAssetReserve": 0,
|
|
||||||
"autoReturnNumberAfterDispatch": true,
|
|
||||||
"autoConsumeAfterDispatch": true,
|
|
||||||
"kuaishouConsumeShopId": "4269276762",
|
|
||||||
"kuaishouConsumeShopName": "稚嫩游戏交易店",
|
|
||||||
"notes": "从 khhao 订单 2612300173165561 导入"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -142,15 +142,30 @@ export async function queryOpen91Order(payload = {}, { requestId = '' } = {}) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
return buildOpen91SuccessResponse({
|
const outTradeNo = buildOpen91OutTradeNo(order)
|
||||||
|
const encryptedCards = buildOpen91Cards(cardItems, config)
|
||||||
|
const responseData = {
|
||||||
orderNo: normalized.orderNo,
|
orderNo: normalized.orderNo,
|
||||||
outTradeNo: buildOpen91OutTradeNo(order),
|
outTradeNo,
|
||||||
orderStatus: 20,
|
orderStatus: 20,
|
||||||
failCode: 0,
|
failCode: 0,
|
||||||
failReason: '',
|
failReason: '',
|
||||||
orderCost: buildOpen91OrderCost(0),
|
orderCost: buildOpen91OrderCost(0),
|
||||||
cards: buildOpen91Cards(cardItems, config),
|
cards: encryptedCards,
|
||||||
|
}
|
||||||
|
|
||||||
|
logWebhook('[open-91/query]', '91卡券订单查询返回 cards 已生成', {
|
||||||
|
requestId,
|
||||||
|
orderNo: normalized.orderNo,
|
||||||
|
orderId: order.id,
|
||||||
|
outTradeNo,
|
||||||
|
cardsEncoding: config.cardsEncoding,
|
||||||
|
cardsPlain: cardItems,
|
||||||
|
cardsEncrypted: encryptedCards,
|
||||||
|
responseData,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
return buildOpen91SuccessResponse(responseData)
|
||||||
}
|
}
|
||||||
|
|
||||||
function resolveOpen91OrderFailReason(order) {
|
function resolveOpen91OrderFailReason(order) {
|
||||||
|
|||||||
@@ -246,11 +246,42 @@ export function buildOpen91CardItem({ claimUrl = '', expireTime = '' } = {}) {
|
|||||||
return {
|
return {
|
||||||
cardNo: normalizedClaimUrl,
|
cardNo: normalizedClaimUrl,
|
||||||
cardPwd: '',
|
cardPwd: '',
|
||||||
expireTime: normalizeOpen91String(expireTime),
|
expireTime: formatOpen91ExpireTime(expireTime),
|
||||||
jumpLink: normalizedClaimUrl,
|
jumpLink: normalizedClaimUrl,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @param {unknown} value */
|
||||||
|
export function formatOpen91ExpireTime(value = '') {
|
||||||
|
const normalized = normalizeOpen91String(value)
|
||||||
|
if (!normalized) {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
|
||||||
|
if (/^\d{10}$/.test(normalized) || /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/.test(normalized)) {
|
||||||
|
return normalized
|
||||||
|
}
|
||||||
|
|
||||||
|
const date = value instanceof Date ? value : new Date(normalized)
|
||||||
|
if (Number.isNaN(date.getTime())) {
|
||||||
|
return normalized
|
||||||
|
}
|
||||||
|
|
||||||
|
const parts = new Intl.DateTimeFormat('zh-CN', {
|
||||||
|
timeZone: 'Asia/Shanghai',
|
||||||
|
year: 'numeric',
|
||||||
|
month: '2-digit',
|
||||||
|
day: '2-digit',
|
||||||
|
hour: '2-digit',
|
||||||
|
minute: '2-digit',
|
||||||
|
second: '2-digit',
|
||||||
|
hourCycle: 'h23',
|
||||||
|
}).formatToParts(date)
|
||||||
|
|
||||||
|
const byType = Object.fromEntries(parts.map((part) => [part.type, part.value]))
|
||||||
|
return `${byType.year}-${byType.month}-${byType.day} ${byType.hour}:${byType.minute}:${byType.second}`
|
||||||
|
}
|
||||||
|
|
||||||
export function resolveOpen91QueryState({ tasks = [], readyTaskIds = [] } = {}) {
|
export function resolveOpen91QueryState({ tasks = [], readyTaskIds = [] } = {}) {
|
||||||
const normalizedTasks = Array.isArray(tasks) ? tasks : []
|
const normalizedTasks = Array.isArray(tasks) ? tasks : []
|
||||||
const readyTaskIdSet = new Set((Array.isArray(readyTaskIds) ? readyTaskIds : []).map((item) => Number(item)))
|
const readyTaskIdSet = new Set((Array.isArray(readyTaskIds) ? readyTaskIds : []).map((item) => Number(item)))
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import {
|
|||||||
buildOpen91CardItem,
|
buildOpen91CardItem,
|
||||||
buildOpen91SignSource,
|
buildOpen91SignSource,
|
||||||
encryptOpen91Cards,
|
encryptOpen91Cards,
|
||||||
|
formatOpen91ExpireTime,
|
||||||
resolveOpen91QueryState,
|
resolveOpen91QueryState,
|
||||||
signOpen91Payload,
|
signOpen91Payload,
|
||||||
verifyOpen91Signature,
|
verifyOpen91Signature,
|
||||||
@@ -123,3 +124,9 @@ test('buildOpen91CardItem mirrors claim link into jumpLink and leaves password e
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('formatOpen91ExpireTime keeps 91-compatible values and normalizes dates to Beijing time', () => {
|
||||||
|
assert.equal(formatOpen91ExpireTime('2026-05-05 12:00:00'), '2026-05-05 12:00:00')
|
||||||
|
assert.equal(formatOpen91ExpireTime('1778674551'), '1778674551')
|
||||||
|
assert.equal(formatOpen91ExpireTime(new Date('2026-05-14T12:15:51.842Z')), '2026-05-14 20:15:51')
|
||||||
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user