import React, { useState } from 'react' import { View, Text, Input, ScrollView } from '@tarojs/components' import Taro, { useDidShow } from '@tarojs/taro' import { useRequest } from '@/hooks/useRequest' import { createUserRecharge, payUserRecharge, type UserRecharge } from '@/api/shop/shopRecharge' import { getUserBalance } from '@/api/system/user/balance' definePageConfig({ navigationBarTitleText: '充值', }) const amounts = [10, 20, 50, 100, 200, 500] const RechargePage: React.FC = () => { const [selected, setSelected] = useState(0) const [customAmount, setCustomAmount] = useState('') const [balance, setBalance] = useState('') // 获取当前余额 const { run: runGetBalance } = useRequest(getUserBalance, { manual: true, onSuccess: (data) => { setBalance(data.balance) } }) // 页面显示时刷新余额 useDidShow(() => { runGetBalance() }) // 发起支付 const handlePay = async (rechargeOrder: UserRecharge) => { try { const payParams = await payUserRecharge(rechargeOrder.rechargeId!) if (payParams) { // 后端返回已支付(回调丢失自动修复场景) if ((payParams as Record).paid === 'true') { Taro.showToast({ title: '充值成功', icon: 'success' }) try { const balanceData = await getUserBalance() setBalance(balanceData.balance) } catch (e) { } setTimeout(() => { Taro.navigateBack() }, 1500) return } // 调用微信支付 await Taro.requestPayment({ timeStamp: payParams.timeStamp, nonceStr: payParams.nonceStr, package: payParams.package, signType: payParams.signType, paySign: payParams.paySign, success: async () => { Taro.showToast({ title: '充值成功', icon: 'success' }) // 立即刷新余额 try { const balanceData = await getUserBalance() setBalance(balanceData.balance) } catch (e) { // 忽略刷新失败 } setTimeout(() => { Taro.navigateBack() }, 1500) }, fail: (err) => { if (err.errMsg.indexOf('cancel') > -1) { Taro.showToast({ title: '已取消支付', icon: 'none' }) } else { Taro.showToast({ title: '支付失败', icon: 'none' }) } } }) } } catch (err: unknown) { const message = err instanceof Error ? err.message : '支付失败' Taro.showToast({ title: message, icon: 'none' }) } } // 创建充值订单 const { run: runCreate, loading: creating } = useRequest(createUserRecharge, { manual: true, onSuccess: (data) => { if (data) { handlePay(data) } }, onError: (err) => { Taro.showToast({ title: err.message || '创建订单失败', icon: 'none' }) } }) const handleRecharge = () => { const amount = customAmount || String(amounts[selected]) if (!amount || Number(amount) <= 0) { Taro.showToast({ title: '请选择充值金额', icon: 'none' }) return } if (Number(amount) < 1) { Taro.showToast({ title: '充值金额不能小于1元', icon: 'none' }) return } if (Number(amount) > 5000) { Taro.showToast({ title: '单次充值金额不能超过5000元', icon: 'none' }) return } // 创建充值订单 runCreate({ amount: amount, payType: 0, // 微信支付 }) } return ( {/* 当前余额提示 */} {balance && ( 当前余额 ¥{parseFloat(balance).toFixed(2)} )} {/* 充值金额 */} 选择充值金额 {amounts.map((amount, idx) => ( { setSelected(idx); setCustomAmount('') }} > ¥{amount} ))} {/* 自定义金额 */} 自定义金额 ¥ setCustomAmount(e.detail.value)} /> {/* 支付方式 */} 支付方式 💳 微信支付 {/* 充值说明 */} 充值说明 1. 充值金额将立即到账 2. 充值后可在商城消费使用 3. 充值金额不可提现 4. 如有问题请联系客服 {/* 底部按钮占位 */} {/* 底部充值按钮 - flex 布局 */} {creating ? '处理中...' : `立即充值 ¥${customAmount || amounts[selected]}`} ) } export default RechargePage