PaypalButtons组件onInit函数未触发,SDK版本加载异常求助
PayPal按钮加载异常:SDK版本undefined且onInit未触发
未对代码库中PayPal相关功能做任何修改,加载@paypal/react-paypal-js的PayPalButtons组件时出现以下问题:
- 清缓存状态下,加载的PayPal SDK版本显示为undefined
- 等待按钮变为可点击状态一段时间后,提示错误与SDK中不存在相关函数有关(推测因版本undefined导致SDK未实际加载)
- 模拟支付时按钮始终无法点击,按实现逻辑
onInit函数执行后按钮才会启用,但onInit从未触发 usePayPalScriptReducer返回的isResolved为true,表明存在PayPal SDK实例,但版本为undefined
PayPalButtons组件调用代码
const PaypalButton = ({ documentId, history, getPaymentForInvoice }: PaypalButtonProps) => { const [ isInitialized, setIsInitialized ] = useState(false) const [{ options, isPending, isResolved, ...rest }] = usePayPalScriptReducer(); useEffect(() => { setIsInitialized(false); }, [documentId]) const onCreateOrderHandler = async (data: any, actions: any): Promise<string> => { console.log('Creating payment'); const paymentId = await getPaymentForInvoice(documentId); if (paymentId) { return Promise.resolve(paymentId) } return Promise.reject() } const onApproveHandler = async () => { console.log('Payment approved'); onRedirectToLoadingUrl(); } const onErrorHandler = async () => { console.log('Received error during payment'); onRedirectToFailureUrl(); }; const onCancelHandler = async () => { console.log('Payment cancelled'); }; const onInitHandler = (data: any) => { console.log('Paypal buttons are initialized'); setIsInitialized(true); }; const onRedirectToLoadingUrl = () => { history.push(`${RestURLConstants.baseAppPaths.paymentLoadingPath}-${documentId}`) } const onRedirectToFailureUrl = () => { history.push(`${RestURLConstants.baseAppPaths.paymentFailurePath}-${documentId}`) } return isResolved ? ( <PayPalButtons disabled={!isInitialized} forceReRender={[documentId]} createOrder={onCreateOrderHandler} onApprove={onApproveHandler} onInit={onInitHandler} onCancel={onCancelHandler} onError={onErrorHandler} /> ) : null; }
PayPalScriptProvider配置代码
import { PayPalScriptProvider } from '@paypal/react-paypal-js'; <PayPalScriptProvider options={{ 'client-id': PAYPAL_CLIENT_ID, components: `buttons`, currency: `EUR`, commit: true, 'data-usercentrics': `PayPal`, 'data-namespace': `paypal_sdk`, 'disable-funding': `credit,card,bancontact,blik,eps,giropay,ideal,mybank,p24,sepa,sofort,venmo` }} > <Authenticate /> <RegisterSharedEvents /> <PagesMainRouting /> </PayPalScriptProvider>
补充说明:近期未对上述组件做任何代码修改,问题突然出现;PAYPAL_CLIENT_ID存储在配置文件中,取自环境变量。
内容的提问来源于stack exchange,提问作者codrinus
相关产品推荐
相关产品推荐

