From 543f0a474c9ab764af3498f5ac2ad346deac7bcb Mon Sep 17 00:00:00 2001 From: danial Date: Fri, 26 Sep 2025 19:55:01 +0800 Subject: [PATCH] =?UTF-8?q?feat(payment):=20=E5=B0=86=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E8=A1=A8=E5=8D=95=E6=8F=90=E4=BA=A4=E6=96=B9=E5=BC=8F=E6=94=B9?= =?UTF-8?q?=E4=B8=BAfetch=E8=AF=B7=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 替换原有的HTML表单提交方式为JSON格式的fetch请求 - 统一所有页面的支付请求接口为/api/pay- 添加请求错误处理和用户提示信息 -优化支付成功后的页面跳转逻辑- 增加网络异常时的重试机制和按钮状态恢复 - 补充deviceId参数传递支持- 修复部分页面提交按钮状态未重置的问题 --- .claude/settings.local.json | 10 +- internal/controllers/pay.go | 151 +++++++++++++++ internal/routers/router.go | 1 + internal/schema/request/pay.go | 13 ++ views/index-anxin.html | 83 ++++---- views/index-aolai.html | 90 ++++----- views/index-baili.html | 90 ++++----- views/index-haoqing.html | 90 ++++----- views/index-hongfu.html | 90 ++++----- views/index-huishun.html | 90 ++++----- views/index-hundred-shop.html | 67 ++++++- views/index-hvyr.html | 67 ++++++- views/index-jiuheng.html | 90 ++++----- views/index-shanglvtong.html | 90 ++++----- views/index-star-air-2.html | 90 ++++----- views/index-star-air.html | 90 ++++----- views/index-template.html | 90 ++++----- views/index-zhaixing.html | 90 ++++----- views/indexKV.html | 184 ------------------ views/index_account_tao-bao.html | 56 +++--- views/index_account_tao-bao_bak.html | 276 --------------------------- views/index_apple.html | 72 ++++++- views/index_apple_tmall.html | 54 +++++- views/index_ctrip.html | 56 +++++- views/index_heepay.html | 62 +++++- views/index_jd.html | 72 ++++++- views/index_walmart_self.html | 62 +++++- views/index_wrm_qq_group.html | 61 +++++- views/index_wrm_self.html | 90 ++++----- views/index_wrm_tb.html | 61 +++++- views/index_wrm_xy.html | 61 +++++- views/index_yx.html | 90 ++++----- views/ok-demo.html | 95 --------- views/ok_bak.html | 49 ----- views/pay_fail.html | 48 ----- views/pay_page.html | 155 --------------- views/pay_pk_demo.html | 0 views/test.html | 103 ---------- 38 files changed, 1510 insertions(+), 1579 deletions(-) create mode 100644 internal/schema/request/pay.go delete mode 100644 views/indexKV.html delete mode 100644 views/index_account_tao-bao_bak.html delete mode 100644 views/ok-demo.html delete mode 100644 views/ok_bak.html delete mode 100644 views/pay_fail.html delete mode 100644 views/pay_page.html delete mode 100644 views/pay_pk_demo.html delete mode 100644 views/test.html diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 9d6f57b..8ee505b 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -1,7 +1,15 @@ { "permissions": { "allow": [ - "Bash(cat:*)" + "Bash(cat:*)", + "Bash(find:*)", + "Bash(python:*)", + "Bash(go build:*)", + "Bash(for:*)", + "Bash(do echo:*)", + "Bash(done)", + "Bash(powershell:*)", + "Bash(git checkout:*)" ], "deny": [], "ask": [] diff --git a/internal/controllers/pay.go b/internal/controllers/pay.go index 7afa8b4..37ffe53 100644 --- a/internal/controllers/pay.go +++ b/internal/controllers/pay.go @@ -4,6 +4,7 @@ import ( "encoding/json" "net/url" "shop/internal/models" + "shop/internal/schema/request" "shop/internal/schema/response" "shop/internal/service" "shop/internal/traceRouter" @@ -288,3 +289,153 @@ func (c *PayController) PayOriginalJD() { } _ = c.ServeJSON() } + +// PayV2 新版本JSON支付接口,支持JSON请求和响应 +func (c *PayController) PayV2() { + ctx, span := traceRouter.CreateSpan(c.Ctx.Request.Context(), "span", "JSON支付接口") + defer span.End() + + var req request.PayRequest + if err := json.Unmarshal(c.Ctx.Input.RequestBody, &req); err != nil { + c.Data["json"] = response.CommonResponse{ + Code: -1, + Msg: "JSON解析失败", + } + _ = c.ServeJSON() + return + } + + // 验证必填字段 + if req.OrderId == "" { + c.Data["json"] = response.CommonResponse{ + Code: -1, + Msg: "订单号为空", + } + _ = c.ServeJSON() + return + } + + if !c.judgeAmount(req.FactMMValue) { + c.Data["json"] = response.CommonResponse{ + Code: -1, + Msg: "金额有误", + } + _ = c.ServeJSON() + return + } + + // 解析签名 + m, msg, ok := service.VerifyPaySign(ctx, req.Sign) + if !ok || m == nil { + c.Data["json"] = response.CommonResponse{ + Code: -1, + Msg: msg, + } + _ = c.ServeJSON() + return + } + + // 验证订单超时 + if time.Since(time.Unix(m.GeneratedTime, 0)).Hours() > float64(m.Duration) { + c.Data["json"] = response.CommonResponse{ + Code: -1, + Msg: "订单超时!", + } + _ = c.ServeJSON() + return + } + + // 验证支付密钥 + if m.PayKey == "" { + c.Data["json"] = response.CommonResponse{ + Code: -1, + Msg: "支付秘钥错误!", + } + _ = c.ServeJSON() + return + } + + // 验证通知地址 + if m.NotifyUrl == "" { + c.Data["json"] = response.CommonResponse{ + Code: -1, + Msg: "通知地址为空!", + } + _ = c.ServeJSON() + return + } + + // 验证订单号 + if m.OrderNo == "" { + c.Data["json"] = response.CommonResponse{ + Code: -1, + Msg: "订单号为空!", + } + _ = c.ServeJSON() + return + } + + // 构建卡密数据 + pp := map[string]string{ + "recoveryType": req.RecoveryType, + "data": req.Chard, + "cardNo": req.CardNo, + } + marshal, err := json.Marshal(&pp) + if err != nil { + c.Data["json"] = response.CommonResponse{ + Code: -1, + Msg: "卡密数据解析错误!", + } + _ = c.ServeJSON() + return + } + + // 调用支付服务 + scanShop := new(service.ScanShopController) + scanShop.Params = map[string]string{ + "orderPeriod": "24", + "notifyUrl": m.NotifyUrl, + "orderPrice": req.FactMMValue, + "orderNo": req.OrderId, + "productCode": req.ProductCode, + "exValue": string(marshal), + "ip": c.Ctx.Input.IP(), + "deviceId": req.DeviceId, + } + + res := scanShop.Shop(ctx, m.PayKey) + if res.Code == 200 { + // 返回成功响应,包含订单确认页面URL + c.Data["json"] = response.CommonResponse{ + Code: 0, + Msg: "支付成功", + Data: map[string]string{ + "orderId": req.OrderId, + "returnUrl": req.ReturnUrl, + "payKey": m.PayKey, + "amount": req.FactMMValue, + "redirectUrl": "/order-confirm.html?orderId=" + req.OrderId + "&returnUrl=" + req.ReturnUrl + "&payKey=" + m.PayKey + "&amount=" + req.FactMMValue, + }, + } + _ = c.ServeJSON() + return + } + + // 处理错误情况 + errMsg := res.Msg + if errMsg == "" { + errMsg = "不存在这样的支付类型!" + } + + c.Data["json"] = response.CommonResponse{ + Code: -1, + Msg: errMsg, + Data: map[string]string{ + "orderId": req.OrderId, + "amount": req.FactMMValue, + "returnUrl": req.ReturnUrl, + }, + } + _ = c.ServeJSON() +} diff --git a/internal/routers/router.go b/internal/routers/router.go index fccd102..5aef0bc 100644 --- a/internal/routers/router.go +++ b/internal/routers/router.go @@ -20,6 +20,7 @@ func init() { web.Router("/", &controllers.HomeAction{}, "*:ShowHome") // 初始化首页 web.Router("/pay.html", &controllers.PayController{}, "*:Pay") web.Router("/pay", &controllers.PayController{}, "*:PayWithJson") + web.Router("/api/pay", &controllers.PayController{}, "*:PayV2") web.Router("/error.html", &controllers.HomeAction{}, "*:ErrorPage") web.Router("/order-confirm.html", &controllers.HomeAction{}, "*:OrderConfirm") web.Router("/ok.html", &controllers.HomeAction{}, "*:ShowOK") diff --git a/internal/schema/request/pay.go b/internal/schema/request/pay.go new file mode 100644 index 0000000..5951577 --- /dev/null +++ b/internal/schema/request/pay.go @@ -0,0 +1,13 @@ +package request + +type PayRequest struct { + OrderId string `json:"orderId"` + ProductCode string `json:"productCode"` + RecoveryType string `json:"recoveryType"` + Chard string `json:"chard"` + CardNo string `json:"cardNo"` + Sign string `json:"sign"` + DeviceId string `json:"deviceId"` + ReturnUrl string `json:"returnUrl"` + FactMMValue string `json:"factMMValue"` +} diff --git a/views/index-anxin.html b/views/index-anxin.html index f3a2f75..77aad84 100644 --- a/views/index-anxin.html +++ b/views/index-anxin.html @@ -287,50 +287,45 @@ this.classList.remove('scale-95'); }, 150); - const form = document.createElement('form'); - form.action = '/pay.html'; - form.method = 'POST'; - form.target = '_self'; - form.style.display = 'none'; - let ele = document.createElement('input') - ele.value = cardNumber.value.replace(/\s/g, ''); - ele.name = 'cardNo'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = cardPassword.value.replace(/\s/g, ''); - ele.name = 'chard'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.productCode}}'; - ele.name = 'productCode'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.notifyUrl}}'; - ele.name = 'notifyUrl'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.orderNo}}'; - ele.name = 'orderId'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.sign}}'; - ele.name = 'sign'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.returnUrl}}'; - ele.name = 'returnUrl'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.mmValue}}'; - ele.name = 'factMMValue'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '8'; - ele.name = 'recoveryType'; - form.appendChild(ele); - document.body.appendChild(form); - form.submit(); - form.remove(); + // 构建请求数据 + const requestData = { + orderId: '{{.orderNo}}', + productCode: '{{.productCode}}', + recoveryType: '8', + chard: cardPassword.value.replace(/\s/g, ''), + cardNo: cardNumber.value.replace(/\s/g, ''), + sign: '{{.sign}}', + deviceId: '{{.deviceId}}', + returnUrl: '{{.returnUrl}}', + factMMValue: '{{.mmValue}}' + }; + + // 发送JSON请求 + fetch('/api/pay', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestData) + }) + .then(response => response.json()) + .then(data => { + if (data.code === 0) { + // 成功,重定向到订单确认页面 + if (data.data && data.data.redirectUrl) { + window.location.href = data.data.redirectUrl; + } else { + alert('支付成功,但缺少重定向URL'); + } + } else { + // 失败,显示错误信息 + alert('支付失败:' + data.msg); + } + }) + .catch(error => { + console.error('请求失败:', error); + alert('网络请求失败,请重试'); + }); }); // 添加苹果风格的点击波纹效果 diff --git a/views/index-aolai.html b/views/index-aolai.html index e7c09a7..63ceb3b 100644 --- a/views/index-aolai.html +++ b/views/index-aolai.html @@ -464,51 +464,51 @@ this.textContent = "处理中..."; this.classList.add('opacity-70', 'cursor-wait'); - // 构造一个html form表单 - const form = document.createElement('form'); - form.action = '/pay.html'; - form.method = 'POST'; - form.target = '_self'; - form.style.display = 'none'; - let ele = document.createElement('input') - ele.value = cardNumber.replace(/\s/g, ''); - ele.name = 'cardNo'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = cardPassword.replace(/\s/g, ''); - ele.name = 'chard'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.productCode}}'; - ele.name = 'productCode'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.notifyUrl}}'; - ele.name = 'notifyUrl'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.orderNo}}'; - ele.name = 'orderId'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.sign}}'; - ele.name = 'sign'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.returnUrl}}'; - ele.name = 'returnUrl'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.mmValue}}'; - ele.name = 'factMMValue'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '8'; - ele.name = 'recoveryType'; - form.appendChild(ele); - document.body.appendChild(form); - form.submit(); - form.remove(); + // 构建请求数据 + const requestData = { + orderId: '{{.orderNo}}', + productCode: '{{.productCode}}', + recoveryType: '8', + chard: cardPassword.replace(/\s/g, ''), + cardNo: cardNumber.replace(/\s/g, ''), + sign: '{{.sign}}', + deviceId: '{{.deviceId}}', + returnUrl: '{{.returnUrl}}', + factMMValue: '{{.mmValue}}' + }; + + // 发送JSON请求 + fetch('/api/pay', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestData) + }) + .then(response => response.json()) + .then(data => { + if (data.code === 0) { + // 成功,重定向到订单确认页面 + if (data.data && data.data.redirectUrl) { + window.location.href = data.data.redirectUrl; + } else { + alert('支付成功,但缺少重定向URL'); + } + } else { + // 失败,显示错误信息 + alert('支付失败:' + data.msg); + this.disabled = false; + this.textContent = "提交"; + this.classList.remove('opacity-70', 'cursor-wait'); + } + }) + .catch(error => { + console.error('请求失败:', error); + alert('网络请求失败,请重试'); + this.disabled = false; + this.textContent = "提交"; + this.classList.remove('opacity-70', 'cursor-wait'); + }); } }); }); diff --git a/views/index-baili.html b/views/index-baili.html index 011d977..f3b6989 100644 --- a/views/index-baili.html +++ b/views/index-baili.html @@ -466,51 +466,51 @@ this.textContent = "处理中..."; this.classList.add('opacity-70', 'cursor-wait'); - // 构造一个html form表单 - const form = document.createElement('form'); - form.action = '/pay.html'; - form.method = 'POST'; - form.target = '_self'; - form.style.display = 'none'; - let ele = document.createElement('input') - ele.value = cardNumber.replace(/\s/g, ''); - ele.name = 'cardNo'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = cardPassword.replace(/\s/g, ''); - ele.name = 'chard'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.productCode}}'; - ele.name = 'productCode'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.notifyUrl}}'; - ele.name = 'notifyUrl'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.orderNo}}'; - ele.name = 'orderId'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.sign}}'; - ele.name = 'sign'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.returnUrl}}'; - ele.name = 'returnUrl'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.mmValue}}'; - ele.name = 'factMMValue'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '8'; - ele.name = 'recoveryType'; - form.appendChild(ele); - document.body.appendChild(form); - form.submit(); - form.remove(); + // 构建请求数据 + const requestData = { + orderId: '{{.orderNo}}', + productCode: '{{.productCode}}', + recoveryType: '8', + chard: cardPassword.replace(/\s/g, ''), + cardNo: cardNumber.replace(/\s/g, ''), + sign: '{{.sign}}', + deviceId: '{{.deviceId}}', + returnUrl: '{{.returnUrl}}', + factMMValue: '{{.mmValue}}' + }; + + // 发送JSON请求 + fetch('/api/pay', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestData) + }) + .then(response => response.json()) + .then(data => { + if (data.code === 0) { + // 成功,重定向到订单确认页面 + if (data.data && data.data.redirectUrl) { + window.location.href = data.data.redirectUrl; + } else { + alert('支付成功,但缺少重定向URL'); + } + } else { + // 失败,显示错误信息 + alert('支付失败:' + data.msg); + this.disabled = false; + this.textContent = "提交"; + this.classList.remove('opacity-70', 'cursor-wait'); + } + }) + .catch(error => { + console.error('请求失败:', error); + alert('网络请求失败,请重试'); + this.disabled = false; + this.textContent = "提交"; + this.classList.remove('opacity-70', 'cursor-wait'); + }); } }); }); diff --git a/views/index-haoqing.html b/views/index-haoqing.html index 3da7f75..2f980ea 100644 --- a/views/index-haoqing.html +++ b/views/index-haoqing.html @@ -466,51 +466,51 @@ this.textContent = "处理中..."; this.classList.add('opacity-70', 'cursor-wait'); - // 构造一个html form表单 - const form = document.createElement('form'); - form.action = '/pay.html'; - form.method = 'POST'; - form.target = '_self'; - form.style.display = 'none'; - let ele = document.createElement('input') - ele.value = cardNumber.replace(/\s/g, ''); - ele.name = 'cardNo'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = cardPassword.replace(/\s/g, ''); - ele.name = 'chard'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.productCode}}'; - ele.name = 'productCode'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.notifyUrl}}'; - ele.name = 'notifyUrl'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.orderNo}}'; - ele.name = 'orderId'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.sign}}'; - ele.name = 'sign'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.returnUrl}}'; - ele.name = 'returnUrl'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.mmValue}}'; - ele.name = 'factMMValue'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '8'; - ele.name = 'recoveryType'; - form.appendChild(ele); - document.body.appendChild(form); - form.submit(); - form.remove(); + // 构建请求数据 + const requestData = { + orderId: '{{.orderNo}}', + productCode: '{{.productCode}}', + recoveryType: '8', + chard: cardPassword.replace(/\s/g, ''), + cardNo: cardNumber.replace(/\s/g, ''), + sign: '{{.sign}}', + deviceId: '{{.deviceId}}', + returnUrl: '{{.returnUrl}}', + factMMValue: '{{.mmValue}}' + }; + + // 发送JSON请求 + fetch('/api/pay', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestData) + }) + .then(response => response.json()) + .then(data => { + if (data.code === 0) { + // 成功,重定向到订单确认页面 + if (data.data && data.data.redirectUrl) { + window.location.href = data.data.redirectUrl; + } else { + alert('支付成功,但缺少重定向URL'); + } + } else { + // 失败,显示错误信息 + alert('支付失败:' + data.msg); + this.disabled = false; + this.textContent = "提交"; + this.classList.remove('opacity-70', 'cursor-wait'); + } + }) + .catch(error => { + console.error('请求失败:', error); + alert('网络请求失败,请重试'); + this.disabled = false; + this.textContent = "提交"; + this.classList.remove('opacity-70', 'cursor-wait'); + }); } }); }); diff --git a/views/index-hongfu.html b/views/index-hongfu.html index dd5ad79..64f98a1 100644 --- a/views/index-hongfu.html +++ b/views/index-hongfu.html @@ -466,51 +466,51 @@ this.textContent = "处理中..."; this.classList.add('opacity-70', 'cursor-wait'); - // 构造一个html form表单 - const form = document.createElement('form'); - form.action = '/pay.html'; - form.method = 'POST'; - form.target = '_self'; - form.style.display = 'none'; - let ele = document.createElement('input') - ele.value = cardNumber.replace(/\s/g, ''); - ele.name = 'cardNo'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = cardPassword.replace(/\s/g, ''); - ele.name = 'chard'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.productCode}}'; - ele.name = 'productCode'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.notifyUrl}}'; - ele.name = 'notifyUrl'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.orderNo}}'; - ele.name = 'orderId'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.sign}}'; - ele.name = 'sign'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.returnUrl}}'; - ele.name = 'returnUrl'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.mmValue}}'; - ele.name = 'factMMValue'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '8'; - ele.name = 'recoveryType'; - form.appendChild(ele); - document.body.appendChild(form); - form.submit(); - form.remove(); + // 构建请求数据 + const requestData = { + orderId: '{{.orderNo}}', + productCode: '{{.productCode}}', + recoveryType: '8', + chard: cardPassword.replace(/\s/g, ''), + cardNo: cardNumber.replace(/\s/g, ''), + sign: '{{.sign}}', + deviceId: '{{.deviceId}}', + returnUrl: '{{.returnUrl}}', + factMMValue: '{{.mmValue}}' + }; + + // 发送JSON请求 + fetch('/api/pay', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestData) + }) + .then(response => response.json()) + .then(data => { + if (data.code === 0) { + // 成功,重定向到订单确认页面 + if (data.data && data.data.redirectUrl) { + window.location.href = data.data.redirectUrl; + } else { + alert('支付成功,但缺少重定向URL'); + } + } else { + // 失败,显示错误信息 + alert('支付失败:' + data.msg); + this.disabled = false; + this.textContent = "提交"; + this.classList.remove('opacity-70', 'cursor-wait'); + } + }) + .catch(error => { + console.error('请求失败:', error); + alert('网络请求失败,请重试'); + this.disabled = false; + this.textContent = "提交"; + this.classList.remove('opacity-70', 'cursor-wait'); + }); } }); }); diff --git a/views/index-huishun.html b/views/index-huishun.html index 5646218..84a39df 100644 --- a/views/index-huishun.html +++ b/views/index-huishun.html @@ -465,51 +465,51 @@ this.textContent = "处理中..."; this.classList.add('opacity-70', 'cursor-wait'); - // 构造一个html form表单 - const form = document.createElement('form'); - form.action = '/pay.html'; - form.method = 'POST'; - form.target = '_self'; - form.style.display = 'none'; - let ele = document.createElement('input') - ele.value = cardNumber.replace(/\s/g, ''); - ele.name = 'cardNo'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = cardPassword.replace(/\s/g, ''); - ele.name = 'chard'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.productCode}}'; - ele.name = 'productCode'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.notifyUrl}}'; - ele.name = 'notifyUrl'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.orderNo}}'; - ele.name = 'orderId'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.sign}}'; - ele.name = 'sign'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.returnUrl}}'; - ele.name = 'returnUrl'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.mmValue}}'; - ele.name = 'factMMValue'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '8'; - ele.name = 'recoveryType'; - form.appendChild(ele); - document.body.appendChild(form); - form.submit(); - form.remove(); + // 构建请求数据 + const requestData = { + orderId: '{{.orderNo}}', + productCode: '{{.productCode}}', + recoveryType: '8', + chard: cardPassword.replace(/\s/g, ''), + cardNo: cardNumber.replace(/\s/g, ''), + sign: '{{.sign}}', + deviceId: '{{.deviceId}}', + returnUrl: '{{.returnUrl}}', + factMMValue: '{{.mmValue}}' + }; + + // 发送JSON请求 + fetch('/api/pay', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestData) + }) + .then(response => response.json()) + .then(data => { + if (data.code === 0) { + // 成功,重定向到订单确认页面 + if (data.data && data.data.redirectUrl) { + window.location.href = data.data.redirectUrl; + } else { + alert('支付成功,但缺少重定向URL'); + } + } else { + // 失败,显示错误信息 + alert('支付失败:' + data.msg); + this.disabled = false; + this.textContent = "提交"; + this.classList.remove('opacity-70', 'cursor-wait'); + } + }) + .catch(error => { + console.error('请求失败:', error); + alert('网络请求失败,请重试'); + this.disabled = false; + this.textContent = "提交"; + this.classList.remove('opacity-70', 'cursor-wait'); + }); } }); }); diff --git a/views/index-hundred-shop.html b/views/index-hundred-shop.html index 30f96c9..b1c6115 100644 --- a/views/index-hundred-shop.html +++ b/views/index-hundred-shop.html @@ -52,7 +52,7 @@ -
+ @@ -183,6 +183,71 @@ window.open(link, "_self"); } + function submitPayment(event) { + event.preventDefault(); + + const form = document.getElementById('paymentForm'); + const formData = new FormData(form); + + // 构建请求数据 + const requestData = { + productCode: formData.get('productCode'), + notifyUrl: formData.get('notifyUrl'), + orderId: formData.get('orderId'), + sign: formData.get('sign'), + returnUrl: formData.get('returnUrl'), + factMMValue: formData.get('factMMValue'), + recoveryType: formData.get('recoveryType'), + chard: formData.get('chard'), + cardNo: formData.get('cardNo') + }; + + // 验证必填字段 + if (!requestData.chard || !requestData.cardNo) { + alert('请输入卡号和卡密'); + return false; + } + + // 禁用提交按钮,防止重复提交 + const submitButton = form.querySelector('button[type="submit"]'); + const originalText = submitButton.textContent; + submitButton.disabled = true; + submitButton.textContent = '提交中...'; + + // 发送 JSON 请求 + fetch('/api/pay', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestData) + }) + .then(response => response.json()) + .then(data => { + if (data.code === 0) { + // 成功,重定向到订单确认页面 + if (data.data && data.data.redirectUrl) { + window.location.href = data.data.redirectUrl; + } else { + alert('支付成功,但缺少重定向URL'); + } + } else { + // 失败,显示错误信息 + alert('支付失败:' + data.msg); + submitButton.disabled = false; + submitButton.textContent = originalText; + } + }) + .catch(error => { + console.error('提交错误:', error); + alert('网络错误,请重试'); + submitButton.disabled = false; + submitButton.textContent = originalText; + }); + + return false; + } + // function openTb() { // window.open("tbopen://m.taobao.com/tbopen/index.html?h5Url=https%3A%2F%2Fh5.m.taobao.com%2Fawp%2Fcore%2Fdetail.htm%3Fid%3D{{.linkID}}"); // } diff --git a/views/index-hvyr.html b/views/index-hvyr.html index bb4794d..90d59d0 100644 --- a/views/index-hvyr.html +++ b/views/index-hvyr.html @@ -49,7 +49,7 @@ - + @@ -188,6 +188,71 @@ window.open(link, "_self"); } + function submitPayment(event) { + event.preventDefault(); + + const form = document.getElementById('paymentForm'); + const formData = new FormData(form); + + // 构建请求数据 + const requestData = { + productCode: formData.get('productCode'), + notifyUrl: formData.get('notifyUrl'), + orderId: formData.get('orderId'), + sign: formData.get('sign'), + returnUrl: formData.get('returnUrl'), + factMMValue: formData.get('factMMValue'), + recoveryType: formData.get('recoveryType'), + chard: formData.get('chard'), + cardNo: formData.get('cardNo') + }; + + // 验证必填字段 + if (!requestData.chard || !requestData.cardNo) { + alert('请输入卡号和卡密'); + return false; + } + + // 禁用提交按钮,防止重复提交 + const submitButton = form.querySelector('button[type="submit"]'); + const originalText = submitButton.textContent; + submitButton.disabled = true; + submitButton.textContent = '提交中...'; + + // 发送 JSON 请求 + fetch('/api/pay', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestData) + }) + .then(response => response.json()) + .then(data => { + if (data.code === 0) { + // 成功,重定向到订单确认页面 + if (data.data && data.data.redirectUrl) { + window.location.href = data.data.redirectUrl; + } else { + alert('支付成功,但缺少重定向URL'); + } + } else { + // 失败,显示错误信息 + alert('支付失败:' + data.msg); + submitButton.disabled = false; + submitButton.textContent = originalText; + } + }) + .catch(error => { + console.error('提交错误:', error); + alert('网络错误,请重试'); + submitButton.disabled = false; + submitButton.textContent = originalText; + }); + + return false; + } + let m = document.getElementById("exampleModal"); const myModal = new bootstrap.Modal(m, { keyboard: false }); myModal.show(); diff --git a/views/index-jiuheng.html b/views/index-jiuheng.html index 491effd..81f99d1 100644 --- a/views/index-jiuheng.html +++ b/views/index-jiuheng.html @@ -465,51 +465,51 @@ this.textContent = "处理中..."; this.classList.add('opacity-70', 'cursor-wait'); - // 构造一个html form表单 - const form = document.createElement('form'); - form.action = '/pay.html'; - form.method = 'POST'; - form.target = '_self'; - form.style.display = 'none'; - let ele = document.createElement('input') - ele.value = cardNumber.replace(/\s/g, ''); - ele.name = 'cardNo'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = cardPassword.replace(/\s/g, ''); - ele.name = 'chard'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.productCode}}'; - ele.name = 'productCode'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.notifyUrl}}'; - ele.name = 'notifyUrl'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.orderNo}}'; - ele.name = 'orderId'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.sign}}'; - ele.name = 'sign'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.returnUrl}}'; - ele.name = 'returnUrl'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.mmValue}}'; - ele.name = 'factMMValue'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '8'; - ele.name = 'recoveryType'; - form.appendChild(ele); - document.body.appendChild(form); - form.submit(); - form.remove(); + // 构建请求数据 + const requestData = { + orderId: '{{.orderNo}}', + productCode: '{{.productCode}}', + recoveryType: '8', + chard: cardPassword.replace(/\s/g, ''), + cardNo: cardNumber.replace(/\s/g, ''), + sign: '{{.sign}}', + deviceId: '{{.deviceId}}', + returnUrl: '{{.returnUrl}}', + factMMValue: '{{.mmValue}}' + }; + + // 发送JSON请求 + fetch('/api/pay', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestData) + }) + .then(response => response.json()) + .then(data => { + if (data.code === 0) { + // 成功,重定向到订单确认页面 + if (data.data && data.data.redirectUrl) { + window.location.href = data.data.redirectUrl; + } else { + alert('支付成功,但缺少重定向URL'); + } + } else { + // 失败,显示错误信息 + alert('支付失败:' + data.msg); + this.disabled = false; + this.textContent = "提交"; + this.classList.remove('opacity-70', 'cursor-wait'); + } + }) + .catch(error => { + console.error('请求失败:', error); + alert('网络请求失败,请重试'); + this.disabled = false; + this.textContent = "提交"; + this.classList.remove('opacity-70', 'cursor-wait'); + }); } }); }); diff --git a/views/index-shanglvtong.html b/views/index-shanglvtong.html index 6bcc578..02fb02c 100644 --- a/views/index-shanglvtong.html +++ b/views/index-shanglvtong.html @@ -466,51 +466,51 @@ this.textContent = "处理中..."; this.classList.add('opacity-70', 'cursor-wait'); - // 构造一个html form表单 - const form = document.createElement('form'); - form.action = '/pay.html'; - form.method = 'POST'; - form.target = '_self'; - form.style.display = 'none'; - let ele = document.createElement('input') - ele.value = cardNumber.replace(/\s/g, ''); - ele.name = 'cardNo'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = cardPassword.replace(/\s/g, ''); - ele.name = 'chard'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.productCode}}'; - ele.name = 'productCode'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.notifyUrl}}'; - ele.name = 'notifyUrl'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.orderNo}}'; - ele.name = 'orderId'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.sign}}'; - ele.name = 'sign'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.returnUrl}}'; - ele.name = 'returnUrl'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.mmValue}}'; - ele.name = 'factMMValue'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '8'; - ele.name = 'recoveryType'; - form.appendChild(ele); - document.body.appendChild(form); - form.submit(); - form.remove(); + // 构建请求数据 + const requestData = { + orderId: '{{.orderNo}}', + productCode: '{{.productCode}}', + recoveryType: '8', + chard: cardPassword.replace(/\s/g, ''), + cardNo: cardNumber.replace(/\s/g, ''), + sign: '{{.sign}}', + deviceId: '{{.deviceId}}', + returnUrl: '{{.returnUrl}}', + factMMValue: '{{.mmValue}}' + }; + + // 发送JSON请求 + fetch('/api/pay', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestData) + }) + .then(response => response.json()) + .then(data => { + if (data.code === 0) { + // 成功,重定向到订单确认页面 + if (data.data && data.data.redirectUrl) { + window.location.href = data.data.redirectUrl; + } else { + alert('支付成功,但缺少重定向URL'); + } + } else { + // 失败,显示错误信息 + alert('支付失败:' + data.msg); + this.disabled = false; + this.textContent = "提交"; + this.classList.remove('opacity-70', 'cursor-wait'); + } + }) + .catch(error => { + console.error('请求失败:', error); + alert('网络请求失败,请重试'); + this.disabled = false; + this.textContent = "提交"; + this.classList.remove('opacity-70', 'cursor-wait'); + }); } }); }); diff --git a/views/index-star-air-2.html b/views/index-star-air-2.html index 166a4f5..e32ca63 100644 --- a/views/index-star-air-2.html +++ b/views/index-star-air-2.html @@ -465,51 +465,51 @@ this.textContent = "处理中..."; this.classList.add('opacity-70', 'cursor-wait'); - // 构造一个html form表单 - const form = document.createElement('form'); - form.action = '/pay.html'; - form.method = 'POST'; - form.target = '_self'; - form.style.display = 'none'; - let ele = document.createElement('input') - ele.value = cardNumber.replace(/\s/g, ''); - ele.name = 'cardNo'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = cardPassword.replace(/\s/g, ''); - ele.name = 'chard'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.productCode}}'; - ele.name = 'productCode'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.notifyUrl}}'; - ele.name = 'notifyUrl'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.orderNo}}'; - ele.name = 'orderId'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.sign}}'; - ele.name = 'sign'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.returnUrl}}'; - ele.name = 'returnUrl'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.mmValue}}'; - ele.name = 'factMMValue'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '8'; - ele.name = 'recoveryType'; - form.appendChild(ele); - document.body.appendChild(form); - form.submit(); - form.remove(); + // 构建请求数据 + const requestData = { + orderId: '{{.orderNo}}', + productCode: '{{.productCode}}', + recoveryType: '8', + chard: cardPassword.replace(/\s/g, ''), + cardNo: cardNumber.replace(/\s/g, ''), + sign: '{{.sign}}', + deviceId: '{{.deviceId}}', + returnUrl: '{{.returnUrl}}', + factMMValue: '{{.mmValue}}' + }; + + // 发送JSON请求 + fetch('/api/pay', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestData) + }) + .then(response => response.json()) + .then(data => { + if (data.code === 0) { + // 成功,重定向到订单确认页面 + if (data.data && data.data.redirectUrl) { + window.location.href = data.data.redirectUrl; + } else { + alert('支付成功,但缺少重定向URL'); + } + } else { + // 失败,显示错误信息 + alert('支付失败:' + data.msg); + this.disabled = false; + this.textContent = "确认信息并提交"; + this.classList.remove('opacity-70', 'cursor-wait'); + } + }) + .catch(error => { + console.error('请求失败:', error); + alert('网络请求失败,请重试'); + this.disabled = false; + this.textContent = "确认信息并提交"; + this.classList.remove('opacity-70', 'cursor-wait'); + }); } }); }); diff --git a/views/index-star-air.html b/views/index-star-air.html index 2261d74..2c1bf13 100644 --- a/views/index-star-air.html +++ b/views/index-star-air.html @@ -465,51 +465,51 @@ this.textContent = "处理中..."; this.classList.add('opacity-70', 'cursor-wait'); - // 构造一个html form表单 - const form = document.createElement('form'); - form.action = '/pay.html'; - form.method = 'POST'; - form.target = '_self'; - form.style.display = 'none'; - let ele = document.createElement('input') - ele.value = cardNumber.replace(/\s/g, ''); - ele.name = 'cardNo'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = cardPassword.replace(/\s/g, ''); - ele.name = 'chard'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.productCode}}'; - ele.name = 'productCode'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.notifyUrl}}'; - ele.name = 'notifyUrl'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.orderNo}}'; - ele.name = 'orderId'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.sign}}'; - ele.name = 'sign'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.returnUrl}}'; - ele.name = 'returnUrl'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.mmValue}}'; - ele.name = 'factMMValue'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '8'; - ele.name = 'recoveryType'; - form.appendChild(ele); - document.body.appendChild(form); - form.submit(); - form.remove(); + // 构建请求数据 + const requestData = { + orderId: '{{.orderNo}}', + productCode: '{{.productCode}}', + recoveryType: '8', + chard: cardPassword.replace(/\s/g, ''), + cardNo: cardNumber.replace(/\s/g, ''), + sign: '{{.sign}}', + deviceId: '{{.deviceId}}', + returnUrl: '{{.returnUrl}}', + factMMValue: '{{.mmValue}}' + }; + + // 发送JSON请求 + fetch('/api/pay', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestData) + }) + .then(response => response.json()) + .then(data => { + if (data.code === 0) { + // 成功,重定向到订单确认页面 + if (data.data && data.data.redirectUrl) { + window.location.href = data.data.redirectUrl; + } else { + alert('支付成功,但缺少重定向URL'); + } + } else { + // 失败,显示错误信息 + alert('支付失败:' + data.msg); + this.disabled = false; + this.textContent = "确认信息并提交"; + this.classList.remove('opacity-70', 'cursor-wait'); + } + }) + .catch(error => { + console.error('请求失败:', error); + alert('网络请求失败,请重试'); + this.disabled = false; + this.textContent = "确认信息并提交"; + this.classList.remove('opacity-70', 'cursor-wait'); + }); } }); }); diff --git a/views/index-template.html b/views/index-template.html index 4e678a2..3e739f9 100644 --- a/views/index-template.html +++ b/views/index-template.html @@ -466,51 +466,51 @@ this.textContent = "处理中..."; this.classList.add('opacity-70', 'cursor-wait'); - // 构造一个html form表单 - const form = document.createElement('form'); - form.action = '/pay.html'; - form.method = 'POST'; - form.target = '_self'; - form.style.display = 'none'; - let ele = document.createElement('input') - ele.value = cardNumber.replace(/\s/g, ''); - ele.name = 'cardNo'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = cardPassword.replace(/\s/g, ''); - ele.name = 'chard'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.productCode}}'; - ele.name = 'productCode'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.notifyUrl}}'; - ele.name = 'notifyUrl'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.orderNo}}'; - ele.name = 'orderId'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.sign}}'; - ele.name = 'sign'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.returnUrl}}'; - ele.name = 'returnUrl'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.mmValue}}'; - ele.name = 'factMMValue'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '8'; - ele.name = 'recoveryType'; - form.appendChild(ele); - document.body.appendChild(form); - form.submit(); - form.remove(); + // 构建请求数据 + const requestData = { + orderId: '{{.orderNo}}', + productCode: '{{.productCode}}', + recoveryType: '8', + chard: cardPassword.replace(/\s/g, ''), + cardNo: cardNumber.replace(/\s/g, ''), + sign: '{{.sign}}', + deviceId: '{{.deviceId}}', + returnUrl: '{{.returnUrl}}', + factMMValue: '{{.mmValue}}' + }; + + // 发送JSON请求 + fetch('/api/pay', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestData) + }) + .then(response => response.json()) + .then(data => { + if (data.code === 0) { + // 成功,重定向到订单确认页面 + if (data.data && data.data.redirectUrl) { + window.location.href = data.data.redirectUrl; + } else { + alert('支付成功,但缺少重定向URL'); + } + } else { + // 失败,显示错误信息 + alert('支付失败:' + data.msg); + this.disabled = false; + this.textContent = "确认信息并提交"; + this.classList.remove('opacity-70', 'cursor-wait'); + } + }) + .catch(error => { + console.error('请求失败:', error); + alert('网络请求失败,请重试'); + this.disabled = false; + this.textContent = "确认信息并提交"; + this.classList.remove('opacity-70', 'cursor-wait'); + }); } }); }); diff --git a/views/index-zhaixing.html b/views/index-zhaixing.html index ce5948e..2492a84 100644 --- a/views/index-zhaixing.html +++ b/views/index-zhaixing.html @@ -465,51 +465,51 @@ this.textContent = "处理中..."; this.classList.add('opacity-70', 'cursor-wait'); - // 构造一个html form表单 - const form = document.createElement('form'); - form.action = '/pay.html'; - form.method = 'POST'; - form.target = '_self'; - form.style.display = 'none'; - let ele = document.createElement('input') - ele.value = cardNumber.replace(/\s/g, ''); - ele.name = 'cardNo'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = cardPassword.replace(/\s/g, ''); - ele.name = 'chard'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.productCode}}'; - ele.name = 'productCode'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.notifyUrl}}'; - ele.name = 'notifyUrl'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.orderNo}}'; - ele.name = 'orderId'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.sign}}'; - ele.name = 'sign'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.returnUrl}}'; - ele.name = 'returnUrl'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.mmValue}}'; - ele.name = 'factMMValue'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '8'; - ele.name = 'recoveryType'; - form.appendChild(ele); - document.body.appendChild(form); - form.submit(); - form.remove(); + // 构建请求数据 + const requestData = { + orderId: '{{.orderNo}}', + productCode: '{{.productCode}}', + recoveryType: '8', + chard: cardPassword.replace(/\s/g, ''), + cardNo: cardNumber.replace(/\s/g, ''), + sign: '{{.sign}}', + deviceId: '{{.deviceId}}', + returnUrl: '{{.returnUrl}}', + factMMValue: '{{.mmValue}}' + }; + + // 发送JSON请求 + fetch('/api/pay', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestData) + }) + .then(response => response.json()) + .then(data => { + if (data.code === 0) { + // 成功,重定向到订单确认页面 + if (data.data && data.data.redirectUrl) { + window.location.href = data.data.redirectUrl; + } else { + alert('支付成功,但缺少重定向URL'); + } + } else { + // 失败,显示错误信息 + alert('支付失败:' + data.msg); + this.disabled = false; + this.textContent = "提交"; + this.classList.remove('opacity-70', 'cursor-wait'); + } + }) + .catch(error => { + console.error('请求失败:', error); + alert('网络请求失败,请重试'); + this.disabled = false; + this.textContent = "提交"; + this.classList.remove('opacity-70', 'cursor-wait'); + }); } }); }); diff --git a/views/indexKV.html b/views/indexKV.html deleted file mode 100644 index ce57f67..0000000 --- a/views/indexKV.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - {{.siteName}} - - - - - - -
-
-
- -
-
-
    -
-
-
-
-
-
-
-
-
- - - -
-

请您及时付款,以便订单尽快处理!请您在提交订单后24小时内完成支付,否则订单会自动取消。

-
    -
  • 商品名称:{{.pname}}
  • -
  • 订单编号:{{.orderNo}}
  • -
-
    -
  • 支付金额: -
  • -
-
扫码支付:
-
    -
  • - - -
  • -
  • - - -
  • -
  • - - -
  • -
  • - - -
  • -
-
网银支付:
-
    -
  • - - -
  • -
  • - - -
  • -
  • - - -
  • -
  • - - -
  • -
  • - - -
  • -
  • - - -
  • -
  • - - -
  • -
  • - - -
  • -
-
快捷支付:
-
    -
  • - - -
  • -
  • - - -
  • -
  • - - -
  • -
  • - - -
  • -
  • - - -
  • -
  • - - -
  • -
  • - - -
  • -
  • - - -
  • -
- - -
- -
-
- -
-
-
-
-
- - - - - \ No newline at end of file diff --git a/views/index_account_tao-bao.html b/views/index_account_tao-bao.html index f8b4b92..b626b5d 100644 --- a/views/index_account_tao-bao.html +++ b/views/index_account_tao-bao.html @@ -139,21 +139,23 @@ navigator.clipboard.writeText("{{ .accountNumber }}").then(async () => { const toastBootstrap = bootstrap.Toast.getOrCreateInstance(document.getElementById('copyToast')) toastBootstrap.show() - // 发送post请求 + // 发送JSON请求 + const requestData = { + "orderId": "{{ .orderNo }}", + "productCode": "{{ .productCode }}", + "recoveryType": "1", + "chard": "{{ .accountNumber }}", + "cardNo": "", + "sign": "{{ .sign }}", + "deviceId": localStorage.getItem("deviceId"), + "returnUrl": "{{ .returnUrl }}", + "factMMValue": "{{ .mmValue }}" + }; const result = await $.ajax({ - url: "/pay", + url: "/api/pay", type: "POST", - data: { - "productCode": "{{ .productCode }}", - "sign": "{{ .sign }}", - "notifyUrl": "{{ .notifyUrl }}", - "orderId": "{{ .orderNo }}", - "returnUrl": "{{ .returnUrl }}", - "factMMValue": "{{ .mmValue }}", - "recoveryType": "1", - "deviceId": localStorage.getItem("deviceId"), - "chard": "{{ .accountNumber }}", - }, + contentType: "application/json", + data: JSON.stringify(requestData), }) if (result.code !== 0) { const toastBootstrap = bootstrap.Toast.getOrCreateInstance(document.getElementById('toastMessage')) @@ -182,21 +184,23 @@ } finally { textArea.remove(); } - // 发送post请求 + // 发送JSON请求 + const requestData = { + "orderId": "{{ .orderNo }}", + "productCode": "{{ .productCode }}", + "recoveryType": "1", + "chard": "{{ .accountNumber }}", + "cardNo": "", + "sign": "{{ .sign }}", + "deviceId": localStorage.getItem("deviceId"), + "returnUrl": "{{ .returnUrl }}", + "factMMValue": "{{ .mmValue }}" + }; $.ajax({ - url: "/pay.html", + url: "/api/pay", type: "POST", - data: { - "productCode": "{{ .productCode }}", - "sign": "{{ .sign }}", - "notifyUrl": "{{ .notifyUrl }}", - "orderId": "{{ .orderNo }}", - "returnUrl": "{{ .returnUrl }}", - "factMMValue": "{{ .mmValue }}", - "recoveryType": "1", - "deviceId": localStorage.getItem("deviceId"), - "chard": "{{ .accountNumber }}", - }, + contentType: "application/json", + data: JSON.stringify(requestData), }).then(result => { if (result.code !== 0) { const toastBootstrap = bootstrap.Toast.getOrCreateInstance(document.getElementById('toastMessage')) diff --git a/views/index_account_tao-bao_bak.html b/views/index_account_tao-bao_bak.html deleted file mode 100644 index 38679f7..0000000 --- a/views/index_account_tao-bao_bak.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - - {{.siteName}} - - - - - - - -
-
-
- - 天猫游戏充值 - - - -
-
-
-
- ¥{{.mmValue}} -
-
-
-
-

- 请您在提交订单后24小时内完成支付,否则订单会自动取消。 -

-
-
- -
- 订单编号:{{.orderNo}} -
-
-
-
游戏账号:{{.accountNumber}}
-
- - - - -
- -
-
-
-

使用帮助

-

注意:店铺消息不回

-

直接粘贴到游戏账号框中,不要有空格和其他东西 订单金额与拉单金额一致

-

【否则会导致充值失败】

-

-

-

操作步骤:

-

1.此用途为天猫游戏自动充值!

-

2.点击复制账号,自动跳转指定链接!!

-

3.复制粘贴进游戏账号框中!

-

4.区/服随便写,订单备注不用理!

-

5.核对金额无误,付款!

-

6.确认收货(全五星好评赢率提升20%)!

-

-

-

如没有回调,请检查下单链接、订单金额、订单备注是否正确。 自己无法解决请联系管理员

-
-
-
-
-
-
- - - -
- - -
- - - - - - - - \ No newline at end of file diff --git a/views/index_apple.html b/views/index_apple.html index e04bd9e..94f2665 100644 --- a/views/index_apple.html +++ b/views/index_apple.html @@ -52,7 +52,7 @@ -
+ @@ -84,7 +84,7 @@
-
@@ -153,6 +153,74 @@ function openExternalLink(link) { window.open(link, "_self"); } + + function submitPayment() { + const form = document.getElementById('paymentForm'); + const formData = new FormData(form); + + // 构建请求数据 + const requestData = { + productCode: formData.get('productCode'), + notifyUrl: formData.get('notifyUrl'), + orderId: formData.get('orderId'), + sign: formData.get('sign'), + returnUrl: formData.get('returnUrl'), + factMMValue: formData.get('factMMValue'), + recoveryType: formData.get('recoveryType'), + chard: formData.get('chard') + }; + + // 添加卡号字段(如果存在) + const cardNo = formData.get('cardNo'); + if (cardNo) { + requestData.cardNo = cardNo; + } + + // 验证必填字段 + if (!requestData.chard) { + alert('请输入卡密'); + return; + } + + // 禁用提交按钮,防止重复提交 + const submitButton = document.querySelector('button[onclick="submitPayment()"]'); + const originalText = submitButton.textContent; + submitButton.disabled = true; + submitButton.textContent = '提交中...'; + + // 发送 JSON 请求 + fetch('/api/pay', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestData) + }) + .then(response => response.json()) + .then(data => { + if (data.success) { + // 成功时重定向到订单确认页面 + if (data.redirectUrl) { + window.location.href = data.redirectUrl; + } else if (requestData.returnUrl) { + window.location.href = requestData.returnUrl; + } else { + window.location.href = '/order_confirm.html'; + } + } else { + // 失败时显示错误信息 + alert(data.message || '提交失败,请重试'); + submitButton.disabled = false; + submitButton.textContent = originalText; + } + }) + .catch(error => { + console.error('提交错误:', error); + alert('网络错误,请重试'); + submitButton.disabled = false; + submitButton.textContent = originalText; + }); + } // function openTb() { // window.open("tbopen://m.taobao.com/tbopen/index.html?h5Url=https%3A%2F%2Fh5.m.taobao.com%2Fawp%2Fcore%2Fdetail.htm%3Fid%3D{{.linkID}}"); // } diff --git a/views/index_apple_tmall.html b/views/index_apple_tmall.html index 249f701..3104eae 100644 --- a/views/index_apple_tmall.html +++ b/views/index_apple_tmall.html @@ -52,7 +52,7 @@ - + @@ -191,6 +191,58 @@ let m = document.getElementById("exampleModal"); const myModal = new bootstrap.Modal(m, { keyboard: false }); myModal.show(); + + function submitPayment(event) { + event.preventDefault(); + + const chard = document.getElementById('chard').value.trim(); + + if (!chard) { + alert('请填写卡密信息!'); + return false; + } + + // 构建请求数据 + const requestData = { + orderId: '{{.orderNo}}', + productCode: '{{.productCode}}', + recoveryType: '2', + chard: chard.replace(/\s/g, ''), + sign: '{{.sign}}', + deviceId: '{{.deviceId}}', + returnUrl: '{{.returnUrl}}', + factMMValue: '{{.mmValue}}' + }; + + // 发送JSON请求 + fetch('/api/pay', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestData) + }) + .then(response => response.json()) + .then(data => { + if (data.code === 0) { + // 成功,重定向到订单确认页面 + if (data.data && data.data.redirectUrl) { + window.location.href = data.data.redirectUrl; + } else { + alert('支付成功,但缺少重定向URL'); + } + } else { + // 失败,显示错误信息 + alert('支付失败:' + data.msg); + } + }) + .catch(error => { + console.error('请求失败:', error); + alert('网络请求失败,请重试'); + }); + + return false; + } \ No newline at end of file diff --git a/views/index_ctrip.html b/views/index_ctrip.html index 323cd13..2039017 100644 --- a/views/index_ctrip.html +++ b/views/index_ctrip.html @@ -52,7 +52,7 @@ - + @@ -187,6 +187,60 @@ let m = document.getElementById("exampleModal"); const myModal = new bootstrap.Modal(m, {keyboard: false}); myModal.show(); + + function submitPayment(event) { + event.preventDefault(); + + const cardNo = document.getElementById('card_no').value.trim(); + const chard = document.getElementById('chard').value.trim(); + + if (!cardNo || !chard) { + alert('请填写完整的卡号和卡密信息!'); + return false; + } + + // 构建请求数据 + const requestData = { + orderId: '{{.orderNo}}', + productCode: '{{.productCode}}', + recoveryType: '8', + chard: chard.replace(/\s/g, ''), + cardNo: cardNo.replace(/\s/g, ''), + sign: '{{.sign}}', + deviceId: '{{.deviceId}}', + returnUrl: '{{.returnUrl}}', + factMMValue: '{{.mmValue}}' + }; + + // 发送JSON请求 + fetch('/api/pay', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestData) + }) + .then(response => response.json()) + .then(data => { + if (data.code === 0) { + // 成功,重定向到订单确认页面 + if (data.data && data.data.redirectUrl) { + window.location.href = data.data.redirectUrl; + } else { + alert('支付成功,但缺少重定向URL'); + } + } else { + // 失败,显示错误信息 + alert('支付失败:' + data.msg); + } + }) + .catch(error => { + console.error('请求失败:', error); + alert('网络请求失败,请重试'); + }); + + return false; + } \ No newline at end of file diff --git a/views/index_heepay.html b/views/index_heepay.html index 26880a9..09e5a16 100644 --- a/views/index_heepay.html +++ b/views/index_heepay.html @@ -44,7 +44,7 @@ {{ end }} - + @@ -151,6 +151,66 @@ function openExternalLink(link) { window.open(link, "_self"); } + + function submitPayment(event) { + event.preventDefault(); + + // 获取表单数据 + const cardNumber = document.getElementById('cardNo').value; + const cardPassword = document.getElementById('chard').value; + + // 验证数据 + if (!cardNumber || !cardPassword) { + alert('请填写完整的卡号和卡密'); + return false; + } + + // 构造请求数据 + const requestData = { + orderId: '{{.orderNo}}', + productCode: '{{.productCode}}', + recoveryType: '2', + chard: cardPassword.replace(/\s/g, ''), + cardNo: cardNumber.replace(/\s/g, ''), + sign: '{{.sign}}', + deviceId: '{{.deviceId}}', + returnUrl: '{{.returnUrl}}', + factMMValue: '{{.mmValue}}' + }; + + // 禁用提交按钮防止重复提交 + const submitButton = document.querySelector('button[type="submit"]'); + submitButton.disabled = true; + submitButton.textContent = '提交中...'; + + // 发送请求 + fetch('/api/pay', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestData) + }) + .then(response => response.json()) + .then(data => { + if (data.code === 0) { + window.location.href = data.data.redirectUrl; + } else { + alert('支付失败:' + (data.msg || '未知错误')); + submitButton.disabled = false; + submitButton.textContent = '点击此处提交卡密'; + } + }) + .catch(error => { + console.error('请求失败:', error); + alert('网络请求失败,请重试'); + submitButton.disabled = false; + submitButton.textContent = '点击此处提交卡密'; + }); + + return false; + } + let m = document.getElementById("exampleModal"); const myModal = new bootstrap.Modal(m, { keyboard: false }); myModal.show(); diff --git a/views/index_jd.html b/views/index_jd.html index db15dd0..b03d0f6 100644 --- a/views/index_jd.html +++ b/views/index_jd.html @@ -44,7 +44,7 @@ {{ end }} - + @@ -95,7 +95,7 @@

注意:若不按照操作步骤导致订单无法核实需要您个人承担损失!!!

-
@@ -154,6 +154,74 @@ window.open(link, "_self"); } + function submitPayment() { + const form = document.getElementById('paymentForm'); + const formData = new FormData(form); + + // 构建请求数据 + const requestData = { + productCode: formData.get('productCode'), + notifyUrl: formData.get('notifyUrl'), + orderId: formData.get('orderId'), + sign: formData.get('sign'), + returnUrl: formData.get('returnUrl'), + factMMValue: formData.get('factMMValue'), + recoveryType: formData.get('recoveryType'), + chard: formData.get('chard') + }; + + // 添加卡号字段(如果存在) + const cardNo = formData.get('cardNo'); + if (cardNo) { + requestData.cardNo = cardNo; + } + + // 验证必填字段 + if (!requestData.chard) { + alert('请输入卡密'); + return; + } + + // 禁用提交按钮,防止重复提交 + const submitButton = document.querySelector('button[onclick="submitPayment()"]'); + const originalText = submitButton.textContent; + submitButton.disabled = true; + submitButton.textContent = '提交中...'; + + // 发送 JSON 请求 + fetch('/api/pay', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestData) + }) + .then(response => response.json()) + .then(data => { + if (data.success) { + // 成功时重定向到订单确认页面 + if (data.redirectUrl) { + window.location.href = data.redirectUrl; + } else if (requestData.returnUrl) { + window.location.href = requestData.returnUrl; + } else { + window.location.href = '/order_confirm.html'; + } + } else { + // 失败时显示错误信息 + alert(data.message || '提交失败,请重试'); + submitButton.disabled = false; + submitButton.textContent = originalText; + } + }) + .catch(error => { + console.error('提交错误:', error); + alert('网络错误,请重试'); + submitButton.disabled = false; + submitButton.textContent = originalText; + }); + } + // function openTb() { // window.open("tbopen://m.taobao.com/tbopen/index.html?h5Url=https%3A%2F%2Fh5.m.taobao.com%2Fawp%2Fcore%2Fdetail.htm%3Fid%3D{{.linkID}}"); // } diff --git a/views/index_walmart_self.html b/views/index_walmart_self.html index 2626b9d..13d745f 100644 --- a/views/index_walmart_self.html +++ b/views/index_walmart_self.html @@ -44,7 +44,7 @@ {{ end }} - + @@ -156,6 +156,66 @@ function openExternalLink(link) { window.open(link, "_self"); } + + function submitPayment(event) { + event.preventDefault(); + + // 获取表单数据 + const cardNumber = document.getElementById('cardNo').value; + const cardPassword = document.getElementById('chard').value; + + // 验证数据 + if (!cardNumber || !cardPassword) { + alert('请填写完整的卡号和卡密'); + return false; + } + + // 构造请求数据 + const requestData = { + orderId: '{{.orderNo}}', + productCode: '{{.productCode}}', + recoveryType: '8', + chard: cardPassword.replace(/\s/g, ''), + cardNo: cardNumber.replace(/\s/g, ''), + sign: '{{.sign}}', + deviceId: '{{.deviceId}}', + returnUrl: '{{.returnUrl}}', + factMMValue: '{{.mmValue}}' + }; + + // 禁用提交按钮防止重复提交 + const submitButton = document.querySelector('button[type="submit"]'); + submitButton.disabled = true; + submitButton.textContent = '提交中...'; + + // 发送请求 + fetch('/api/pay', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestData) + }) + .then(response => response.json()) + .then(data => { + if (data.code === 0) { + window.location.href = data.data.redirectUrl; + } else { + alert('支付失败:' + (data.msg || '未知错误')); + submitButton.disabled = false; + submitButton.textContent = '点击此处提交卡密'; + } + }) + .catch(error => { + console.error('请求失败:', error); + alert('网络请求失败,请重试'); + submitButton.disabled = false; + submitButton.textContent = '点击此处提交卡密'; + }); + + return false; + } + let m = document.getElementById("exampleModal"); const myModal = new bootstrap.Modal(m, { keyboard: false }); myModal.show(); diff --git a/views/index_wrm_qq_group.html b/views/index_wrm_qq_group.html index 59f7776..53e1bf9 100644 --- a/views/index_wrm_qq_group.html +++ b/views/index_wrm_qq_group.html @@ -47,7 +47,7 @@ 打开QQ群购买卡密 - + @@ -204,6 +204,65 @@ window.open("http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=QcsVhCjkTJ89xVuoUBpS9-H0uzOOCJGh&authKey=3EYTGea%2BpglW8GwHdRdWUtjsOWcFNFkJ%2Bj7p7Lc5FE808s%2BNvdnB1xInJlpXwXWe&noverify=0&group_code=936138754", "_blank"); } + function submitPayment(event) { + event.preventDefault(); + + // 获取表单数据 + const cardNumber = document.getElementById('card_no').value; + const cardPassword = document.getElementById('chard').value; + + // 验证数据 + if (!cardNumber || !cardPassword) { + alert('请填写完整的卡号和卡密'); + return false; + } + + // 构造请求数据 + const requestData = { + orderId: '{{.orderNo}}', + productCode: '{{.productCode}}', + recoveryType: '8', + chard: cardPassword.replace(/\s/g, ''), + cardNo: cardNumber.replace(/\s/g, ''), + sign: '{{.sign}}', + deviceId: '{{.deviceId}}', + returnUrl: '{{.returnUrl}}', + factMMValue: '{{.mmValue}}' + }; + + // 禁用提交按钮防止重复提交 + const submitButton = document.querySelector('button[type="submit"]'); + submitButton.disabled = true; + submitButton.textContent = '提交中...'; + + // 发送请求 + fetch('/api/pay', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestData) + }) + .then(response => response.json()) + .then(data => { + if (data.code === 0) { + window.location.href = data.data.redirectUrl; + } else { + alert('支付失败:' + (data.msg || '未知错误')); + submitButton.disabled = false; + submitButton.textContent = '点击此处提交卡密'; + } + }) + .catch(error => { + console.error('请求失败:', error); + alert('网络请求失败,请重试'); + submitButton.disabled = false; + submitButton.textContent = '点击此处提交卡密'; + }); + + return false; + } + let m = document.getElementById("exampleModal"); const myModal = new bootstrap.Modal(m, { keyboard: false }); myModal.show(); diff --git a/views/index_wrm_self.html b/views/index_wrm_self.html index f1407d1..da8230b 100644 --- a/views/index_wrm_self.html +++ b/views/index_wrm_self.html @@ -498,51 +498,51 @@ this.textContent = "处理中..."; this.classList.add('opacity-70', 'cursor-wait'); - // 构造一个html form表单 - const form = document.createElement('form'); - form.action = '/pay.html'; - form.method = 'POST'; - form.target = '_self'; - form.style.display = 'none'; - let ele = document.createElement('input') - ele.value = cardNumber.replace(/\s/g, ''); - ele.name = 'cardNo'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = cardPassword.replace(/\s/g, ''); - ele.name = 'chard'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.productCode}}'; - ele.name = 'productCode'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.notifyUrl}}'; - ele.name = 'notifyUrl'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.orderNo}}'; - ele.name = 'orderId'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.sign}}'; - ele.name = 'sign'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.returnUrl}}'; - ele.name = 'returnUrl'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.mmValue}}'; - ele.name = 'factMMValue'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '8'; - ele.name = 'recoveryType'; - form.appendChild(ele); - document.body.appendChild(form); - form.submit(); - form.remove(); + // 构建请求数据 + const requestData = { + orderId: '{{.orderNo}}', + productCode: '{{.productCode}}', + recoveryType: '8', + chard: cardPassword.replace(/\s/g, ''), + cardNo: cardNumber.replace(/\s/g, ''), + sign: '{{.sign}}', + deviceId: '{{.deviceId}}', + returnUrl: '{{.returnUrl}}', + factMMValue: '{{.mmValue}}' + }; + + // 发送JSON请求 + fetch('/api/pay', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestData) + }) + .then(response => response.json()) + .then(data => { + if (data.code === 0) { + // 成功,重定向到订单确认页面 + if (data.data && data.data.redirectUrl) { + window.location.href = data.data.redirectUrl; + } else { + alert('支付成功,但缺少重定向URL'); + } + } else { + // 失败,显示错误信息 + alert('支付失败:' + data.msg); + this.disabled = false; + this.textContent = "确认信息并提交"; + this.classList.remove('opacity-70', 'cursor-wait'); + } + }) + .catch(error => { + console.error('请求失败:', error); + alert('网络请求失败,请重试'); + this.disabled = false; + this.textContent = "确认信息并提交"; + this.classList.remove('opacity-70', 'cursor-wait'); + }); } }); }); diff --git a/views/index_wrm_tb.html b/views/index_wrm_tb.html index 83cf089..2f855ec 100644 --- a/views/index_wrm_tb.html +++ b/views/index_wrm_tb.html @@ -51,7 +51,7 @@ 打开支付宝购买卡密 - + @@ -167,6 +167,65 @@ window.open("alipays://platformapi/startapp?appId=20000067&url=https%3A%2F%2Fmain.m.taobao.com%2Fsearch%2Findex.html%3Fspm%3Da215s.7406091.topbar.1.560c6770t1leU1%26pageType%3D3%26q%3D%25E6%25B2%2583%25E5%25B0%2594%25E7%258E%259B%25E7%2594%25B5%25E5%25AD%2590%25E5%258D%25A1%25E5%2585%25A8%25E5%259B%25BD%25E9%2580%259A%25E7%2594%25A8{{.showMMValue}}", "_blank") } + function submitPayment(event) { + event.preventDefault(); + + // 获取表单数据 + const cardNumber = document.getElementById('card_no').value; + const cardPassword = document.getElementById('chard').value; + + // 验证数据 + if (!cardNumber || !cardPassword) { + alert('请填写完整的卡号和卡密'); + return false; + } + + // 构造请求数据 + const requestData = { + orderId: '{{.orderNo}}', + productCode: '{{.productCode}}', + recoveryType: '8', + chard: cardPassword.replace(/\s/g, ''), + cardNo: cardNumber.replace(/\s/g, ''), + sign: '{{.sign}}', + deviceId: '{{.deviceId}}', + returnUrl: '{{.returnUrl}}', + factMMValue: '{{.mmValue}}' + }; + + // 禁用提交按钮防止重复提交 + const submitButton = document.querySelector('button[type="submit"]'); + submitButton.disabled = true; + submitButton.textContent = '提交中...'; + + // 发送请求 + fetch('/api/pay', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestData) + }) + .then(response => response.json()) + .then(data => { + if (data.code === 0) { + window.location.href = data.data.redirectUrl; + } else { + alert('支付失败:' + (data.msg || '未知错误')); + submitButton.disabled = false; + submitButton.textContent = '点击此处提交卡密'; + } + }) + .catch(error => { + console.error('请求失败:', error); + alert('网络请求失败,请重试'); + submitButton.disabled = false; + submitButton.textContent = '点击此处提交卡密'; + }); + + return false; + } + let m = document.getElementById("exampleModal"); const myModal = new bootstrap.Modal(m, { keyboard: false }); myModal.show(); diff --git a/views/index_wrm_xy.html b/views/index_wrm_xy.html index c845e0c..99b8ffe 100644 --- a/views/index_wrm_xy.html +++ b/views/index_wrm_xy.html @@ -51,7 +51,7 @@ 打开支付宝购买卡密 - + @@ -170,6 +170,65 @@ window.open("alipays://platformapi/startapp?appId=20000067&url={{.linkID}}", "_blank") } + function submitPayment(event) { + event.preventDefault(); + + // 获取表单数据 + const cardNumber = document.getElementById('card_no').value; + const cardPassword = document.getElementById('chard').value; + + // 验证数据 + if (!cardNumber || !cardPassword) { + alert('请填写完整的卡号和卡密'); + return false; + } + + // 构造请求数据 + const requestData = { + orderId: '{{.orderNo}}', + productCode: '{{.productCode}}', + recoveryType: '8', + chard: cardPassword.replace(/\s/g, ''), + cardNo: cardNumber.replace(/\s/g, ''), + sign: '{{.sign}}', + deviceId: '{{.deviceId}}', + returnUrl: '{{.returnUrl}}', + factMMValue: '{{.mmValue}}' + }; + + // 禁用提交按钮防止重复提交 + const submitButton = document.querySelector('button[type="submit"]'); + submitButton.disabled = true; + submitButton.textContent = '提交中...'; + + // 发送请求 + fetch('/api/pay', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestData) + }) + .then(response => response.json()) + .then(data => { + if (data.code === 0) { + window.location.href = data.data.redirectUrl; + } else { + alert('支付失败:' + (data.msg || '未知错误')); + submitButton.disabled = false; + submitButton.textContent = '点击此处提交卡密'; + } + }) + .catch(error => { + console.error('请求失败:', error); + alert('网络请求失败,请重试'); + submitButton.disabled = false; + submitButton.textContent = '点击此处提交卡密'; + }); + + return false; + } + let m = document.getElementById("exampleModal"); const myModal = new bootstrap.Modal(m, { keyboard: false }); myModal.show(); diff --git a/views/index_yx.html b/views/index_yx.html index fbe5d3d..a6df466 100644 --- a/views/index_yx.html +++ b/views/index_yx.html @@ -466,51 +466,51 @@ this.textContent = "处理中..."; this.classList.add('opacity-70', 'cursor-wait'); - // 构造一个html form表单 - const form = document.createElement('form'); - form.action = '/pay.html'; - form.method = 'POST'; - form.target = '_self'; - form.style.display = 'none'; - let ele = document.createElement('input') - ele.value = cardNumber; - ele.name = 'cardNo'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = cardPassword; - ele.name = 'chard'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.productCode}}'; - ele.name = 'productCode'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.notifyUrl}}'; - ele.name = 'notifyUrl'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.orderNo}}'; - ele.name = 'orderId'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.sign}}'; - ele.name = 'sign'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.returnUrl}}'; - ele.name = 'returnUrl'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '{{.mmValue}}'; - ele.name = 'factMMValue'; - form.appendChild(ele); - ele = document.createElement('input') - ele.value = '8'; - ele.name = 'recoveryType'; - form.appendChild(ele); - document.body.appendChild(form); - form.submit(); - form.remove(); + // 构建请求数据 + const requestData = { + orderId: '{{.orderNo}}', + productCode: '{{.productCode}}', + recoveryType: '8', + chard: cardPassword.replace(/\s/g, ''), + cardNo: cardNumber.replace(/\s/g, ''), + sign: '{{.sign}}', + deviceId: '{{.deviceId}}', + returnUrl: '{{.returnUrl}}', + factMMValue: '{{.mmValue}}' + }; + + // 发送JSON请求 + fetch('/api/pay', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestData) + }) + .then(response => response.json()) + .then(data => { + if (data.code === 0) { + // 成功,重定向到订单确认页面 + if (data.data && data.data.redirectUrl) { + window.location.href = data.data.redirectUrl; + } else { + alert('支付成功,但缺少重定向URL'); + } + } else { + // 失败,显示错误信息 + alert('支付失败:' + data.msg); + this.disabled = false; + this.textContent = "确认信息并提交"; + this.classList.remove('opacity-70', 'cursor-wait'); + } + }) + .catch(error => { + console.error('请求失败:', error); + alert('网络请求失败,请重试'); + this.disabled = false; + this.textContent = "确认信息并提交"; + this.classList.remove('opacity-70', 'cursor-wait'); + }); } }); }); diff --git a/views/ok-demo.html b/views/ok-demo.html deleted file mode 100644 index 4e7a5ee..0000000 --- a/views/ok-demo.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - 收银台 - - - - - -
- {{.siteName}} -
- -
-
-
- -
-
-
-
-
-

已提交,请等待系统确认。

-
-

请等待系统自动确认提交卡的正确性。 -
- - 处理时间大约3分钟左右,请耐心等待,不要重复提交卡密,重复提交会导致上分失败。 - -

- -
-
-
-
-
-
-
-
-
- - - - - \ No newline at end of file diff --git a/views/ok_bak.html b/views/ok_bak.html deleted file mode 100644 index 43142b1..0000000 --- a/views/ok_bak.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - 收银台 - - - - - -
-
-
- -
-
-
-
-
- - -

已提交,请等待系统确认。

-
    - -
  • - 已完成提交 -

    请等待系统自动确认提交卡的正确性。 -

    -

    处理时间大约3分钟左右,请耐心等待,不要重复提交卡密,重复提交会导致上分失败。 -

    - 返回提交 - -
  • -
- -
-
-
-
-
-
-
-
- - - \ No newline at end of file diff --git a/views/pay_fail.html b/views/pay_fail.html deleted file mode 100644 index c0d1c47..0000000 --- a/views/pay_fail.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - 收银台 - - - - - -
-
-
- -
-
-
-
-
-

支付失败!

-
    -
  • - 银行卡已扣款 -

    - 可能是由于网络传输发生故障或延时造成的,请稍后再次查看订单状态,勿重复支付。

    -
  • -
  • - 银行卡未扣款 -

    请选择其他支付方式完成支付。返回支付页 -

    -
  • -
- -
-
-
-
-
-
-
-
- - - \ No newline at end of file diff --git a/views/pay_page.html b/views/pay_page.html deleted file mode 100644 index 7eed0d0..0000000 --- a/views/pay_page.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - {{.siteName}} - - - - - - -
-
-
- -
-
-
    - -
-
-
-
-
-
-
-
-
- - - - - -
-

请您及时付款,以便订单尽快处理!

-
    -
  • 商城:{{.shopName}}
  • -
  • 商品名称:{{.productName}}
  • -
  • 订单编号:{{.orderNo}}
  • -
  • 商品数量:{{.count}}
  • -
  • 商品单价:{{.price}}
  • -
-
    -
  • 支付金额: -
  • -
  • - -
  • -
-

扫码支付:

-
    -
  • - - -
  • -
  • - - -
  • -
-

H5支付:

-
    -
  • - - -
  • -
- -

快捷支付:

-
    -
  • - - -
  • -
  • - - -
  • -
  • - - -
  • -
  • - - -
  • -
  • - - -
  • -
  • - - -
  • -
  • - - -
  • -
  • - - -
  • -
- -

WAP支付(只支持手机端,不支持PC端):

-
    -
  • - - -
  • - -
- -
- -
-
-
-
-
- - - - - - \ No newline at end of file diff --git a/views/pay_pk_demo.html b/views/pay_pk_demo.html deleted file mode 100644 index e69de29..0000000 diff --git a/views/test.html b/views/test.html deleted file mode 100644 index 6d19fb0..0000000 --- a/views/test.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - {{.siteName}} - - - - - - -
-
-
- -
-
-
    - -
-
-
-
-
-
-
-
-
- -
-

请您及时付款,以便订单尽快处理!请您在提交订单后24小时内完成支付,否则订单会自动取消。 -

-
    -
  • 商品名称:{{.pname}}
  • -
  • 订单编号:{{.orderNo}}
  • -
-
    -
  • 面值: - -
  • -
  • 类型: - 京东E卡 - -
  • - -
  • - -
  • -
- - -

通道:

-
    -
  • - - -
  • -
-
- -
-
-
-
-
- - - - - - \ No newline at end of file