pay: submit.php 直出收银台页(new-api 易支付对接)

- submit.php 验签建单后不再 302,直接渲染自包含收银台 HTML,
  支付宝二维码由服务端 skip2/go-qrcode 生成 PNG data URL 内嵌
- 新增公开轮询端点 /cashier-status(页面经 /api 前缀访问),
  与 PaySvc.CashierStatus 共用 cashierStatusReply
- Cashier.vue 收银台页同步改版:取景框二维码、倒计时进度条,
  去掉跳上游收银台的外链

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
2026-11-02 23:20:11 +08:00
co-authored by Devin
parent 5a884cab97
commit 2f3bd7fc7b
7 changed files with 286 additions and 31 deletions
+2 -9
View File
@@ -402,18 +402,11 @@ func (s *PaySvc) watchLoop(st *fun.Stream[dto.PayCashierStatusView], tradeNo str
// CashierStatus 收银台轮询:已支付且配置了 return_url 时返回签名回跳地址。
func (s *PaySvc) CashierStatus(d dto.PayCashierDto) (dto.PayCashierStatusView, error) {
o, err := s.Store.Q().GetPayOrderByTradeNo(context.Background(), strings.TrimSpace(d.TradeNo))
status, returnURL, err := cashierStatusReply(s.Store, strings.TrimSpace(d.TradeNo))
if err != nil {
return dto.PayCashierStatusView{}, fun.Error(4004, "订单不存在")
}
res := dto.PayCashierStatusView{Status: o.Status}
if o.Status == payStatusPaid && o.ReturnUrl != "" {
pid, key, err := payMerchant(s.Store)
if err == nil {
res.ReturnUrl = buildSignedURL(o.ReturnUrl, notifyParams(o, pid), key)
}
}
return res, nil
return dto.PayCashierStatusView{Status: status, ReturnUrl: returnURL}, nil
}
func toPayOrderView(r db.PayOrder) dto.PayOrderView {