feat: apple

This commit is contained in:
jinyaqiu 2025-07-29 14:28:10 +08:00
parent 714001f6ac
commit 7b7c39ce36
2 changed files with 23 additions and 35 deletions

View File

@ -8,7 +8,7 @@ import ProRights from '@/components/owner/rights/proRights';
import { createOrder, createPayment, getPAy, isOrderExpired, payFailure, payProcessing, paySuccess } from '@/components/owner/rights/utils'; import { createOrder, createPayment, getPAy, isOrderExpired, payFailure, payProcessing, paySuccess } from '@/components/owner/rights/utils';
import { ThemedText } from '@/components/ThemedText'; import { ThemedText } from '@/components/ThemedText';
import { CreateOrder } from '@/types/personal-info'; import { CreateOrder } from '@/types/personal-info';
import { ErrorCode, getAvailablePurchases, getPurchaseHistories, ProductPurchase, useIAP } from 'expo-iap'; import { ErrorCode, getPurchaseHistories, useIAP } from 'expo-iap';
import { useLocalSearchParams, useRouter } from "expo-router"; import { useLocalSearchParams, useRouter } from "expo-router";
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
@ -21,14 +21,8 @@ export default function Rights() {
const { t } = useTranslation(); const { t } = useTranslation();
const { const {
connected, connected,
products,
subscriptions,
currentPurchase,
currentPurchaseError,
requestProducts, requestProducts,
requestPurchase, requestPurchase,
finishTransaction,
validateReceipt,
} = useIAP(); } = useIAP();
// 用户勾选协议 // 用户勾选协议
const [agree, setAgree] = useState<boolean>(false); const [agree, setAgree] = useState<boolean>(false);
@ -66,19 +60,19 @@ export default function Rights() {
}; };
// 恢复购买 // 恢复购买
const restorePurchases = async () => { // const restorePurchases = async () => {
try { // try {
const purchases = await getAvailablePurchases(); // const purchases = await getAvailablePurchases();
console.log('Available purchases:', purchases); // console.log('Available purchases:', purchases);
// Process and validate restored purchases // // Process and validate restored purchases
for (const purchase of purchases) { // for (const purchase of purchases) {
await validateAndGrantPurchase(purchase); // await validateAndGrantPurchase(purchase);
} // }
alert(t('personal:rights.restoreSuccess')); // alert(t('personal:rights.restoreSuccess'));
} catch (error) { // } catch (error) {
console.error('Restore failed:', error); // console.error('Restore failed:', error);
} // }
}; // };
// 处理购买 // 处理购买
const handlePurchase = async (sku: string, transaction_id: string) => { const handlePurchase = async (sku: string, transaction_id: string) => {
@ -88,15 +82,13 @@ export default function Rights() {
const res = await requestPurchase({ const res = await requestPurchase({
request: { request: {
ios: { ios: {
sku: payType, sku: sku,
andDangerouslyFinishTransactionAutomaticallyIOS: false, andDangerouslyFinishTransactionAutomaticallyIOS: false,
}, },
}, },
}); });
console.log('Purchase success:', res);
// 支付成功 // 支付成功
await paySuccess(transaction_id, res?.transactionId || "") await paySuccess(res?.transaction_id || "", "2000000971679717")
} catch (error: any) { } catch (error: any) {
console.log('Purchase failed:', error); console.log('Purchase failed:', error);
// 支付失败 // 支付失败
@ -248,7 +240,7 @@ export default function Rights() {
{/* 普通权益 */} {/* 普通权益 */}
<Normal setUserType={setUserType} style={{ display: userType === 'normal' ? "flex" : "none" }} /> <Normal setUserType={setUserType} style={{ display: userType === 'normal' ? "flex" : "none" }} />
{/* 会员权益 */} {/* 会员权益 */}
<Premium restorePurchases={restorePurchases} setPayType={setPayType} setShowTerms={setShowTerms} payType={payType} premiumPay={premiumPay} loading={loading} style={{ display: userType === 'normal' ? "none" : "flex" }} /> <Premium setPayType={setPayType} setShowTerms={setShowTerms} payType={payType} premiumPay={premiumPay} loading={loading} style={{ display: userType === 'normal' ? "none" : "flex" }} />
</View> </View>
{/* 支付方式 */} {/* 支付方式 */}
{/* <PayTypeModal setConfirmPay={setConfirmPay} modalVisible={showPayType} setModalVisible={setShowPayType} payChoice={payChoice} setPayChoice={setPayChoice} /> */} {/* <PayTypeModal setConfirmPay={setConfirmPay} modalVisible={showPayType} setModalVisible={setShowPayType} payChoice={payChoice} setPayChoice={setPayChoice} /> */}
@ -306,7 +298,7 @@ export default function Rights() {
</View> </View>
{/* 协议弹窗 */} {/* 协议弹窗 */}
<PrivacyModal modalVisible={showTerms} setModalVisible={setShowTerms} type={"member"} /> <PrivacyModal modalVisible={showTerms} setModalVisible={setShowTerms} type={"membership"} />
</View> </View>
); );
} }
@ -455,6 +447,3 @@ const styles = StyleSheet.create({
lineHeight: 32 lineHeight: 32
} }
}); });
function validateAndGrantPurchase(purchase: ProductPurchase) {
throw new Error('Function not implemented.');
}

View File

@ -11,7 +11,6 @@ interface Props {
premiumPay: any; premiumPay: any;
loading: boolean; loading: boolean;
setShowTerms: (visible: boolean) => void; setShowTerms: (visible: boolean) => void;
restorePurchases: () => void;
} }
export interface PayItem { export interface PayItem {
@ -31,7 +30,7 @@ export interface PayItem {
} }
const Premium = (props: Props) => { const Premium = (props: Props) => {
const { style, payType, setPayType, premiumPay, loading, setShowTerms, restorePurchases } = props; const { style, payType, setPayType, premiumPay, loading } = props;
const bestValue = maxDiscountProduct(premiumPay)?.product_code const bestValue = maxDiscountProduct(premiumPay)?.product_code
const { t } = useTranslation(); const { t } = useTranslation();
@ -80,7 +79,7 @@ const Premium = (props: Props) => {
}) })
} }
</ScrollView> </ScrollView>
<View style={{ flexDirection: 'row', gap: 8, marginLeft: 4, marginTop: 8 }}> {/* <View style={{ flexDirection: 'row', gap: 8, marginLeft: 4, marginTop: 8 }}>
<ThemedText style={{ color: '#AC7E35', fontSize: 10 }}> <ThemedText style={{ color: '#AC7E35', fontSize: 10 }}>
{t('personal:rights.restorePurchase')} {t('personal:rights.restorePurchase')}
</ThemedText> </ThemedText>
@ -89,7 +88,7 @@ const Premium = (props: Props) => {
{t('personal:rights.restore')} {t('personal:rights.restore')}
</ThemedText> </ThemedText>
</TouchableOpacity> </TouchableOpacity>
</View> </View> */}
</View> </View>
); );
} }