fix:pay
All checks were successful
构建并部署前端到生产环境 / build-and-deploy (push) Successful in 52s

This commit is contained in:
luo
2026-06-26 18:01:01 +08:00
parent 59e4e1203e
commit 85cdeac804
2 changed files with 76 additions and 35 deletions

View File

@@ -1,12 +1,6 @@
<template> <template>
<view class="container alipay-page"> <view class="container alipay-page">
<view v-if="!hasPaymentUrl" class="empty-card"> <view class="pay-content">
<view class="empty-title">支付链接已失效</view>
<view class="empty-desc">请返回后重新发起支付宝支付</view>
<up-button class="primary-button" type="primary" @tap="goBack">返回</up-button>
</view>
<view v-else class="pay-content">
<view class="method-card"> <view class="method-card">
<view class="method-header"> <view class="method-header">
<view class="method-index">方式一</view> <view class="method-index">方式一</view>
@@ -31,23 +25,64 @@
</template> </template>
<script setup> <script setup>
import { computed, ref } from 'vue'; import { ref } from 'vue';
import { onShow } from '@dcloudio/uni-app'; import { onShow } from '@dcloudio/uni-app';
import { getPendingAlipayPaymentData } from '@/utils/payment.js'; import { getPendingAlipayPaymentData } from '@/utils/payment.js';
const browserUrl = ref(''); const browserUrl = ref('');
const qrUrl = ref(''); const qrUrl = ref('');
const hasRedirected = ref(false);
const hasPaymentUrl = computed(() => !!browserUrl.value || !!qrUrl.value); const isInWechat = () => /micromessenger/i.test(navigator.userAgent);
const decodePaymentUrl = (value) => {
if (!value) {
return '';
}
try {
const normalized = value.replace(/-/g, '+').replace(/_/g, '/');
const padding = '='.repeat((4 - normalized.length % 4) % 4);
return decodeURIComponent(escape(atob(normalized + padding)));
} catch (e) {
return '';
}
};
const getQueryParam = (key) => {
// #ifdef H5
const params = new URLSearchParams(window.location.search);
return params.get(key) || '';
// #endif
// #ifndef H5
return '';
// #endif
};
const getPayUrlFromQuery = () => {
return decodePaymentUrl(getQueryParam('pay64'));
};
const getQrUrlFromQuery = () => {
return decodePaymentUrl(getQueryParam('qr64'));
};
const redirectToAlipayInBrowser = () => {
// #ifdef H5
if (hasRedirected.value || isInWechat() || !browserUrl.value) {
return;
}
hasRedirected.value = true;
window.location.href = browserUrl.value;
// #endif
};
const loadPaymentData = () => { const loadPaymentData = () => {
const data = getPendingAlipayPaymentData(); const data = getPendingAlipayPaymentData();
browserUrl.value = data?.copyUrl || data?.qrUrl || ''; browserUrl.value = getPayUrlFromQuery() || data?.copyUrl || data?.qrUrl || '';
qrUrl.value = data?.qrUrl || data?.copyUrl || ''; qrUrl.value = getQrUrlFromQuery() || data?.qrUrl || data?.copyUrl || browserUrl.value;
}; redirectToAlipayInBrowser();
const goBack = () => {
uni.navigateBack();
}; };
onShow(() => { onShow(() => {
@@ -69,8 +104,7 @@
gap: 24rpx; gap: 24rpx;
} }
.method-card, .method-card {
.empty-card {
background: var(--bg-primary); background: var(--bg-primary);
border-radius: 28rpx; border-radius: 28rpx;
padding: 32rpx; padding: 32rpx;
@@ -78,7 +112,6 @@
border: 1rpx solid rgba(10, 132, 255, 0.08); border: 1rpx solid rgba(10, 132, 255, 0.08);
} }
.empty-desc,
.qr-desc { .qr-desc {
margin-top: 14rpx; margin-top: 14rpx;
font-size: 26rpx; font-size: 26rpx;
@@ -119,11 +152,6 @@
text-align: center; text-align: center;
} }
.primary-button {
width: 100%;
margin-top: 18rpx;
}
.tips-image { .tips-image {
display: block; display: block;
width: 100%; width: 100%;
@@ -142,14 +170,4 @@
border: 1rpx dashed rgba(10, 132, 255, 0.24); border: 1rpx dashed rgba(10, 132, 255, 0.24);
} }
.empty-card {
margin-top: 160rpx;
text-align: center;
}
.empty-title {
font-size: 34rpx;
font-weight: 700;
color: var(--text-primary);
}
</style> </style>

View File

@@ -58,11 +58,34 @@ export function getPendingAlipayPaymentData() {
return uni.getStorageSync(ALIPAY_PAYMENT_DATA_KEY) || null; return uni.getStorageSync(ALIPAY_PAYMENT_DATA_KEY) || null;
} }
function getAlipayPaymentPageUrl(refreshTarget) { function encodePaymentUrl(value) {
try {
return btoa(unescape(encodeURIComponent(value)))
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=+$/, '');
} catch (e) {
return '';
}
}
function getAlipayPaymentPageUrl(refreshTarget, payUrl, qrUrl) {
const params = [`t=${Date.now()}`]; const params = [`t=${Date.now()}`];
if (refreshTarget) { if (refreshTarget) {
params.push(`from=${encodeURIComponent(refreshTarget)}`); params.push(`from=${encodeURIComponent(refreshTarget)}`);
} }
if (payUrl) {
const encodedPayUrl = encodePaymentUrl(payUrl);
if (encodedPayUrl) {
params.push(`pay64=${encodedPayUrl}`);
}
}
if (qrUrl) {
const encodedQrUrl = encodePaymentUrl(qrUrl);
if (encodedQrUrl) {
params.push(`qr64=${encodedQrUrl}`);
}
}
return `/pages/alipay-payment/alipay-payment?${params.join('&')}`; return `/pages/alipay-payment/alipay-payment?${params.join('&')}`;
} }
@@ -120,7 +143,7 @@ export function openAlipayPayment(paymentLink, refreshTarget) {
timestamp: Date.now() timestamp: Date.now()
}); });
navigateToAlipayPaymentPage(getAlipayPaymentPageUrl(refreshTarget), resolve, reject); navigateToAlipayPaymentPage(getAlipayPaymentPageUrl(refreshTarget, copyUrl, qrUrl), resolve, reject);
}); });
} }