Files
qnc-webview-v3/src/components/Payment.vue
2026-03-02 12:58:07 +08:00

180 lines
7.6 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<van-popup v-model:show="show" position="bottom" class="flex flex-col justify-between p-6"
:style="{ height: '50%' }">
<div class="text-center">
<h3 class="text-lg font-bold">支付</h3>
</div>
<div class="text-center">
<div class="font-bold text-xl">{{ data.product_name }}</div>
<div class="text-3xl text-red-500 font-bold">
<!-- 显示原价和折扣价格 -->
<div v-if="discountPrice" class="line-through text-gray-500 mt-4"
:class="{ 'text-2xl': discountPrice }">
¥ {{ data.sell_price }}
</div>
<div>
¥
{{
discountPrice
? (data.sell_price * 0.2).toFixed(2)
: data.sell_price
}}
</div>
</div>
<!-- 仅在折扣时显示活动说明 -->
<div v-if="discountPrice" class="text-sm text-red-500 mt-1">
活动价2折优惠
</div>
</div>
<!-- 支付方式选择 -->
<div class="">
<van-cell-group inset>
<!-- 开发环境测试支付选项 -->
<van-cell v-if="isDevMode" title="测试支付(开发环境)" clickable @click="selectedPaymentMethod = 'test'">
<template #icon>
<van-icon size="24" name="setting" color="#FF9800" class="mr-2" />
</template>
<template #right-icon>
<van-radio v-model="selectedPaymentMethod" name="test" />
</template>
</van-cell>
<van-cell v-if="isWeChat" title="微信支付" clickable @click="selectedPaymentMethod = 'wechat'">
<template #icon>
<van-icon size="24" name="wechat-pay" color="#1AAD19" class="mr-2" />
</template>
<template #right-icon>
<van-radio v-model="selectedPaymentMethod" name="wechat" />
</template>
</van-cell>
<!-- 支付宝支付 -->
<van-cell v-else title="支付宝支付" clickable @click="selectedPaymentMethod = 'alipay'">
<template #icon>
<van-icon size="24" name="alipay" color="#00A1E9" class="mr-2" />
</template>
<template #right-icon>
<van-radio v-model="selectedPaymentMethod" name="alipay" />
</template>
</van-cell>
</van-cell-group>
</div>
<!-- 确认按钮 -->
<div class="">
<van-button class="w-full" round type="primary" @click="getPayment">确认支付</van-button>
</div>
</van-popup>
</template>
<script setup>
import { ref, computed, onMounted } from "vue";
import { useRouter } from "vue-router";
const { isWeChat } = useEnv();
import { showConfirmDialog, showToast } from "vant";
const props = defineProps({
data: {
type: Object,
required: true,
},
id: {
type: String,
required: true,
},
type: {
type: String,
required: true,
},
returnUrl: {
type: String,
default: "",
},
});
const show = defineModel();
// 判断是否为开发环境
const isDevMode = computed(() => {
return import.meta.env.MODE === 'development' || import.meta.env.DEV;
});
// 默认支付方式:开发环境优先使用测试支付,否则根据平台选择
const selectedPaymentMethod = ref(
isDevMode.value ? "test" : (isWeChat.value ? "wechat" : "alipay")
);
onMounted(() => {
if (!isDevMode.value) {
// 非开发环境,根据平台选择支付方式
if (isWeChat.value) {
selectedPaymentMethod.value = "wechat";
} else {
selectedPaymentMethod.value = "alipay";
}
}
});
const orderNo = ref("");
const router = useRouter();
const discountPrice = ref(false); // 是否应用折扣
async function getPayment() {
showConfirmDialog({
title: '重要安全声明',
message:
'为保障您的个人信息与资金安全,请您务必知悉以下事项:\n\n关于平台业务本平台官方服务仅限于大数据报告查询不涉及也从未开展“央行征信修复”、“贷款办理”或“征信洗白”等相关业务。请注意本平台出具的报告仅供决策参考不可作为任何官方征信凭证或贷款依据。\n\n关于诈骗警示任何自称与本平台合作或以“内部渠道”、“百分百包下款”、“修复征信”等为由诱导您进行支付的行为均属欺诈。请您切勿相信谨慎对待任何支付要求。\n\n关于安全提示请您时刻保持警惕妥善保管个人敏感信息。如遇任何索款要求或可疑承诺请务必首先通过我平台官方公布的联系方式进行核实切勿轻信他人。',
})
.then(async () => {
const { data, error } = await useApiFetch("/pay/payment")
.post({
id: props.id,
pay_method: selectedPaymentMethod.value,
pay_type: props.type,
})
.json();
if (data.value && !error.value) {
// 测试支付模式:直接跳转到结果页面
if (selectedPaymentMethod.value === "test" || selectedPaymentMethod.value === "test_empty") {
orderNo.value = data.value.data.order_no;
const query = { orderNo: data.value.data.order_no };
if (props.returnUrl) query.returnUrl = props.returnUrl;
router.push({ path: "/payment/result", query });
} else if (selectedPaymentMethod.value === "alipay") {
orderNo.value = data.value.data.order_no;
// 存储订单ID以便支付宝返回时获取
const prepayUrl = data.value.data.prepay_id;
const paymentForm = document.createElement("form");
paymentForm.method = "POST";
paymentForm.action = prepayUrl;
paymentForm.style.display = "none";
document.body.appendChild(paymentForm);
paymentForm.submit();
} else {
const payload = data.value.data.prepay_data;
WeixinJSBridge.invoke(
"getBrandWCPayRequest",
payload,
function (res) {
if (res.err_msg == "get_brand_wcpay_request:ok") {
// 支付成功:短延迟再跳转,给后端回调与异步任务留出时间,避免结果页查报告报错
showToast({ message: "支付成功,正在跳转...", type: "success" });
setTimeout(() => {
const query = { orderNo: data.value.data.order_no };
if (props.returnUrl) query.returnUrl = props.returnUrl;
router.push({ path: "/payment/result", query });
}, 1500);
}
}
);
}
}
show.value = false;
})
.catch(() => {
return;
});
}
</script>
<style scoped></style>