fix: 云闪付SDK改为运行时注入——HBuilderX命令行构建不吃根目录index.html模板(会丢标签),与人脸SDK同款动态加载并带重试兜底

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
jacobxu666
2026-09-24 12:38:49 +08:00
co-authored by Claude Fable 5
parent 45f608c408
commit bf3bbaa5de
+24 -7
View File
@@ -83,10 +83,22 @@ export default {
uni.redirectTo({ url: '/pages/index/login?redirect=' + encodeURIComponent('/pages/venue/detail?id=851219003520709&type=2') }) uni.redirectTo({ url: '/pages/index/login?redirect=' + encodeURIComponent('/pages/venue/detail?id=851219003520709&type=2') })
return return
} }
this.loadUpSdk() // xuchao: 运行时注入云闪付 SDK(构建模板不可靠,见 loadUpSdk 注释)
if (options.orderNo) this.orderNo = options.orderNo if (options.orderNo) this.orderNo = options.orderNo
this.initFromServer() this.initFromServer()
}, },
methods: { methods: {
// xuchao: upsdk 运行时注入。不能依赖 index.html 静态标签——HBuilderX 命令行构建的 H5 模板
// 不受项目根 index.html 控制(产物会丢标签),与人脸 SDK 同款动态加载兜底。
loadUpSdk() {
if (typeof window !== 'undefined' && window.upsdk) return
if (typeof document === 'undefined') return
if (document.querySelector('script[data-upsdk]')) return
const s = document.createElement('script')
s.src = 'https://open.95516.com/s/open/js/upsdk.js'
s.setAttribute('data-upsdk', '1')
document.head.appendChild(s)
},
// xuchao: 价格展示以服务端 latest 为准(测试期 0.01);已有待支付单自动续用;已发券直接跳券详情 // xuchao: 价格展示以服务端 latest 为准(测试期 0.01);已有待支付单自动续用;已发券直接跳券详情
initFromServer() { initFromServer() {
this.$u.api.voucherLatest({ phone: this.phone }).then(res => { this.$u.api.voucherLatest({ phone: this.phone }).then(res => {
@@ -135,17 +147,14 @@ export default {
}, },
// xuchao: 云闪付控件唤起,交互与湘工惠商城一致(xghmall ordersure.vue:195-229 同型) // xuchao: 云闪付控件唤起,交互与湘工惠商城一致(xghmall ordersure.vue:195-229 同型)
launchUnionPay(tn) { launchUnionPay(tn) {
if (typeof window === 'undefined' || !window.upsdk) { this.loadUpSdk()
this.submitting = false const tryPay = (retries) => {
uni.showToast({ title: '支付组件未就绪,请在云闪付内重进页面', icon: 'none' }) if (typeof window !== 'undefined' && window.upsdk) {
return
}
const orderNo = this.orderNo
window.upsdk.pluginReady(() => { window.upsdk.pluginReady(() => {
window.upsdk.pay({ window.upsdk.pay({
tn: tn, tn: tn,
success: () => { success: () => {
uni.redirectTo({ url: '/pages/petrol/voucherDetail?orderNo=' + orderNo }) uni.redirectTo({ url: '/pages/petrol/voucherDetail?orderNo=' + this.orderNo })
}, },
fail: () => { fail: () => {
this.submitting = false this.submitting = false
@@ -155,6 +164,14 @@ export default {
}) })
// 控件无异步结果时兜底:3 秒后恢复按钮(支付成功路径以回跳/轮询为准) // 控件无异步结果时兜底:3 秒后恢复按钮(支付成功路径以回跳/轮询为准)
setTimeout(() => { this.submitting = false }, 3000) setTimeout(() => { this.submitting = false }, 3000)
} else if (retries > 0) {
setTimeout(() => tryPay(retries - 1), 500)
} else {
this.submitting = false
uni.showToast({ title: '支付组件加载失败,请在云闪付内重进页面', icon: 'none' })
}
}
tryPay(8) // SDK 注入后最多等 4 秒
}, },
goBack() { goBack() {
const pages = getCurrentPages() const pages = getCurrentPages()