跳到主要內容

PaymentProvider

PaymentProvider@blocklet/payment-react 函式庫的基石。它作為一個上下文提供者,必須包裝您的應用程式或相關的支付元件。它負責取得必要的設定、管理應用程式狀態,並為其所有子元件提供輔助函式和 API 客戶端。

此函式庫中幾乎每個元件和掛鉤都需要嵌套在 PaymentProvider 內才能正常運作。

運作方式

該提供者在掛載時會初始化並從 Payment Kit 後端取得設定資料。這些資料,連同使用者的 session 和其他工具,會透過 usePaymentContext 掛鉤提供給任何後代元件。這種模式確保您的支付元件始終能夠存取必要的上下文,而無需透過屬性傳遞。

PaymentProvider

設定與使用

若要使用 PaymentProvider,您需要從應用程式的驗證上下文中為其提供 sessionconnect 物件。在整個文件中,我們將使用一個自訂掛鉤 useSessionContext 來代表您應用程式的驗證邏輯。以下是此類掛鉤的典型實作:

SessionContext.tsx

typescript
import React, { createContext, useContext } from 'react';
import { SessionProvider, useSessionContext as useDidSessionContext } from '@arcblock/did-connect-react';

// 您可以建立自己的上下文或使用現有的上下文
const AppContext = createContext({});

export function AppProvider({ children }) {
  return (
    <SessionProvider>
      <AppContext.Provider value={{}}>
        {children}
      </AppContext.Provider>
    </SessionProvider>
  );
}

// 這個自訂掛鉤為 PaymentProvider 提供 session 和 connectApi
export function useSessionContext() {
  const { session, connect } = useDidSessionContext();
  return { session, connectApi: connect };
}

一旦您的 session 管理就緒,就用 PaymentProvider 包裝您的主應用程式元件。

App.tsx

tsx
import { PaymentProvider } from '@blocklet/payment-react';
import { useSessionContext } from './SessionContext'; // 您的 session 上下文掛鉤
import MyPaymentPage from './MyPaymentPage';

function App() {
  const { session, connectApi } = useSessionContext();

  return (
    <PaymentProvider session={session} connect={connectApi}>
      <MyPaymentPage />
    </PaymentProvider>
  );
}

export default App;

Props

PaymentProvider 元件接受以下 props:

PropTypeRequiredDescription
sessionSession來自您的驗證上下文的使用者 session 物件 (例如 @arcblock/did-connect-react)。
connectConnect來自您的驗證上下文的 connect API 函式,用於 DID Connect 操作。
childrenReact.ReactNode將有權存取支付上下文的子元件。
baseUrlstringPayment Kit blocklet 的基礎 URL。僅在從不同來源 (跨來源) 整合支付元件時才需要。
authTokenstring用於 API 請求的特定驗證令牌。如果提供,它將取代基於 session 的驗證。

上下文值

PaymentProvider 內的元件可以使用 usePaymentContext 掛鉤存取以下值。

MyComponent.tsx

typescript
import { usePaymentContext } from '@blocklet/payment-react';

function MyComponent() {
  const { settings, livemode, setLivemode } = usePaymentContext();

  return (
    <div>
      <p>基礎貨幣: {settings.baseCurrency?.name}</p>
      <p>模式: {livemode ? '正式' : '測試'}</p>
      <button onClick={() => setLivemode(!livemode)}>切換模式</button>
    </div>
  );
}

以下是可用上下文值的完整列表:

KeyTypeDescription
sessionobject經過驗證的使用者 session,包含使用者詳細資訊。
connectfunction用於啟動 DID Wallet 互動的 connect 函式。
livemodeboolean表示上下文是處於正式 (true) 模式還是測試 (false) 模式。
setLivemode(livemode: boolean) => void一個在正式和測試模式之間切換的函式。這將觸發重新取得設定。
settingsSettings一個包含從後端取得的 paymentMethodsbaseCurrency 設定的物件。
refresh(forceRefresh?: boolean) => void一個手動觸發重新取得設定資料的函式。
getCurrency(id: string) => TPaymentCurrency一個輔助函式,可透過 ID 取得特定貨幣的詳細資訊。
getMethod(id: string) => TPaymentMethodExpanded一個輔助函式,可透過 ID 取得特定支付方式的詳細資訊。
apiAxiosInstance一個預先設定的 Axios 實例,用於向 Payment Kit 後端發出經過驗證的 API 呼叫。
prefixstringblocklet 的 URL 前綴。
payableboolean一個可用於控制支付操作可用性的狀態。
setPayable(status: boolean) => void一個更新 payable 狀態的函式。

進階情境

跨來源整合

如果您的應用程式和 Payment Kit blocklet 託管在不同的網域上,您必須使用 baseUrl prop。這讓 PaymentProvider 能夠正確地定位並與 Payment Kit API 通訊。

CrossOriginApp.tsx

tsx
import { PaymentProvider } from '@blocklet/payment-react';
import { useSessionContext } from './SessionContext';

function CrossOriginApp() {
  const { session, connectApi } = useSessionContext();

  return (
    <PaymentProvider
      session={session}
      connect={connectApi}
      baseUrl="https://payment-kit.another-domain.com"
    >
      {/* 您的支付元件 */}
    </PaymentProvider>
  );
}

自訂驗證令牌

在您需要使用特定的 API 令牌而不是預設的基於 session 的驗證的情境下 (例如,用於伺服器對伺服器通訊或特定的存取授權),您可以傳遞 authToken prop。

TokenAuthApp.tsx

tsx
import { PaymentProvider } from '@blocklet/payment-react';
import { useSessionContext } from './SessionContext';

function TokenAuthApp() {
  const { session, connectApi } = useSessionContext();
  const myCustomAuthToken = 'sk_xxxxxx'; // 您的秘密令牌

  return (
    <PaymentProvider
      session={session}
      connect={connectApi}
      authToken={myCustomAuthToken}
    >
      {/* 元件將使用提供的 authToken 進行 API 呼叫 */}
    </PaymentProvider>
  );
}

設定好 PaymentProvider 後,您現在可以開始將支付元件整合到您的應用程式中。一個好的下一步是探索如何使用 CheckoutForm 元件來建立支付流程。