You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
3.5 KiB

import { View, StyleSheet, Alert } from 'react-native';
import { useRoute, RouteProp, useNavigation } from '@react-navigation/native';
import { useEffect, useState } from 'react';
import { payApi, PaymentInfoResponse } from '../../services/api/payApi';
import { WebView } from "react-native-webview";
import * as Linking from 'expo-linking';
import { navigate } from '../../navigation/RootNavigation';
type PayScreenRouteProp = RouteProp<{
Pay: { payUrl: string };
}, 'Pay'>;
export const Pay = () => {
const [loading, setLoading] = useState(true);
const route = useRoute<PayScreenRouteProp>();
const navigation = useNavigation();
const {payUrl} = route.params;
const [payInfo, setPayInfo] = useState<PaymentInfoResponse>();
useEffect(() => {
console.log(route.params);
console.log(payUrl);
// 设置处理深度链接的监听器
const handleDeepLink = ({ url }: { url: string }) => {
console.log('Deep link received:', url);
if (
url.startsWith('myapp://payment-success') ||
url.startsWith('exp://192.168.0.101:8084/--/payment-success')
) {
const parsed = Linking.parse(url);
const params = parsed.queryParams || {};
navigate('PaymentSuccessScreen', params);
}
};
// 添加深度链接事件监听器
const subscription = Linking.addEventListener('url', handleDeepLink);
return () => {
// 清理订阅
subscription.remove();
};
}, []);
const handleNavigationStateChange = (navState: any) => {
console.log(navState);
// 检查URL是否包含支付成功的回调参数
const { url } = navState;
if (url && url.includes('payment_success=true')) {
// 如果网页URL中包含成功参数,可以在这里处理
Alert.alert('检测到支付成功!');
// navigation.navigate('PaymentConfirmation');
}
}
return <View style={{ flex: 1 }}>
{payUrl ? (
<WebView
source={{ uri: payUrl }}
style={styles.webview}
onNavigationStateChange={handleNavigationStateChange}
onLoadStart={() => setLoading(true)}
onLoadEnd={() => setLoading(false)}
javaScriptEnabled={true}
domStorageEnabled={true}
startInLoadingState={true}
scalesPageToFit={true}
originWhitelist={['*']}
userAgent="Mozilla/5.0 (Linux; Android 10; Pixel 3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Mobile Safari/537.36"
onShouldStartLoadWithRequest={(request) => {
console.log('Load request:', request);
// 检查URL是否是支付成功的深度链接
const { url } = request;
if (
url && (
url.startsWith('myapp://payment-success') ||
url.startsWith('exp://192.168.0.101:8084/--/payment-success')
)
) {
// 解析参数
const parsed = Linking.parse(url);
const params = parsed.queryParams || {};
// 跳转到支付成功页面
navigate('PaymentSuccessScreen', params);
return false; // 不在WebView中加载
}
// 允许所有其他请求
return true;
}}
/>
) : (
<View>
{/* Add fallback content here */}
</View>
)}
</View>
}
const styles = StyleSheet.create({
webview: {
flex: 1,
},
});