支付协议
This commit is contained in:
@@ -7,8 +7,8 @@ import { PaymentApi } from "./PaymentApi";
|
||||
import { PaymentOpenerFactory, type OpenStrategy } from "./PaymentOpener";
|
||||
import { PendingOrderRepo } from "./PendingOrderRepo";
|
||||
import PaymentPoller from "./PaymentPoller";
|
||||
import type { CreateOrderReq, PaymentResult, PendingOrder, OrderStatus } from "./types";
|
||||
import { ApiCode } from "../network/client/types";
|
||||
import type { PaymentResult, PendingOrder, OrderStatus } from "./types";
|
||||
import proto from 'db://assets/Scripts/proto/proto.pb.js';
|
||||
|
||||
export const PaymentEvents = {
|
||||
Started: "pay-started", // { orderId }
|
||||
@@ -32,13 +32,13 @@ export class PaymentService {
|
||||
}
|
||||
|
||||
/** 发起支付:创建订单→打开URL→回到App后开始轮询 */
|
||||
async startPayment(req: CreateOrderReq, open: OpenStrategy = "system"): Promise<PaymentResult> {
|
||||
async startPayment(req: proto.cs.ICSCreateOrderReq, open: OpenStrategy = "system"): Promise<proto.cs.ICSQueryOrderRes | null> {
|
||||
// 下单
|
||||
const create = await PaymentApi.I.createOrder(req);
|
||||
if (create.code !== ApiCode.OK || !create.data) {
|
||||
return { orderId: "", status: "FAILED", message: create.msg || "create order failed" };
|
||||
if (create.code !== proto.cs.EnmRetCode.SUCCESS || !create.data) {
|
||||
return { status: -1, retCode: -1 };
|
||||
}
|
||||
const { orderId, payUrl, expireAt } = create.data;
|
||||
const { orderId, payUrl } = create.data;
|
||||
this.bus.emit(PaymentEvents.Started, { orderId });
|
||||
|
||||
// 存为未决订单(用于异常恢复)
|
||||
@@ -62,19 +62,10 @@ export class PaymentService {
|
||||
jitter: true,
|
||||
}, (d) => this.bus.emit(PaymentEvents.PollTick, { orderId, status: d.status }));
|
||||
|
||||
// 产出结果
|
||||
let res: PaymentResult;
|
||||
if (!data) {
|
||||
res = { orderId, status: "EXPIRED", message: "poll timeout" };
|
||||
} else if (data.status === "SUCCESS") {
|
||||
res = { orderId, status: "SUCCESS" };
|
||||
} else {
|
||||
res = { orderId, status: data.status as OrderStatus, message: data.failureReason };
|
||||
}
|
||||
|
||||
PendingOrderRepo.instance.remove(orderId);
|
||||
this.bus.emit(PaymentEvents.Finished, res);
|
||||
return res;
|
||||
// 返回结果
|
||||
this.bus.emit(PaymentEvents.Finished, data);
|
||||
return data;
|
||||
}
|
||||
|
||||
/** App 回到前台后恢复未完成订单的轮询(在 onShow 时调用) */
|
||||
@@ -105,13 +96,9 @@ export class PaymentService {
|
||||
|
||||
// 轮询最新且未过期的订单
|
||||
const r = await this.startPollingOnly(o.orderId);
|
||||
if (r && r.status !== "PENDING" && r.status !== "CREATED") {
|
||||
if (r && r.status !== 1) {
|
||||
PendingOrderRepo.instance.remove(o.orderId);
|
||||
this.bus.emit(PaymentEvents.Finished, {
|
||||
orderId: o.orderId,
|
||||
status: r.status as OrderStatus,
|
||||
message: r.failureReason,
|
||||
} as PaymentResult);
|
||||
this.bus.emit(PaymentEvents.Finished, r);
|
||||
}
|
||||
// r === null(轮询超时)时保留在仓库,等待下一次 resume 再查
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user