客户端 SDK 参考

初始化

script在所有需要调用 Pi Apps SDK 的页面中添加以下标签:

<script src="https://sdk.minepi.com/pi-sdk.js"></script>
<script>
  Pi.init({ version: "2.0" });
</script>

传递给 init 函数的 config 对象接受以下键:

  • version(字符串,必填) - 此项为必填项,用于确保您的应用与可能带来重大变更的新 SDK 版本兼容(在这种情况下,重大变更将在更高的版本号下实现)。

  • sandbox: (布尔值,可选) - 这允许您配置 SDK 在沙箱中运行。

在沙盒模式下使用 SDK:

<script src="https://sdk.minepi.com/pi-sdk.js"></script>
<script>
  Pi.init({ version: "2.0", sandbox: true });
</script>

您现在可以在沙盒环境 ( https://sandbox.minepi.com ) 中运行您的应用程序,前提是您已在开发者门户中配置了开发 URL。要配置此 URL 并查看您的沙盒 URL,请在 Pi 浏览器中打开 develop.pi 访问开发者门户。

通常情况下,如果您使用的框架或样板支持此功能,您应该能够设置沙箱标志以匹配您的开发环境。例如,大多数优秀的 Node 样板会将 `--sandbox-mode` 的值设置process.env.NODE_ENV为 `--sandbox-mode`"development"或`--sandbox "production"-mode`,您可以执行类似这样的操作: Pi.init({ version: "2.0", sandbox: <%= process.env.NODE_ENV !== 'production' %> })`--sandbox-mode`。这取决于您的设置,但通常情况下,当您的应用程序在开发环境中运行时,Pi SDK 就会以沙箱模式运行。

验证

警告:通过此方法获取的用户信息不应传递到后端,而应仅用于展示逻辑(例如显示用户名)。 后端应使用平台 API 作为权威数据源。您可以使用通过此方法获取的访问令牌,通过后端请求 `/me` 端点来验证用户身份。

Pi.authenticate(scopes: Array<Scope>, onIncompletePaymentFound: Function<PaymentDTO>): Promise<AuthResult>

返回值:

type AuthResult = {
  accessToken: string;
  user: {
    uid: string;
    username: string;
  };
};

scopes

可用范围:username,,paymentswallet_address

以下是对象上各种可用键的详细说明AuthResult['user'],以及这些键存在所需的作用域:

场地描述所需范围
uid用户的应用本地标识符。此标识符仅适用于此用户和此应用。如果用户撤销授予您应用的权限,此标识符将会更改。(没有任何)
username用户的 Pi 用户名。username
payments如果您的应用需要在应用和用户之间进行支付,则此项为必填项。payments
wallet_address在您的应用上进行身份验证的用户的钱包地址。wallet_address

onIncompletePaymentFound

签名:(payment: PaymentDTO) => void

每次用户通过身份验证并尝试启动新的支付流程时,SDK 都会检查该用户是否存在未完成的支付。在此上下文中,未完成的支付是指已提交到 Pi 区块链但尚未处理的支付status.developer_completed(false即开发者尚未调用 /complete该支付的端点)。

如果发现付款不完整,则会调用此回调函数并传入付款信息PaymentDTO。

当此回调被调用时,您有责任完成相应的付款(您很可能需要将付款 DTO 发送到您的服务器,并根据您的业务逻辑进行处理)。您需要在向用户请求新的付款之前完成此操作。

付款

创建新的付款方式:

type PaymentData = {
  amount: number,
  memo: string,
  metadata: Object,
};
type PaymentCallbacks = {
  onReadyForServerApproval: (paymentId: string) => void,
  onReadyForServerCompletion: (paymentId: string, txid: string) => void,
  onCancel: (paymentId: string) => void,
  onError: (error: Error, payment?: PaymentDTO) => void,
};
Pi.createPayment(paymentData: PaymentData, callbacks: PaymentCallbacks): void;

该createPayment方法接受两个参数:paymentData和callbacks。

它将立即启动支付流程,该流程将在您的应用程序顶部打开,使用户能够查看付款并提交区块链交易,或拒绝该交易。

警告:同时进行多笔付款:

创建新付款时,如果当前用户已在您的应用中存在未结付款:

如果用户尚未完成区块链交易,则未完成的付款将被取消。

如果用户已经进行了区块链交易,则新的付款将被拒绝(onError将调用),并且onIncompletePaymentFound传递给该authenticate 方法的回调函数将使用现有的付款进行调用(使用此回调函数来解决此问题,例如,将先前的付款发送到您的服务器以完成服务器端操作)。

paymentData关键信息:

amount

这是用户需要向您的应用支付的金额。

例子:3.1415。

memo

本次付款的备注。此备注将在付款确认页面对用户可见。请在此处简要说明用户付款的用途。

例子:Digital kitten #1234。

metadata

您可以将此任意 JavaScript 对象附加到此付款。此对象仅供您自己使用。您应该使用此对象将此付款与您的内部业务逻辑关联起来。

例子:{ orderId: 1234, itemIds: [11, 42, 314] }

callbacks关键信息:

onReadyForServerApproval

签名:(paymentId: string) => void

当从 Pi 服务器获取到支付标识符 (paymentId) 时,会调用此函数。在审批期间,如果审批失败,此回调函数将被多次调用。如果初始尝试失败,Pi SDK 将继续大约每 10 秒调用一次该函数,直到审批计时器结束。

使用此回调函数将 paymentId 发送到您的后端进行服务器端审批。有关服务器端审批和完整支付流程的更多信息,请参阅专门的 “支付”页面。

onReadyForServerCompletion

签名:(paymentId: string, txid: string) => void

当用户将交易提交到 Pi 区块链后,会调用此函数。在完成期间,如果交易失败,此回调函数将被多次调用。如果初始尝试失败,Pi SDK 将继续大约每隔 10 秒调用一次该函数,直到完成计时器结束。

使用此回调函数将区块链交易标识符 (txid) 和支付 ID 发送到您的后端,以便进行服务器端完成。有关服务器端完成和完整支付流程的更多信息,请参阅专门的 “支付”页面。

onCancel

签名:(paymentId: string) => void

当付款被取消时(无论是用户操作还是通过程序取消),都会调用此函数。

付款可能因用户手动拒绝而取消,也可能因其他阻止情况而取消:例如,用户账户余额不足无法支付,或者同时创建了另一笔付款……

onError

签名:(error: Error, payment?: PaymentDTO) => void

当发生错误且无法完成付款时,将调用此函数。如果付款已创建,则会提供第二个参数,您可以使用该参数来调查错误。否则,只会提供第一个参数。

类型PaymentDTO

onIncompletePaymentFound这种类型用于传递给和的参数onError。

type PaymentDTO = {
  // Payment data:
  identifier: string; // payment identifier
  user_uid: string; // user's app-specific ID
  amount: number; // payment amount
  memo: string; // a string provided by the developer, shown to the user
  metadata: Object; // an object provided by the developer for their own usage
  from_address: string; // sender address of the blockchain transaction
  to_address: string; // recipient address of the blockchain transaction
  direction: Direction; // direction of the payment
  created_at: string; // payment's creation timestamp
  network: AppNetwork; // a network of the payment
  // Status flags representing the current state of this payment
  status: {
    developer_approved: boolean; // Server-Side Approval
    transaction_verified: boolean; // blockchain transaction verified
    developer_completed: boolean; // server-Side Completion
    cancelled: boolean; // cancelled by the developer or by Pi Network
    user_cancelled: boolean; // cancelled by the user
  };
  // Blockchain transaction data:
  transaction: null | {
    // This is null if no transaction has been made yet
    txid: string; // id of the blockchain transaction
    verified: boolean; // true if the transaction matches the payment, false otherwise
    _link: string; // a link to the operation on the Blockchain API
  };
};

类型Direction

开发者可以通过这种类型检查付款方向。

type Direction = "user_to_app" | "app_to_user";

类型AppNetwork

显示付款正在使用的网络。

type AppNetwork = "Pi Network" | "Pi Testnet";

类型Scope

您可以向用户请求权限。

type Scope = "username" | "payments" | "wallet_address";

原生功能列表

使用此方法可获取用户正在使用的特定版本 Pi Browser 的可用原生功能列表。某些 SDK 功能可能需要特定版本才能正常工作。

type NativeFeature = "inline_media" | "request_permission" | "ad_network";
Pi.nativeFeaturesList(): Promise<Array<NativeFeature>>;

分享对话框

打开原生共享对话框:

Pi.openShareDialog(title: string, message: string): void;

使用此方法打开原生分享对话框(由手机操作系统提供),使用户能够与朋友分享您应用中的内容。

  • title:所分享消息的标题

  • message当用户在共享流程中选择目标应用时,将发送此消息。

广告

SDK 包含一个Ads模块(对象),允许开发者向用户展示广告。它提供了多种方法,可用于插页式广告和激励广告。所有方法都利用了基于 Promise 的异步特性。

type AdType = "interstitial" | "rewarded";

显示广告

使用showAd(adType: "interstitial" | "rewarded")此方法向用户展示广告。它返回一个 Promise,该 Promise 会解析为以下类型的对象ShowAdResponse:

type ShowAdResponse =
  | {
      type: "interstitial";
      result: "AD_CLOSED" | "AD_DISPLAY_ERROR" | "AD_NETWORK_ERROR" | "AD_NOT_AVAILABLE";
    }
  | {
      type: "rewarded";
      result: "AD_REWARDED" | "AD_CLOSED" | "AD_DISPLAY_ERROR" | "AD_NETWORK_ERROR" | "AD_NOT_AVAILABLE" | "ADS_NOT_SUPPORTED" | "USER_UNAUTHENTICATED";
      adId?: string;
    };
Pi.Ads.showAd(adType: AdType): Promise<ShowAdResponse>
  • "AD_NOT_AVAILABLE"表示广告加载失败。

  • "AD_CLOSED"表示广告已成功展示并关闭。

  • "AD_REWARDED"表示广告已成功展示并获得奖励(仅适用于rewarded广告)。

  • "AD_DISPLAY_ERROR"表示广告已成功加载但未能显示。

  • "AD_NETWORK_ERROR"这表明用户可能遇到了网络连接问题。

  • "ADS_NOT_SUPPORTED"- 表示用户使用的应用版本不支持广告,

  • "USER_UNAUTHENTICATED"- 表示用户未经身份验证,因此无法显示激励广告(仅限rewarded广告)。

Pi 浏览器内部管理广告可用性策略,自动加载初始广告并在每次显示时重新加载。这确保广告始终处于可显示状态。然而,在极少数情况下,广告加载可能会中断,或者第三方应用可能会showAd()过快地使用方法(甚至在下一个广告准备就绪之前)。为了方便开发者处理这些情况,Pi SDK 提供了额外的方法:isAdReady()和requestAd()。

笔记:

  • 如果您的应用已获 Pi Developer Ad Network 批准,则响应Pi.Ads.showAd('rewarded')中将包含其他adId字段,您可以使用 Pi Platform API 验证奖励状态。

  • 如果您的申请未获 Pi 开发者广告网络批准,则响应adId中将缺少该字段Pi.Ads.showAd('rewarded')。您不应在未adId使用Pi 平台 API进行验证的情况下向用户发放奖励。

检查广告是否已准备就绪

使用此isAdReady(adType: "interstitial" | "rewarded")方法检查特定类型的广告是否可用。此方法返回一个 Promise,该 Promise 会解析为IsAdReadyResponse.

type IsAdReadyResponse = {
  type: "interstitial" | "rewarded";
  ready: boolean;
};
Pi.Ads.isAdReady(adType: AdType): Promise<IsAdReadyResponse>

Pi 浏览器内部管理广告可用性策略,自动加载初始广告并在每次显示时重新加载。这确保广告始终处于可显示状态。然而,在极少数情况下,广告加载可能会中断,或者第三方应用可能会showAd()过快地使用方法(甚至在下一个广告准备就绪之前)。为了解决此类问题,Pi SDK 提供了此方法,允许开发者显式地检查广告的可用性。

请求广告

使用requestAd(adType: "interstitial" | "rewarded")此方法请求插页式广告或激励广告。它返回一个 Promise,该 Promise 会解析为以下类型的对象RequestAdResponse:

type RequestAdResponse = {
  type: "interstitial" | "rewarded";
  result: "AD_LOADED" | "AD_FAILED_TO_LOAD" | "AD_NOT_AVAILABLE";
};

Pi.Ads.requestAd(adType: AdType): Promise<RequestAdResponse>

与广告可用性策略一样,Pi 浏览器内部会管理请求新广告以替换已显示广告的过程。虽然不能保证广告始终可用,但开发者可以使用requestAd()方法手动重试广告请求,以防请求返回的 Promise 解析isAdReady()失败false。

在系统浏览器中打开 URL

请使用系统浏览器而不是 Pi Browser 打开 URL。

Pi.openUrlInSystemBrowser(url: string): Promise<void>

该方法返回一个 Promise,当 URL 成功打开时,该 Promise 会被解析;Error如果出现错误,则会被拒绝。可能的错误信息包括:

  • "Failed to open URL"这表明系统浏览器无法打开该网址,可能是由于网址错误造成的。

  • "No minimal requirements"这表明最终用户使用的是较旧版本的Pi浏览器,该版本不支持此SDK方法。

  • "Unexpected error"

根据错误信息,您可以在应用程序中针对每种错误情况采取不同的处理方式。但是,如果收到"No minimal requirements"错误提示,强烈建议您鼓励用户更新 Pi 浏览器。

打赏 Pi 打赏 微信打赏