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 }; } }