2026-07-27 11:28:33 +08:00

110 lines
3.7 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const aliApi = require("./minialiplay");
const dayjs = require("dayjs");
exports.main = async (event) => {
switch (event.type) {
case "getUserInfo":
return await getUserInfo(event);
case "parsePayNotify":
return await parsePayNotify(event);
case "parseRefundNotify":
return await parseRefundNotify(event);
case "createTrade":
return await createTrade(event);
case "queryTrade":
return await queryTrade(event);
case "refundTrade":
return await refundTrade(event);
case "queryRefundDetail":
return await queryRefundDetail(event);
default:
return {
success: false,
message: "参数错误",
};
}
};
async function getUserInfo({ code }) {
try {
let accessToken = await aliApi.accToken({ code });
let data = await aliApi.userInfo(accessToken);
return { success: true, data }
} catch (e) {
return { success: false, message: e.message };
}
}
async function parsePayNotify({ data }) {
try {
const item = await aliApi.parsePayNotify(data);
return { success: item.isSuccess, data: item };
} catch (e) {
return { success: false, message: e.message };
}
}
async function parseRefundNotify({ data }) {
try {
const item = await aliApi.parseRefundNotify(data);
return { success: false, data: item };
} catch (e) {
return { success: false, message: e.message };
}
}
async function createTrade({ data }) {
try {
const payload = {
outTradeNo: data.outTradeNo,
totalAmount: data.totalAmount,
subject: data.desc,
buyerId: data.openId,
timeExpire: dayjs(data.expireTime).format('YYYY-MM-DD HH:mm:ss'),
}
const item = await aliApi.createTrade(payload);
return { success: true, data: item };
} catch (e) {
return { success: false, message: e.message };
}
}
async function queryTrade({ tradeNo }) {
try {
const item = await aliApi.queryTrade(tradeNo);
return { success: true, data: item };
} catch (e) {
return { success: false, message: e.message };
}
}
async function refundTrade({ tradeNo, reason, totalAmount }) {
try {
const item = await aliApi.refundTrade({ tradeNo, reason, totalAmount });
// fundChange 资金是否变动(y:是,n:否) 如果资金变动,则查询退款详情
// 退款成功判断说明接口返回fund_change=Y为退款成功fund_change=N或无此字段值返回时需通过退款查询接口进一步确认退款状态。详见退款成功判断指导。注意接口中code=10000仅代表本次退款请求成功不代表退款成功
if (item.fundChange === 'Y') {
return { success: true, tradeStatus: 'refunded', refundTime: item.gmtRefundPay };
// 等待5秒后查询退款详情 支付宝处理退款需要时间 建议商户在退款发起后间隔10秒以上再发起退款查询请求
// console.log('等待5秒后查询退款详情')
// await new Promise(resolve => setTimeout(resolve, 5 * 1000));
// const result = await aliApi.queryRefundDetail(tradeNo, item.outTradeNo);
// console.log('查询退款详情结果===')
// console.log(result)
// if (result.success && result.data.refundStatus == 'REFUND_SUCCESS') {
// return { success: true, tradeStatus: 'refunded', refundTime: result.data.gmtRefundPay };
// }
}
return { success: true, tradeStatus: 'refunding' };
} catch (e) {
return { success: false, message: e.message };
}
}
async function queryRefundDetail({ tradeNo, outTradeNo }) {
try {
const item = await aliApi.queryRefundDetail(tradeNo, outTradeNo);
return { success: true, data: item };
} catch (e) {
return { success: false, message: e.message };
}
}