import { Ionicons } from '@expo/vector-icons' import { root } from '@repo/core' import { AlipayController } from '@repo/sdk' import { LinearGradient } from 'expo-linear-gradient' import Alipay from 'expo-native-alipay' import { Stack, useRouter } from 'expo-router' import ExpoWeChat from 'expo-wechat' import { observer } from 'mobx-react-lite' import React, { useEffect, useState } from 'react' import { Dimensions, Platform, RefreshControl, ScrollView } from 'react-native' import { useSafeAreaInsets } from 'react-native-safe-area-context' import { Block, Img, Text, Toast } from '@/@share/components' import { IOS_UNIVERSAL_LINK, SCHEME } from '@/app.config' import { handleError } from '@/hooks/data/use-error' import { userBalanceStore } from '@/stores' import { openUrl } from '@/utils' import { cn } from '@/utils/cn' const { width: SCREEN_WIDTH } = Dimensions.get('window') const OPTION_WIDTH = (SCREEN_WIDTH - 32 - 15) / 2 // 32px padding, 15px gap const RECHARGE_OPTIONS = [ { id: 1, points: '500', price: '¥70' }, { id: 2, points: '1,000', price: '¥140' }, { id: 3, points: '2,500', price: '¥350' }, { id: 4, points: '5,000', price: '¥700' }, ] const PAYMENT_METHODS = [ { id: 'alipay', label: '支付宝' }, // { id: 'wechat', label: '微信' }, ] as const const ChargePage = observer(function ChargePage() { const router = useRouter() const insets = useSafeAreaInsets() const [selectedOption, setSelectedOption] = useState(RECHARGE_OPTIONS[0].id) const [paymentMethod, setPaymentMethod] = useState<'alipay' | 'wechat'>('alipay') const [refreshing, setRefreshing] = useState(false) // 使用MobX Store中的余额信息 const { balance } = userBalanceStore const selectedRecharge = RECHARGE_OPTIONS.find((option) => option.id === selectedOption) const onRefresh = async () => { setRefreshing(true) await userBalanceStore.load(true) // 强制刷新余额 setRefreshing(false) } const initPay = async () => { // 设置支付宝回调 URL Scheme(使用 App 的统一 scheme) if (Platform.OS === 'ios') { Alipay.setAlipayScheme(SCHEME) } else { // Alipay.setAlipaySandbox(true) // 开启沙箱模式,测试环境使用 } console.log('-------alipay version:', await Alipay.getVersion()) const wechatAppId = 'wx940e1ed91a5c303c' const result = await ExpoWeChat.registerApp(wechatAppId, IOS_UNIVERSAL_LINK) console.log('-------wechat', result) } const handlePay = async () => { // Toast.show({ title: '支付宝支付暂未开放' }) // return // 支付宝端支付 // payInfo 是后台拼接好的支付参数 // return_url= // const payInfo = // 'alipay_sdk=alipay-sdk-java-dynamicVersionNo&app_id=2021001172656340&biz_content=%7B%22out_trade_no%22%3A%221111112222222%22%2C%22total_amount%22%3A%220.01%22%2C%22subject%22%3A%221234%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%7D&charset=UTF-8&format=json&method=alipay.trade.app.pay¬ify_url=http%3A%2F%2Fane.boshu.ltd%2Fowner%2Fpay%2Fapi%2FownerPay%2Fcallback&sign=oUQmGtkv8mrhJ0YwHl9%2FfxMcoLACWuSFKiMTC4Id8nc%2FZVvDQ6MLQq5hhtEN03Qn1%2BAtzTAaofE8nNixdroxOek2l5YtOAcYcXVYlJIyogN%2B22erN2NpDTWJ7tQTKgYFDJLRiG0DZJaxfADhUUF6UR9kdA8omoXKLDlP17ZPUs5Jr4aKv5HJtH5C53ui7PbmyWYg934L4UDC2F%2F9pPQlRwwDeE1SAaV3HW9Dt83kK52o8%2FlChXdotbFdAvH0d4qYGhpEYU5sepj9xiOMyL9aC4pMXW9INYLLGbvtqtlRchZTAfH5yji6nqqQm9KKMmcVrWdBDLyjFVNpejq1UjbJBw%3D%3D&sign_type=RSA2×tamp=2020-07-09+12%3A16%3A16&version=1.0' if (paymentMethod === 'alipay') { if (!selectedRecharge?.points) { Toast.show({ title: '请选择充值选项' }) return } const alipay = root.get(AlipayController) const { data, error } = await handleError( async () => await alipay.preRecharge({ credits: 2, // credits: parseInt(selectedRecharge?.points.replace(/,/g, '')), }), ) console.log('error----------', error) console.log('data-----------', data) if (error || !data?.orderStr) { Toast.show({ title: error?.message || '创建订单失败' }) return } const resule = await Alipay.pay(data.orderStr) console.log('alipay:resule-->>>', resule) // 支付完成后显示积分到账loading if (resule.resultStatus === '9000') { // 支付成功,立即刷新余额并重启轮询 userBalanceStore.load(true) userBalanceStore.restartPolling() // 重启轮询以更频繁地检查余额变化 Toast.show({ title: '支付成功!积分正在到账中...' }) } else { Toast.show({ title: '支付取消或失败' }) userBalanceStore.load(true) // 刷新余额状态 } } else if (paymentMethod === 'wechat') { } } const openWeb = () => { // webview 显示异常 // router.push({ // pathname: '/webview', // params: { // // url: 'http://baidu.com', // url: 'https://mixvideo.bowong.cc/terms', // title: '付费服务协议', // }, // }) openUrl('https://mixvideo.bowong.cc/terms', '付费服务协议') } useEffect(() => { userBalanceStore.load(true) // 页面加载时获取余额 initPay() }, []) const renderHeader = () => ( router.back()}> 积分充值 ) const renderMyPoints = () => ( 我的积分 {balance} ) const renderOptions = () => ( 选择充值积分: {RECHARGE_OPTIONS.map((item) => { const isSelected = selectedOption === item.id return ( setSelectedOption(item.id)} > {/* Flash Icon */} {/* Points */} {item.points} {/* Price Button */} 只需 {item.price} ) })} ) const renderPaymentMethods = () => ( 选择付款方式: {PAYMENT_METHODS.map((method) => { const isSelected = paymentMethod === method.id return ( setPaymentMethod(method.id)} > {isSelected && } {method.label} ) })} ) const renderBottomBar = () => ( 确认充值 已阅读并同意 付费服务协议 ) return ( {renderHeader()} } > {renderMyPoints()} {renderOptions()} {renderPaymentMethods()} {renderBottomBar()} ) }) export default ChargePage