<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>Pi Network</title><link>http://www.zuud.cn/</link><description>Pi是新的加密货币，可以通过手机“挖掘”。</description><item><title>如何在 Pi 测试网上创建代币？</title><link>http://www.zuud.cn/doc/20251271/</link><description>&lt;h2&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;先决条件&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;您需要两个测试网钱包来创建代币。请在 Pi 钱包中创建它们，并在 Pi 测试网上激活它们。您可以从钱包的设置页面访问钱包的私钥。&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;令牌是如何创建的&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;在 Pi 区块链上，如果钱包想要处理某个代币，必须先通过“建立信任线”来信任该代币。这可以保护钱包免受来自未知发送者的未经授权的代币的侵害。当特定代币的信任线首次建立时，该代币就会被写入链上。您将在下面的示例中详细了解其工作原理。&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;步骤&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;假设我们要创建“TestToken”。在本文档中，我们将把先决条件中的两个钱包分别称为“发行者”和“分发者”。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp;1.从“分发者”钱包建立一条指向“TestToken”的信任线。由于这是首次为“TestToken”建立信任线，因此该代币现在已被链上识别。但是，由于该代币尚未铸造，因此其总供应量尚不存在。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp;2.现在，您可以通过“发行方”钱包使用“支付”操作向“分发方”钱包发送一定数量的代币，这本质上就是“铸造”代币。正如我们在上一节中了解到的，钱包需要信任线才能处理特定的代币。当注册新代币时，第一个建立信任线的钱包自然而然地成为分发方钱包，因为它是唯一可以持有该代币的钱包，直到其他钱包也建立起对该代币的信任线为止。&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;代币铸造 - 代码示例&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;以下是一个 NodeJS 代码片段，展示了上述步骤。这是一个非常简单的示例，仅展示了流程的概要，您的生产代码应该负责错误处理。请注意，您需要将 Stellar SDK 作为依赖项。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;const&amp;nbsp;StellarSDK&amp;nbsp;=&amp;nbsp;require(&amp;quot;@stellar/stellar-sdk&amp;quot;);
const&amp;nbsp;server&amp;nbsp;=&amp;nbsp;new&amp;nbsp;StellarSDK.Horizon.Server(&amp;quot;https://api.testnet.minepi.com&amp;quot;);
const&amp;nbsp;NETWORK_PASSPHRASE&amp;nbsp;=&amp;nbsp;&amp;quot;Pi&amp;nbsp;Testnet&amp;quot;;
//&amp;nbsp;prepare&amp;nbsp;keypairs
const&amp;nbsp;issuerKeypair&amp;nbsp;=&amp;nbsp;StellarSDK.Keypair.fromSecret(&amp;quot;&amp;quot;);&amp;nbsp;//&amp;nbsp;use&amp;nbsp;actual&amp;nbsp;secret&amp;nbsp;key&amp;nbsp;here
const&amp;nbsp;distributorKeypair&amp;nbsp;=&amp;nbsp;StellarSDK.Keypair.fromSecret(&amp;quot;&amp;quot;);&amp;nbsp;//&amp;nbsp;use&amp;nbsp;actual&amp;nbsp;secret&amp;nbsp;key&amp;nbsp;here
//&amp;nbsp;define&amp;nbsp;a&amp;nbsp;token
//&amp;nbsp;token&amp;nbsp;code&amp;nbsp;should&amp;nbsp;be&amp;nbsp;alphanumeric&amp;nbsp;and&amp;nbsp;up&amp;nbsp;to&amp;nbsp;12&amp;nbsp;characters,&amp;nbsp;case&amp;nbsp;sensitive
const&amp;nbsp;customToken&amp;nbsp;=&amp;nbsp;new&amp;nbsp;StellarSDK.Asset(&amp;quot;TestToken&amp;quot;,&amp;nbsp;issuerKeypair.publicKey());
const&amp;nbsp;distributorAccount&amp;nbsp;=&amp;nbsp;await&amp;nbsp;server.loadAccount(distributorKeypair.publicKey());
//&amp;nbsp;look&amp;nbsp;up&amp;nbsp;base&amp;nbsp;fee
const&amp;nbsp;response&amp;nbsp;=&amp;nbsp;await&amp;nbsp;server.ledgers().order(&amp;quot;desc&amp;quot;).limit(1).call();
const&amp;nbsp;latestBlock&amp;nbsp;=&amp;nbsp;response.records[0];
const&amp;nbsp;baseFee&amp;nbsp;=&amp;nbsp;latestBlock.base_fee_in_stroops;
//&amp;nbsp;prepare&amp;nbsp;a&amp;nbsp;transaction&amp;nbsp;that&amp;nbsp;establishes&amp;nbsp;trustline
const&amp;nbsp;trustlineTransaction&amp;nbsp;=&amp;nbsp;new&amp;nbsp;StellarSDK.TransactionBuilder(distributorAccount,&amp;nbsp;{
&amp;nbsp;&amp;nbsp;fee:&amp;nbsp;baseFee,
&amp;nbsp;&amp;nbsp;networkPassphrase:&amp;nbsp;NETWORK_PASSPHRASE,
&amp;nbsp;&amp;nbsp;timebounds:&amp;nbsp;await&amp;nbsp;server.fetchTimebounds(90),
})
&amp;nbsp;&amp;nbsp;.addOperation(StellarSDK.Operation.changeTrust({&amp;nbsp;asset:&amp;nbsp;customToken,&amp;nbsp;limit:&amp;nbsp;undefined&amp;nbsp;}))
&amp;nbsp;&amp;nbsp;.build();
trustlineTransaction.sign(distributorKeypair);
//&amp;nbsp;submit&amp;nbsp;a&amp;nbsp;tx
await&amp;nbsp;server.submitTransaction(trustlineTransaction);
console.log(&amp;quot;Trustline&amp;nbsp;created&amp;nbsp;successfully&amp;quot;);
//====================================================================================
//&amp;nbsp;now&amp;nbsp;mint&amp;nbsp;TestToken&amp;nbsp;by&amp;nbsp;sending&amp;nbsp;from&amp;nbsp;issuer&amp;nbsp;account&amp;nbsp;to&amp;nbsp;distributor&amp;nbsp;account
const&amp;nbsp;issuerAccount&amp;nbsp;=&amp;nbsp;await&amp;nbsp;server.loadAccount(issuerKeypair.publicKey());
const&amp;nbsp;paymentTransaction&amp;nbsp;=&amp;nbsp;new&amp;nbsp;StellarSDK.TransactionBuilder(issuerAccount,&amp;nbsp;{
&amp;nbsp;&amp;nbsp;fee:&amp;nbsp;baseFee,
&amp;nbsp;&amp;nbsp;networkPassphrase:&amp;nbsp;NETWORK_PASSPHRASE,
&amp;nbsp;&amp;nbsp;timebounds:&amp;nbsp;await&amp;nbsp;server.fetchTimebounds(90),
})
&amp;nbsp;&amp;nbsp;.addOperation(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StellarSDK.Operation.payment({
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;destination:&amp;nbsp;distributorKeypair.publicKey(),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;asset:&amp;nbsp;customToken,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;amount:&amp;nbsp;&amp;quot;100000&amp;quot;,&amp;nbsp;//&amp;nbsp;amount&amp;nbsp;to&amp;nbsp;mint
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})
&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;.build();
paymentTransaction.sign(issuerKeypair);
//&amp;nbsp;submit&amp;nbsp;a&amp;nbsp;tx
await&amp;nbsp;server.submitTransaction(paymentTransaction);
console.log(&amp;quot;Token&amp;nbsp;issued&amp;nbsp;successfully&amp;quot;);
//&amp;nbsp;checking&amp;nbsp;new&amp;nbsp;balance&amp;nbsp;of&amp;nbsp;the&amp;nbsp;distributor&amp;nbsp;account
const&amp;nbsp;updatedDistributorAccount&amp;nbsp;=&amp;nbsp;await&amp;nbsp;server.loadAccount(distributorKeypair.publicKey());
updatedDistributorAccount.balances.forEach((balance)&amp;nbsp;=&amp;gt;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;if&amp;nbsp;(balance.asset_type&amp;nbsp;===&amp;nbsp;&amp;quot;native&amp;quot;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(`Test-Pi&amp;nbsp;Balance:&amp;nbsp;${balance.balance}`);
&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(`${balance.asset_code}&amp;nbsp;Balance:&amp;nbsp;${balance.balance}`);
&amp;nbsp;&amp;nbsp;}
});&lt;/pre&gt;&lt;h3&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;如何在 Pi Wallet 上列出&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;虽然代币已在 Pi 测试网上铸造，但只有在 Pi 服务器识别后才会显示在 Pi 钱包中。要将其添加到 Pi 钱包，您需要将您的主域名关联到您的发行方账户，您可以使用“setOptions”操作进行设置。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;在设置“主域名”之前，如果您检查您的令牌&amp;quot;https://api.testnet.minepi.com/assets?asset_code=&amp;lt;YOUR_TOKEN_CODE&amp;gt;&amp;amp;asset_issuer=&amp;lt;YOUR_TOKEN_ISSUER&amp;gt;&amp;quot;，您会注意到“toml”部分下的“href”为空。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;...
&amp;quot;_links&amp;quot;:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;quot;toml&amp;quot;:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;href&amp;quot;:&amp;nbsp;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;}
}
...&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;现在您可以参考下面的示例，将主域名设置为颁发者帐户。&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;设置主域名 - 代码示例&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;每次交易时，都需要加载账户以使用账户的最新序列号，这一点非常重要。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;const&amp;nbsp;issuerAccount&amp;nbsp;=&amp;nbsp;await&amp;nbsp;server.loadAccount(issuerKeypair.publicKey());
const&amp;nbsp;setOptionsTransaction&amp;nbsp;=&amp;nbsp;new&amp;nbsp;StellarSDK.TransactionBuilder(issuerAccount,&amp;nbsp;{
&amp;nbsp;&amp;nbsp;fee:&amp;nbsp;baseFee,
&amp;nbsp;&amp;nbsp;networkPassphrase:&amp;nbsp;NETWORK_PASSPHRASE,
&amp;nbsp;&amp;nbsp;timebounds:&amp;nbsp;await&amp;nbsp;server.fetchTimebounds(90),
})
&amp;nbsp;&amp;nbsp;.addOperation(StellarSDK.Operation.setOptions({&amp;nbsp;homeDomain:&amp;nbsp;&amp;quot;example.com&amp;quot;&amp;nbsp;}))&amp;nbsp;//&amp;nbsp;replace&amp;nbsp;with&amp;nbsp;your&amp;nbsp;actual&amp;nbsp;domain
&amp;nbsp;&amp;nbsp;.build();
setOptionsTransaction.sign(issuerKeypair);
await&amp;nbsp;server.submitTransaction(setOptionsTransaction);
console.log(&amp;quot;Home&amp;nbsp;Domain&amp;nbsp;is&amp;nbsp;set&amp;nbsp;successfully.&amp;quot;);&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;设置“主页域名”后，如果您再次查看同一页面，您会注意到它现在显示您的主页域名，如下所示。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;...
&amp;quot;_links&amp;quot;:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;quot;toml&amp;quot;:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;href&amp;quot;:&amp;nbsp;&amp;quot;https://&amp;lt;YOUR_DOMAIN&amp;gt;/.well-known/pi.toml&amp;quot;
&amp;nbsp;&amp;nbsp;}
}
...&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;除了上述内容外，&amp;quot;home_domain&amp;quot;您的发卡机构帐户页面上还会出现一个新字段（&amp;quot;https://api.testnet.minepi.com/accounts/&amp;lt;ISSUER_ACCOUNT_PUBLIC_KEY&amp;gt;&amp;quot;）。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;正如您可能预料到的，您需要pi.toml在指定位置托管一个文件https://&amp;lt;YOUR_DOMAIN&amp;gt;/.well-known/pi.toml。该文件包含您的令牌的一些元数据，用于证明该令牌与该域名关联。请确保此文件可公开访问，并以纯文本形式托管在您的服务器上（content-type: text/plain）。&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;pi.toml 的内容&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;有几个与令牌相关的必填字段需要供 Pi 服务器验证。以下是一个示例。由于这是一个表示所有元数据的文本文件，您可以添加其他字段。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;如果一个发行方发行多个代币，则每个代币都应该有自己的[[CURRENCIES]]部分。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;[[CURRENCIES]]
code=&amp;quot;TestToken&amp;quot;
issuer=&amp;quot;GCNCQ6RRVEERQXWGKB3XMRK6VGJRIHGT5UTDAAU6QEU5NL2AHFOJDYLC&amp;quot;
name=&amp;quot;Pi&amp;nbsp;Core&amp;nbsp;Team&amp;quot;
desc=&amp;quot;This&amp;nbsp;is&amp;nbsp;a&amp;nbsp;test&amp;nbsp;token&amp;nbsp;that&amp;nbsp;is&amp;nbsp;created&amp;nbsp;as&amp;nbsp;an&amp;nbsp;example&amp;nbsp;and&amp;nbsp;has&amp;nbsp;no&amp;nbsp;value.&amp;quot;
image=&amp;quot;https://image-of-your-token.com/image.png&amp;quot;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;这些是必须核实的必填字段。&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;代码：令牌的代码&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;发行者：代币发行者的公钥&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;名称：代币发行者的名称&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;desc：令牌的简单描述&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;图片：包含令牌图标的图片。&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;重要提示：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;设置好主域名并完成有效pi.toml文件的托管后，经 Pi 服务器扫描，您的代币将开始出现在 Pi 钱包中。Pi 区块链上的代币会定期进行扫描，如果验证因某些原因失败（例如缺少字段或图像无法访问），之前上架的代币可能会从 Pi 钱包中移除。强烈建议您正确缓存您的文件pi.toml。image&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;您的pi.toml文件image必须可通过访问https，否则验证将失败。&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;代币分发&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;代币分发方式有多种，但这里我们将介绍两种简单的方法。请注意，接收者必须将您的代币添加到 Pi 钱包中。当您的代币出现在 Pi 钱包中时，用户可以在 Pi 钱包用户界面中选择您的代币并启用（即创建信任线）。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;1.直接支付流&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;假设接收方已为您的代币创建了信任线，您可以像在代币铸造 - 代码示例部分中从发行方账户到分销商账户那样，使用分销商账户的“支付”操作。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;2.创建流动性池&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;由于用户可以通过水龙头访问 Test-Pi，另一种方法是创建一个流动性池 (LP)，让用户直接从池中获取一些您的代币。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;a. 在 Pi 钱包中，前往“代币”页面，然后点击“流动性池”图标。选择“我的池”选项卡，在底部您会看到可以创建新的流动性池。选择“Test-Pi”以及您想要的代币和数量。创建完成后，该池将显示在“全部”选项卡下。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;b. 作为用户，假设我已经将您的代币添加到我的钱包，我可以前往“代币”页面，然后点击“兑换”图标。该From代币名为“Test-Pi”，也To就是您的代币。选择代币后，我可以输入想要兑换的数量。输入数量后From，相应的To金额会自动填充。然后我就可以进行兑换，并获得您的代币了。&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;其他资源&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;如果您想了解更多高级功能，请查看以下页面。强烈建议您点击最后一个链接，配置最大发行量并锁定发行账户。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;精彩的文档&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;Stellar JS SDK 文档&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;代币最佳实践&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Thu, 04 Dec 2025 16:28:27 +0800</pubDate></item><item><title>平台 API</title><link>http://www.zuud.cn/doc/20251270/</link><description>&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;平台 API 允许您读取和写入与部署在 Pi 应用平台上的应用及其用户相关的 Pi 服务器的数据。&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;概述&lt;/span&gt;&lt;/h2&gt;&lt;h3&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;基本路径：&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;最新版本的平台 API 可在以下网址获取api.minepi.com/v2：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;关于 API 版本控制的说明：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;平台 API 目前版本为 v2。我们将尽可能避免对 API 版本进行任何重大更改，并将重大更改作为新的主要版本发布。但是，如有必要（例如安全或隐私修复），我们可能会在不另行通知的情况下对现有版本进行重大更改。&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;授权&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;平台 API 支持两种不同的授权机制。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;访问令牌授权&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;某些 API 调用需要您提供用户的访问令牌才能访问资源。这些调用通常与用户数据相关（例如/me：）。可以使用以下 Authorization 标头访问这些端点：&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;Authorization:&amp;nbsp;Bearer&amp;nbsp;&amp;lt;user&amp;nbsp;access&amp;nbsp;token&amp;gt;&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;这些端点可以从后端/服务器应用程序访问，也可以从前端/客户端应用程序访问。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;服务器 API 密钥授权&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;由于各种原因，您的后端/服务器应用程序必须发出一些 API 调用。可以使用以下 Authorization 标头访问这些端点：&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;Authorization:&amp;nbsp;Key&amp;nbsp;&amp;lt;your&amp;nbsp;Server&amp;nbsp;API&amp;nbsp;Key&amp;gt;&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;警告：服务器 API 密钥仅供服务器使用。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;您的服务器 API 密钥必须保存在您的服务器上，不得发送给客户端（请勿在客户端 JavaScript 代码中使用它）。将来，您的服务器 API 密钥可能会启用应用程序本身的敏感操作，而这些操作不应被用户允许执行。允许用户访问您的服务器 API 密钥会造成严重的安全漏洞。&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;API 参考&lt;/span&gt;&lt;/h2&gt;&lt;h3&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;验证&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;访问用户的资源：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;获取用户信息，包括用户已同意与您的应用共享的用户信息。&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;GET&amp;nbsp;/me&lt;/pre&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;授权方式：访问令牌&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;响应类型：UserDTO&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;通过将用户的访问令牌发送到后端并使用此 API 端点来验证使用前端 SDK 获取的数据（恶意用户可能会篡改请求并向您发送错误数据），以验证令牌的有效性和用户的身份。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;访问令牌是很长的随机字符串，如果令牌被篡改，则请求将失败（401 HTTP 错误代码）（被篡改的令牌不属于任何真实用户）。&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;付款&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;有两种不同的付款方式。&lt;/span&gt;&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: decimal;&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;U2A（用户到应用）&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;A2U（应用到用户）&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;创建付款（U2A）：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;如果付款类型为 U2A，请使用createPayment客户端 JavaScript SDK 的方法创建付款。更多详情请参阅“付款”部分。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;创建付款（A2U）：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;POST&amp;nbsp;/payments&lt;/pre&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;授权方式：服务器 API 密钥&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;响应类型：PaymentDTO&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;请求正文示例：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;{
&amp;nbsp;&amp;nbsp;&amp;quot;payment&amp;quot;:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;amount&amp;quot;:&amp;nbsp;1,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;memo&amp;quot;:&amp;nbsp;&amp;quot;From&amp;nbsp;app&amp;nbsp;to&amp;nbsp;user&amp;nbsp;test&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;metadata&amp;quot;:&amp;nbsp;{&amp;quot;test&amp;quot;:&amp;nbsp;&amp;quot;test&amp;nbsp;metadata&amp;quot;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;uid&amp;quot;:&amp;nbsp;&amp;quot;a1111111-aaaa-bbbb-2222-ccccccc3333d&amp;quot;
&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;收到付款：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;获取付款信息。&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;GET&amp;nbsp;/payments/{payment_id}&lt;/pre&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;授权方式：服务器 API 密钥&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;响应类型：PaymentDTO&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;批准付款：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;服务器端批准：将付款标记为已批准，使用户能够将交易提交到区块链。&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;POST&amp;nbsp;/payments/{payment_id}/approve&lt;/pre&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;授权方式：服务器 API 密钥&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;响应类型：PaymentDTO&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;完成付款：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;服务器端完成：通过向 Pi 服务器证明您的应用程序已获得付款的 txid，将付款标记为已完成，从而使用户能够关闭付款流程。&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;POST&amp;nbsp;/payments/{payment_id}/complete&lt;/pre&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;授权方式：服务器 API 密钥&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;响应类型：PaymentDTO&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;请求正文示例：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;{
&amp;nbsp;&amp;nbsp;&amp;quot;txid&amp;quot;:&amp;nbsp;&amp;quot;7a7ed20d3d72c365b9019baf8dc4c4e3cce4c08114d866e47ae157e3a796e9e7&amp;quot;
}&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;取消付款：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;将付款标记为已取消。&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;POST&amp;nbsp;/payments/{payment_id}/cancel&lt;/pre&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;授权方式：服务器 API 密钥&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;响应类型：PaymentDTO&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;获取未完成的服务器付款：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;返回处于以下两种状态之一的服务器付款（即 A2U 付款）列表：&lt;/span&gt;&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;已创建付款，但尚未进行区块链交易；&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;区块链交易已提交，但开发者尚未完成支付。&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;GET&amp;nbsp;/payments/incomplete_server_payments&lt;/pre&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;授权方式：服务器 API 密钥&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;响应类型：{ &amp;quot;incomplete_server_payments&amp;quot;: Array&amp;lt; PaymentDTO &amp;gt; }&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;广告&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;验证激励广告状态&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;adId通过客户端 Pi SDK 方法返回的激励广告状态进行验证displayAd(&amp;#39;rewarded&amp;#39;)&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;GET&amp;nbsp;/ads_network/status/:adId&lt;/pre&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;授权方式：服务器 API 密钥&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;响应类型：RewardedAdStatusDTO&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;资源类型&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;UserDTO&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;{
&amp;nbsp;&amp;nbsp;uid:&amp;nbsp;string,&amp;nbsp;//&amp;nbsp;An&amp;nbsp;app-specific&amp;nbsp;user&amp;nbsp;identifier
&amp;nbsp;&amp;nbsp;credentials:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scopes:&amp;nbsp;Array&amp;lt;Scope&amp;gt;,&amp;nbsp;//&amp;nbsp;a&amp;nbsp;list&amp;nbsp;of&amp;nbsp;granted&amp;nbsp;scopes
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;valid_until:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;timestamp:&amp;nbsp;number,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iso8601:&amp;nbsp;string
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;username?:&amp;nbsp;string,&amp;nbsp;//&amp;nbsp;The&amp;nbsp;user&amp;#39;s&amp;nbsp;Pi&amp;nbsp;username.&amp;nbsp;Requires&amp;nbsp;the&amp;nbsp;`username`&amp;nbsp;scope.
}&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;PaymentDTO&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;{
&amp;nbsp;&amp;nbsp;//&amp;nbsp;Payment&amp;nbsp;data:
&amp;nbsp;&amp;nbsp;identifier:&amp;nbsp;string,&amp;nbsp;//&amp;nbsp;payment&amp;nbsp;identifier
&amp;nbsp;&amp;nbsp;user_uid:&amp;nbsp;string,&amp;nbsp;//&amp;nbsp;user&amp;#39;s&amp;nbsp;app-specific&amp;nbsp;ID
&amp;nbsp;&amp;nbsp;amount:&amp;nbsp;number,&amp;nbsp;//&amp;nbsp;payment&amp;nbsp;amount
&amp;nbsp;&amp;nbsp;memo:&amp;nbsp;string,&amp;nbsp;//&amp;nbsp;a&amp;nbsp;string&amp;nbsp;provided&amp;nbsp;by&amp;nbsp;the&amp;nbsp;developer,&amp;nbsp;shown&amp;nbsp;to&amp;nbsp;the&amp;nbsp;user
&amp;nbsp;&amp;nbsp;metadata:&amp;nbsp;Object,&amp;nbsp;//&amp;nbsp;an&amp;nbsp;object&amp;nbsp;provided&amp;nbsp;by&amp;nbsp;the&amp;nbsp;developer&amp;nbsp;for&amp;nbsp;their&amp;nbsp;own&amp;nbsp;usage
&amp;nbsp;&amp;nbsp;from_address:&amp;nbsp;string,&amp;nbsp;//&amp;nbsp;sender&amp;nbsp;address&amp;nbsp;of&amp;nbsp;the&amp;nbsp;blockchain&amp;nbsp;transaction
&amp;nbsp;&amp;nbsp;to_address:&amp;nbsp;string,&amp;nbsp;//&amp;nbsp;recipient&amp;nbsp;address&amp;nbsp;of&amp;nbsp;the&amp;nbsp;blockchain&amp;nbsp;transaction
&amp;nbsp;&amp;nbsp;direction:&amp;nbsp;Direction,&amp;nbsp;//&amp;nbsp;direction&amp;nbsp;of&amp;nbsp;the&amp;nbsp;payment
&amp;nbsp;&amp;nbsp;created_at:&amp;nbsp;string,&amp;nbsp;//&amp;nbsp;the&amp;nbsp;payment&amp;#39;s&amp;nbsp;creation&amp;nbsp;timestamp
&amp;nbsp;&amp;nbsp;network:&amp;nbsp;AppNetwork,&amp;nbsp;//&amp;nbsp;a&amp;nbsp;network&amp;nbsp;of&amp;nbsp;the&amp;nbsp;payment
&amp;nbsp;&amp;nbsp;//&amp;nbsp;Status&amp;nbsp;flags&amp;nbsp;representing&amp;nbsp;the&amp;nbsp;current&amp;nbsp;state&amp;nbsp;of&amp;nbsp;this&amp;nbsp;payment
&amp;nbsp;&amp;nbsp;status:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;developer_approved:&amp;nbsp;boolean,&amp;nbsp;//&amp;nbsp;Server-Side&amp;nbsp;Approval
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;transaction_verified:&amp;nbsp;boolean,&amp;nbsp;//&amp;nbsp;blockchain&amp;nbsp;transaction&amp;nbsp;verified
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;developer_completed:&amp;nbsp;boolean,&amp;nbsp;//&amp;nbsp;Server-Side&amp;nbsp;Completion
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cancelled:&amp;nbsp;boolean,&amp;nbsp;//&amp;nbsp;cancelled&amp;nbsp;by&amp;nbsp;the&amp;nbsp;developer&amp;nbsp;or&amp;nbsp;by&amp;nbsp;Pi&amp;nbsp;Network
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;user_cancelled:&amp;nbsp;boolean,&amp;nbsp;//&amp;nbsp;cancelled&amp;nbsp;by&amp;nbsp;the&amp;nbsp;user
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;//&amp;nbsp;Blockchain&amp;nbsp;transaction&amp;nbsp;data:
&amp;nbsp;&amp;nbsp;transaction:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;{&amp;nbsp;//&amp;nbsp;This&amp;nbsp;is&amp;nbsp;null&amp;nbsp;if&amp;nbsp;no&amp;nbsp;transaction&amp;nbsp;has&amp;nbsp;been&amp;nbsp;made&amp;nbsp;yet
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;txid:&amp;nbsp;string,&amp;nbsp;//&amp;nbsp;id&amp;nbsp;of&amp;nbsp;the&amp;nbsp;blockchain&amp;nbsp;transaction
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;verified:&amp;nbsp;boolean,&amp;nbsp;//&amp;nbsp;true&amp;nbsp;if&amp;nbsp;the&amp;nbsp;transaction&amp;nbsp;matches&amp;nbsp;the&amp;nbsp;payment,&amp;nbsp;false&amp;nbsp;otherwise
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_link:&amp;nbsp;string,&amp;nbsp;//&amp;nbsp;a&amp;nbsp;link&amp;nbsp;to&amp;nbsp;the&amp;nbsp;operation&amp;nbsp;on&amp;nbsp;the&amp;nbsp;Blockchain&amp;nbsp;API
&amp;nbsp;&amp;nbsp;},
};&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;RewardedAdStatusDTO&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;{
&amp;nbsp;&amp;nbsp;&amp;quot;identifier&amp;quot;:&amp;nbsp;string;&amp;nbsp;//&amp;nbsp;the&amp;nbsp;adId&amp;nbsp;token&amp;nbsp;returned&amp;nbsp;from&amp;nbsp;the&amp;nbsp;Pi&amp;nbsp;SDK&amp;nbsp;displayAd(&amp;quot;rewarded&amp;quot;)&amp;nbsp;method
&amp;nbsp;&amp;nbsp;&amp;quot;mediator_ack_status&amp;quot;:&amp;nbsp;&amp;quot;granted&amp;quot;&amp;nbsp;|&amp;nbsp;&amp;quot;revoked&amp;quot;&amp;nbsp;|&amp;nbsp;&amp;quot;failed&amp;quot;&amp;nbsp;|&amp;nbsp;null;
&amp;nbsp;&amp;nbsp;&amp;quot;mediator_granted_at&amp;quot;:&amp;nbsp;string&amp;nbsp;|&amp;nbsp;null;&amp;nbsp;//&amp;nbsp;ISO&amp;nbsp;8601&amp;nbsp;date&amp;nbsp;string
&amp;nbsp;&amp;nbsp;&amp;quot;mediator_revoked_at&amp;quot;:&amp;nbsp;string&amp;nbsp;|&amp;nbsp;null;&amp;nbsp;//&amp;nbsp;ISO&amp;nbsp;8601&amp;nbsp;date&amp;nbsp;string&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Thu, 04 Dec 2025 16:16:40 +0800</pubDate></item><item><title>PiNet 元数据</title><link>http://www.zuud.cn/doc/20251269/</link><description>&lt;h3&gt;概述&lt;/h3&gt;&lt;p&gt;PiNet 支持代表您的应用程序公开元数据标签。此功能最实用的用途是代理负责 Facebook Open Graph 和 Twitter Cards 缩略图的 HTML 元标签，这可以进一步提升您的应用程序的知名度和增长。&lt;/p&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/pi-apps/pi-platform-docs/blob/master/img/pinet_og_example.png&quot; style=&quot;box-sizing: border-box; background-color: rgb(255, 255, 255); text-underline-offset: 0.2rem; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap-mode: wrap;&quot;&gt;&lt;img src=&quot;http://www.zuud.cn/zb_users/upload/2025/12/20251204160540176483554099372.png&quot; alt=&quot;Open Graph 示例&quot; style=&quot;box-sizing: content-box; border-style: none; max-width: 100%;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;目前有两种方法可以使用该功能，在本文档的后续部分，我们将分别称之为frontend流程backend。&lt;/p&gt;&lt;h3&gt;前端元数据支持&lt;/h3&gt;&lt;p&gt;所有在 PiNet 注册的应用默认启用元数据支持选项。该frontend选项会像机器人一样从您的应用前端抓取数据，然后代表您发布这些数据。作为开发者，您只需确保在 HTML 文件中正确添加 meta 标签，无需担心 PiNet 如何抓取它们。metatags.io 是一个用于验证 HTML 文件的实用工具。如果您想要发布的meta标签已存在于该工具中，并且您选择了相应的流程，PiNet 也应该会自动抓取它们frontend。&lt;/p&gt;&lt;p&gt;元frontend数据支持对于以下类型的开发者来说是一个相关的选项：&lt;/p&gt;&lt;p&gt;a. 对公开整个应用程序的单一元数据集感兴趣，b. 对在开发 SSR 应用程序时公开每个页面的动态元数据感兴趣。&lt;/p&gt;&lt;h3&gt;后端元数据支持&lt;/h3&gt;&lt;p&gt;尽管该frontend流程非常简单，且对使用 Web 和 SSR 框架的开发人员所需的自定义配置极少，但对于单页应用程序 (SPA) 开发人员来说可能不太方便。因此，PiNet 还提供了一个自定义解决方案，该方案涉及backendPiNet 与您的应用程序之间的通信，以便如果您正在开发单页应用程序，则可以使您的页面动态生成元数据标签。&lt;/p&gt;&lt;h3&gt;先决条件&lt;/h3&gt;&lt;p&gt;使用backend元数据支持选项之前，必须先在 Pi 开发者门户应用中启用它。打开 Pi 开发者门户应用，选择要为其启用backendPiNet 元数据支持的应用，然后进入“PiNet 设置”。在“元数据支持类型backend”字段中选择该选项，并提供有效的后端 URL。&lt;/p&gt;&lt;p&gt;注意：在配置 PiNet 设置之前，该应用程序必须在 Pi 开发者门户中注册一个已验证的域名。&lt;/p&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/pi-apps/pi-platform-docs/blob/master/img/pinet_metadata_devportal_settings.png&quot; style=&quot;box-sizing: border-box; background-color: rgb(255, 255, 255); text-underline-offset: 0.2rem; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap-mode: wrap;&quot;&gt;&lt;img src=&quot;http://www.zuud.cn/zb_users/upload/2025/12/20251204161624176483618465105.png&quot; alt=&quot;前往 Pi 开发者门户中的 PiNet 设置&quot; style=&quot;box-sizing: content-box; border-style: none; max-width: 100%; width: 360px;&quot;/&gt;&lt;/a&gt;&lt;span style=&quot;color: #1F2328; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/pi-apps/pi-platform-docs/blob/master/img/pinet_metadata_devportal_choose_backend.png&quot; style=&quot;box-sizing: border-box; background-color: rgb(255, 255, 255); text-underline-offset: 0.2rem; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap-mode: wrap;&quot;&gt;&lt;img src=&quot;http://www.zuud.cn/zb_users/upload/2025/12/20251204160605176483556512265.png&quot; alt=&quot;前往 Pi 开发者门户中的 PiNet 设置&quot; style=&quot;box-sizing: content-box; border-style: none; max-width: 100%; width: 360px;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;后端设置&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;选择元数据支持类型后backend，PiNet 会向您的后端端点发送 GET 请求，并将/pinet/meta?pathname=&amp;lt;encoded-pathname&amp;gt;URL 的路径名作为搜索参数传递。例如，对于使用 PiNet 子域名example（可通过`&amp;lt;URL&amp;gt;` 访问https://example.pinet.com）的 PiNet 应用程序，当https://example.pinet.com/faq/1使用 `&amp;lt;URL&amp;gt;` 时，PiNet 会向 `&amp;lt;URL&amp;gt;` 发送 GET 请求https://examplebackendurl.com/pinet/meta?pathname=%2Ffaq%2F1&amp;#39;，并期望收到PiNetMetadataDTO形状为 `&amp;lt;DTO&amp;gt;` 的响应。如果响应的 HTTP 状态码为 200 且形状正确，PiNet 将会对外公开元数据。&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;类型&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;PiNetMetadataDTO&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;PiNet 要求您提供PiNetMetadataDTO类型信息。DTO 顶层的所有字段都是可选的，因此如果您不想提供所有元数据详细信息，可以省略。但是，如果提供了某些嵌套类型，则需要您提供相应的必填字段。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;在以下类型别名定义中，所有?键名后紧跟 `\` 的字段都表示可选字段。例如，`\`title?:表示可选字段，而 ` title:\` 则表示必填字段。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;type&amp;nbsp;PiNetMetadataDTO&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;title?:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;description?:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;authors?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;Author&amp;nbsp;|&amp;nbsp;Array&amp;lt;Author&amp;gt;;
&amp;nbsp;&amp;nbsp;keywords?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;Array&amp;lt;string&amp;gt;;
&amp;nbsp;&amp;nbsp;creator?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;publisher?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;formatDetection?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;FormatDetection;
&amp;nbsp;&amp;nbsp;abstract?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;archives?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;Array&amp;lt;string&amp;gt;;
&amp;nbsp;&amp;nbsp;category?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;classification?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;openGraph?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;OGMetadata;
&amp;nbsp;&amp;nbsp;twitter?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;TwitterMetadata;
&amp;nbsp;&amp;nbsp;icons?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;Array&amp;lt;Icon&amp;gt;&amp;nbsp;|&amp;nbsp;Icons;
};&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;下面列出了上述代码中使用的默认 HTML 元标记的特定类型别名PiNetMetadataDTO：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;type&amp;nbsp;Author&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;url?:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;name?:&amp;nbsp;string;
};
type&amp;nbsp;FormatDetection&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;telephone?:&amp;nbsp;boolean;
&amp;nbsp;&amp;nbsp;date?:&amp;nbsp;boolean;
&amp;nbsp;&amp;nbsp;address?:&amp;nbsp;boolean;
&amp;nbsp;&amp;nbsp;email?:&amp;nbsp;boolean;
&amp;nbsp;&amp;nbsp;url?:&amp;nbsp;boolean;
};
type&amp;nbsp;IconDescriptor&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;url:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;type?:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;sizes?:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;color?:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;rel?:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;media?:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;fetchPriority?:&amp;nbsp;&amp;quot;high&amp;quot;&amp;nbsp;|&amp;nbsp;&amp;quot;low&amp;quot;&amp;nbsp;|&amp;nbsp;&amp;quot;auto&amp;quot;;
};
type&amp;nbsp;Icon&amp;nbsp;=&amp;nbsp;string&amp;nbsp;|&amp;nbsp;IconDescriptor;
type&amp;nbsp;Icons&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;icon?:&amp;nbsp;Icon&amp;nbsp;|&amp;nbsp;Array&amp;lt;Icon&amp;gt;;
&amp;nbsp;&amp;nbsp;shortcut?:&amp;nbsp;Icon&amp;nbsp;|&amp;nbsp;Array&amp;lt;Icon&amp;gt;;
&amp;nbsp;&amp;nbsp;apple?:&amp;nbsp;Icon&amp;nbsp;|&amp;nbsp;Array&amp;lt;Icon&amp;gt;;
&amp;nbsp;&amp;nbsp;other?:&amp;nbsp;IconDescriptor&amp;nbsp;|&amp;nbsp;Array&amp;lt;IconDescriptor&amp;gt;;
};&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;OpenGraph&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;PiNet 允许您定义 OpenGraph 特有的元数据，这些元数据将代表您公开。其主要OGMetadata类型别名是可区分联合，其中type字段是判别因子。因此，如果定义了特定元数据，则某些OGMetadata联合成员允许您指定其他属性type。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-python&quot;&gt;type&amp;nbsp;OGMetadata&amp;nbsp;=
&amp;nbsp;&amp;nbsp;|&amp;nbsp;OGMetadataWebsite
&amp;nbsp;&amp;nbsp;|&amp;nbsp;OGMetadataArticle
&amp;nbsp;&amp;nbsp;|&amp;nbsp;OGMetadataBook
&amp;nbsp;&amp;nbsp;|&amp;nbsp;OGMetadataProfile
&amp;nbsp;&amp;nbsp;|&amp;nbsp;OGMetadataMusicSong
&amp;nbsp;&amp;nbsp;|&amp;nbsp;OGMetadataMusicAlbum
&amp;nbsp;&amp;nbsp;|&amp;nbsp;OGMetadataMusicPlaylist
&amp;nbsp;&amp;nbsp;|&amp;nbsp;OGMetadataMusicRadioStation
&amp;nbsp;&amp;nbsp;|&amp;nbsp;OGMetadataVideoMovie
&amp;nbsp;&amp;nbsp;|&amp;nbsp;OGMetadataVideoEpisode
&amp;nbsp;&amp;nbsp;|&amp;nbsp;OGMetadataVideoTVShow
&amp;nbsp;&amp;nbsp;|&amp;nbsp;OGMetadataVideoOther;
type&amp;nbsp;OGMetadataBase&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;title?:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;description?:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;emails?:&amp;nbsp;Array&amp;lt;string&amp;gt;;
&amp;nbsp;&amp;nbsp;phoneNumbers?:&amp;nbsp;Array&amp;lt;string&amp;gt;;
&amp;nbsp;&amp;nbsp;faxNumbers?:&amp;nbsp;Array&amp;lt;string&amp;gt;;
&amp;nbsp;&amp;nbsp;locale?:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;alternateLocale?:&amp;nbsp;Array&amp;lt;string&amp;gt;;
&amp;nbsp;&amp;nbsp;images?:&amp;nbsp;OGImage&amp;nbsp;|&amp;nbsp;Array&amp;lt;OGImage&amp;gt;;
&amp;nbsp;&amp;nbsp;audio?:&amp;nbsp;Array&amp;lt;OGAudio&amp;gt;;
&amp;nbsp;&amp;nbsp;videos?:&amp;nbsp;Array&amp;lt;OGVideo&amp;gt;;
&amp;nbsp;&amp;nbsp;countryName?:&amp;nbsp;string;
};
type&amp;nbsp;OGMetadataWebsite&amp;nbsp;=&amp;nbsp;OGMetadataBase&amp;nbsp;&amp;amp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;type:&amp;nbsp;&amp;quot;website&amp;quot;;
};
type&amp;nbsp;OGMetadataArticle&amp;nbsp;=&amp;nbsp;OGMetadataBase&amp;nbsp;&amp;amp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;type:&amp;nbsp;&amp;quot;article&amp;quot;;
&amp;nbsp;&amp;nbsp;publishedTime?:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;modifiedTime?:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;expirationTime?:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;authors?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;Array&amp;lt;string&amp;gt;;
&amp;nbsp;&amp;nbsp;section?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;tags?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;Array&amp;lt;string&amp;gt;;
};
type&amp;nbsp;OGMetadataBook&amp;nbsp;=&amp;nbsp;OGMetadataBase&amp;nbsp;&amp;amp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;type:&amp;nbsp;&amp;quot;book&amp;quot;;
&amp;nbsp;&amp;nbsp;isbn?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;releaseDate?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;authors?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;Array&amp;lt;string&amp;gt;;
};
type&amp;nbsp;OGMetadataProfile&amp;nbsp;=&amp;nbsp;OGMetadataBase&amp;nbsp;&amp;amp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;type:&amp;nbsp;&amp;quot;profile&amp;quot;;
&amp;nbsp;&amp;nbsp;firstName?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;lastName?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;username?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;gender?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string;
};
type&amp;nbsp;OGMetadataMusicSong&amp;nbsp;=&amp;nbsp;OGMetadataBase&amp;nbsp;&amp;amp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;type:&amp;nbsp;&amp;quot;music.song&amp;quot;;
&amp;nbsp;&amp;nbsp;duration?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;number;
&amp;nbsp;&amp;nbsp;albums?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;OGAlbum&amp;nbsp;|&amp;nbsp;Array&amp;lt;OGAlbum&amp;gt;;
&amp;nbsp;&amp;nbsp;musicians?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;Array&amp;lt;string&amp;gt;;
};
type&amp;nbsp;OGMetadataMusicAlbum&amp;nbsp;=&amp;nbsp;OGMetadataBase&amp;nbsp;&amp;amp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;type:&amp;nbsp;&amp;quot;music.album&amp;quot;;
&amp;nbsp;&amp;nbsp;songs?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;OGSong&amp;nbsp;|&amp;nbsp;Array&amp;lt;string&amp;nbsp;|&amp;nbsp;OGSong&amp;gt;;
&amp;nbsp;&amp;nbsp;musicians?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;Array&amp;lt;string&amp;gt;;
&amp;nbsp;&amp;nbsp;releaseDate?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string;
};
type&amp;nbsp;OGMetadataMusicPlaylist&amp;nbsp;=&amp;nbsp;OGMetadataBase&amp;nbsp;&amp;amp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;type:&amp;nbsp;&amp;quot;music.playlist&amp;quot;;
&amp;nbsp;&amp;nbsp;songs?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;OGSong&amp;nbsp;|&amp;nbsp;Array&amp;lt;string&amp;nbsp;|&amp;nbsp;OGSong&amp;gt;;
&amp;nbsp;&amp;nbsp;creators?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;Array&amp;lt;string&amp;gt;;
};
type&amp;nbsp;OGMetadataMusicRadioStation&amp;nbsp;=&amp;nbsp;OGMetadataBase&amp;nbsp;&amp;amp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;type:&amp;nbsp;&amp;quot;music.radio_station&amp;quot;;
&amp;nbsp;&amp;nbsp;creators?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;Array&amp;lt;string&amp;gt;;
};
type&amp;nbsp;OGMetadataVideoMovie&amp;nbsp;=&amp;nbsp;OGMetadataBase&amp;nbsp;&amp;amp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;type:&amp;nbsp;&amp;quot;video.movie&amp;quot;;
&amp;nbsp;&amp;nbsp;actors?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;OGActor&amp;nbsp;|&amp;nbsp;Array&amp;lt;OGActor&amp;gt;;
&amp;nbsp;&amp;nbsp;directors?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;Array&amp;lt;string&amp;gt;;
&amp;nbsp;&amp;nbsp;writers?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;Array&amp;lt;string&amp;gt;;
&amp;nbsp;&amp;nbsp;duration?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;number;
&amp;nbsp;&amp;nbsp;releaseDate?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;tags?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;Array&amp;lt;string&amp;gt;;
};
type&amp;nbsp;OGMetadataVideoEpisode&amp;nbsp;=&amp;nbsp;OGMetadataBase&amp;nbsp;&amp;amp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;type:&amp;nbsp;&amp;quot;video.episode&amp;quot;;
&amp;nbsp;&amp;nbsp;actors?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;OGActor&amp;nbsp;|&amp;nbsp;Array&amp;lt;OGActor&amp;gt;;
&amp;nbsp;&amp;nbsp;directors?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;Array&amp;lt;string&amp;gt;;
&amp;nbsp;&amp;nbsp;writers?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;Array&amp;lt;string&amp;gt;;
&amp;nbsp;&amp;nbsp;duration?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;number;
&amp;nbsp;&amp;nbsp;releaseDate?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;tags?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;Array&amp;lt;string&amp;gt;;
&amp;nbsp;&amp;nbsp;series?:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;string;
};
type&amp;nbsp;OGMetadataVideoTVShow&amp;nbsp;=&amp;nbsp;OGMetadataBase&amp;nbsp;&amp;amp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;type:&amp;nbsp;&amp;quot;video.tv_show&amp;quot;;
};
type&amp;nbsp;OGMetadataVideoOther&amp;nbsp;=&amp;nbsp;OGMetadataBase&amp;nbsp;&amp;amp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;type:&amp;nbsp;&amp;quot;video.other&amp;quot;;
};&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;OGMetadata下面列出了上述不同联盟成员重复使用的类型别名：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;type&amp;nbsp;OGImageDescriptor&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;url:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;secureUrl?:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;alt?:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;type?:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;width?:&amp;nbsp;string&amp;nbsp;|&amp;nbsp;number;
&amp;nbsp;&amp;nbsp;height?:&amp;nbsp;string&amp;nbsp;|&amp;nbsp;number;
};
type&amp;nbsp;OGImage&amp;nbsp;=&amp;nbsp;string&amp;nbsp;|&amp;nbsp;OGImageDescriptor;
type&amp;nbsp;OGVideoDescriptor&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;url:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;secureUrl?:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;alt?:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;type?:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;width?:&amp;nbsp;string&amp;nbsp;|&amp;nbsp;number;
&amp;nbsp;&amp;nbsp;height?:&amp;nbsp;string&amp;nbsp;|&amp;nbsp;number;
};
type&amp;nbsp;OGVideo&amp;nbsp;=&amp;nbsp;string&amp;nbsp;|&amp;nbsp;OGVideoDescriptor;
type&amp;nbsp;OGAudioDescriptor&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;url:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;secureUrl?:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;alt?:&amp;nbsp;string;
};
type&amp;nbsp;OGAudio&amp;nbsp;=&amp;nbsp;string&amp;nbsp;|&amp;nbsp;OGAudioDescriptor;
type&amp;nbsp;OGActor&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;url:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;role?:&amp;nbsp;string;
};
type&amp;nbsp;OGSong&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;url:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;disc?:&amp;nbsp;number;
&amp;nbsp;&amp;nbsp;track?:&amp;nbsp;number;
};
type&amp;nbsp;OGAlbum&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;url:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;disc?:&amp;nbsp;number;
&amp;nbsp;&amp;nbsp;track?:&amp;nbsp;number;
};&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;Twitter 卡片&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;与支持 OpenGraph 协议类似，PiNet 允许您定义 Twitter 特有的元数据。其主要OGTwitterMetadata类型别名是可区分联合，其中字段是判别项。因此，如果定义了特定属性card，则某些OGTwitterMetadata联合成员允许您指定其他属性。card&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-python&quot;&gt;type&amp;nbsp;TwitterMetadata&amp;nbsp;=
&amp;nbsp;&amp;nbsp;|&amp;nbsp;TwitterMetadataBase
&amp;nbsp;&amp;nbsp;|&amp;nbsp;TwitterMetadataCardSummary
&amp;nbsp;&amp;nbsp;|&amp;nbsp;TwitterMetadataCardSummaryLargeImage
&amp;nbsp;&amp;nbsp;|&amp;nbsp;TwitterMetadataCardPlayer
&amp;nbsp;&amp;nbsp;|&amp;nbsp;TwitterMetadataCardApp;
type&amp;nbsp;TwitterMetadataBase&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;title?:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;description?:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;creator?:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;creatorId?:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;images?:&amp;nbsp;TwitterImage&amp;nbsp;|&amp;nbsp;Array&amp;lt;TwitterImage&amp;gt;;
};
type&amp;nbsp;TwitterMetadataCardSummary&amp;nbsp;=&amp;nbsp;TwitterMetadataBase&amp;nbsp;&amp;amp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;card:&amp;nbsp;&amp;quot;summary&amp;quot;;
};
type&amp;nbsp;TwitterMetadataCardSummaryLargeImage&amp;nbsp;=&amp;nbsp;TwitterMetadataBase&amp;nbsp;&amp;amp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;card:&amp;nbsp;&amp;quot;summary_large_image&amp;quot;;
};
type&amp;nbsp;TwitterMetadataCardPlayer&amp;nbsp;=&amp;nbsp;TwitterMetadataBase&amp;nbsp;&amp;amp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;card:&amp;nbsp;&amp;quot;player&amp;quot;;
&amp;nbsp;&amp;nbsp;players:&amp;nbsp;TwitterPlayerDescriptor&amp;nbsp;|&amp;nbsp;Array&amp;lt;TwitterPlayerDescriptor&amp;gt;;
};
type&amp;nbsp;TwitterMetadataCardApp&amp;nbsp;=&amp;nbsp;TwitterMetadataBase&amp;nbsp;&amp;amp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;card:&amp;nbsp;&amp;quot;app&amp;quot;;
};
OGTwitterMetadata下面列出了上述不同联盟成员重复使用的类型别名：
type&amp;nbsp;TwitterImageDescriptor&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;url:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;secureUrl?:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;alt?:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;type?:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;width?:&amp;nbsp;string&amp;nbsp;|&amp;nbsp;number;
&amp;nbsp;&amp;nbsp;height?:&amp;nbsp;string&amp;nbsp;|&amp;nbsp;number;
};
type&amp;nbsp;TwitterImage&amp;nbsp;=&amp;nbsp;string&amp;nbsp;|&amp;nbsp;TwitterImageDescriptor;
type&amp;nbsp;TwitterPlayerDescriptor&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;url:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;width:&amp;nbsp;number;
&amp;nbsp;&amp;nbsp;height:&amp;nbsp;number;
};&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;PiNetMetadataDTO验证工具&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;这PiNetMetadataDTO可能会变得相当复杂，您可能难以验证您提供的 DTO 是否能通过 PiNet 的内部验证。您可以使用PiNet上提供的表单来验证您的 DTO 是否有效。&lt;/span&gt;&lt;/p&gt;</description><pubDate>Thu, 04 Dec 2025 15:56:51 +0800</pubDate></item><item><title>预付款</title><link>http://www.zuud.cn/doc/20251268/</link><description>&lt;p&gt;虽然 Pi 前端 JavaScript SDK 支持创建 U2A（用户到应用）支付，但您的应用可能还需要具备 A2U（应用到用户）支付功能。本文档将向您展示如何进行 A2U 支付。&lt;/p&gt;&lt;p&gt;请注意，A2U支付功能目前仅在测试网上可用。&lt;/p&gt;&lt;h3&gt;Pi 后端 SDK&lt;/h3&gt;&lt;p&gt;以下是可用于 A2U 支付流程的每种语言（或运行时）的 Pi 后端 SDK 列表。&lt;/p&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;strong&gt;语言&lt;/strong&gt;&lt;/td&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;strong&gt;关联&lt;/strong&gt;&lt;/td&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;strong&gt;地位&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;Ruby&lt;/td&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;pi-ruby&lt;/td&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;由 Pi 核心团队官方支持&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;Node.js&lt;/td&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;pi-nodejs&lt;/td&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;即将推出！ - 由 Pi 核心团队官方支持&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;Python&lt;/td&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;待定&lt;/td&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;社区维护&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;PHP&lt;/td&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;待定&lt;/td&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;社区维护&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;我们非常欢迎其他编程语言的社区维护者，如果您有兴趣维护 Pi SDK，请在PiOS 存储库中提交 PR。&lt;/p&gt;&lt;h3&gt;支持的功能&lt;/h3&gt;&lt;p&gt;本节列出了各个后端 SDK 支持的功能，这些功能可用于将树莓派集成到应用程序中。有关如何使用每个功能的具体信息，请参阅您在项目中使用的库的特定文档（参见上一节中的表格）。&lt;/p&gt;&lt;h3&gt;应用内用户支付&lt;/h3&gt;&lt;p&gt;目前A2U支付的设计涉及与Pi区块链和Pi后端的交互。Pi区块链显然是Pi交易的唯一权威来源。Pi后端用于改善终端用户体验（例如，为用户提供易于理解的钱包备注，并提供指向您应用程序的链接，同时通过不在区块链上公开这些信息来保护用户和开发者的隐私），并帮助开发者避免支付错误（例如，由于服务器故障导致的重复支付）。&lt;/p&gt;&lt;p&gt;好处：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;更好的用户隐私：&lt;/strong&gt;只要用户同意与您的应用程序共享钱包地址，此 API 即可安全地访问用户的钱包地址，并且鼓励开发者仅在真正打算向用户发送 π 时才访问用户的钱包，从而实现更好的隐私和用户安全。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;用户钱包准确性：&lt;/strong&gt;如果需要更改钱包，API 会返回当前用户钱包，以避免应用程序将 Pi 发送到已弃用、无法访问的用户钱包地址。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;为用户和应用开发者提供更佳体验：&lt;/strong&gt;一旦交易在区块链上发生，便无法撤销。在进行交易前通知 Pi 后端服务器您的付款信息，完成交易后再次通知后端服务器，即可在因技术问题导致交易记录未保存到数据库时，恢复相关的元数据和区块链交易信息。这样，作为第三方，Pi 后端可以帮助您避免重复付款或其他可能导致应用钱包意外清空的错误。当然，很多环节都可能出错，作为应用开发者，您是唯一负责管理应用钱包和资产的一方。此处提供的 API 按原样提供，不作任何保证。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;与 Pi 生态系统更好地集成：&lt;/strong&gt;使用 A2U API 可以让用户钱包中的付款显示为来自您的应用，而不是显示为来自未知地址的随机交易。这在未来可以带来更佳的用户体验，例如在用户钱包中提供直接链接返回您的应用，或者在用户钱包中直接显示已购买或已退货商品的缩略图图标。&lt;/p&gt;</description><pubDate>Thu, 04 Dec 2025 15:51:34 +0800</pubDate></item><item><title>付款</title><link>http://www.zuud.cn/doc/20251267/</link><description>&lt;p&gt;支付是区块链交易的封装，它使你的应用程序、Pi 区块链和 Pi 服务器能够在用户提交区块链交易以在你的应用程序中支付某些东西时保持同步。&lt;/p&gt;&lt;p&gt;它们使应用程序的开发者能够完全确信用户确实进行了交易，同时不必担心与 Pi 区块链交互时涉及的技术细节。&lt;/p&gt;&lt;h3&gt;支付流程&lt;/h3&gt;&lt;p&gt;支付创建完成后，会经历 3 个主要阶段：&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: decimal;&quot;&gt;&lt;li&gt;&lt;p&gt;支付创建和服务器端审批&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;用户交互和区块链交易&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;服务器端完成&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/pi-apps/pi-platform-docs/blob/master/img/payment_flow.png&quot; style=&quot;box-sizing: border-box; background-color: rgb(255, 255, 255); text-underline-offset: 0.2rem; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap-mode: wrap;&quot;&gt;&lt;img src=&quot;http://www.zuud.cn/zb_users/upload/2025/12/20251204155109176483466988236.png&quot; alt=&quot;支付流程&quot; style=&quot;box-sizing: content-box; border-style: none; max-width: 100%;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;第一阶段 - 付款创建和服务器端审批&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;1.createPayment您的应用前端会创建支付请求。支付流程界面会打开，但在服务器批准支付请求之前，您无法与之交互。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;2.onReadyForServerApprovalJS SDK 已获取支付标识符 (PaymentID)，并将其传递给您的应用程序以进行服务器端批准。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;3.您的应用前端会将支付ID发送到您的应用服务器。这部分实现由您负责。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;4.服务器端审批：您的应用服务器通过 API 调用向 Pi Servers 审批付款/approve。这使得用户能够提交区块链交易。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;第二阶段 - 用户交互和区块链交易&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;在此阶段，支付对话框变为交互式，用户可以确认交易、签名并将其提交到 Pi 区块链。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;现阶段您无需做任何事情，一切都由 Pi Apps 平台和 Pi 钱包处理。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;区块链交易提交后，支付流程不会关闭。您需要通过服务器端完成确认付款，您的应用才能再次显示。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;第三阶段 - 服务器端完成&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;5.onReadyForServerCompletionJS SDK 会将区块链交易标识符 (TxID) 传递给您的应用程序前端。您需要此值来进行服务器端完成流程。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;6.您的应用前端会将 TxID 发送到您的应用服务器。这部分实现由您负责。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;7.服务器端完成：您的应用程序服务器通过 API 调用向 Pi 服务器确认付款/complete。这使您能够检查区块链交易是否实际发生，并告知 Pi 您已获知该交易。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;8.支付流程已完成。您的应用现在对用户可见。您的应用服务器和前端可以交换数据，并更新应用界面，向用户显示确认页面。此实现由您负责。&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;用户可能对你的应用撒谎！&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;用户可能正在运行破解版的 SDK，伪装成已完成付款。如果服务器端完成的 API 调用返回非 200 错误代码，请勿将付款标记为已完成，也不要交付用户试图购买的任何商品。&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;简化流程&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;此图以简化的方式从您的应用程序的角度展示了相同的支付流程。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/pi-apps/pi-platform-docs/blob/master/img/payment_flow_simplified.png&quot; style=&quot;box-sizing: border-box; background-color: rgb(255, 255, 255); text-underline-offset: 0.2rem; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap-mode: wrap;&quot;&gt;&lt;img src=&quot;https://github.com/pi-apps/pi-platform-docs/raw/master/img/payment_flow_simplified.png&quot; alt=&quot;支付流程&quot; style=&quot;box-sizing: content-box; border-style: none; max-width: 100%;&quot;/&gt;&lt;/a&gt;&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: decimal;&quot;&gt;&lt;li&gt;&lt;p&gt;使用 Pi SDK 函数发起支付&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;由 Pi SDK 自动调用的回调函数（通知您的应用服务器需要发出批准 API 请求）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;从您的应用服务器向 Pi 服务器发出 API 请求以批准付款（让 Pi 服务器知道您已了解此笔付款）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Pi浏览器会向用户显示支付详情页面，我们正在等待用户签署交易。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;由 Pi SDK 自动调用的回调函数（通知您的应用服务器需要发出完整的 API 请求）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;从您的应用服务器向 Pi 服务器发出 API 请求以完成付款（告知 Pi 服务器您已完成此付款）。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;</description><pubDate>Thu, 04 Dec 2025 15:45:47 +0800</pubDate></item><item><title>Pi 开发者门户</title><link>http://www.zuud.cn/doc/20251266/</link><description>&lt;p&gt;借助 Pi SDK 和 Pi API，您可以创建可在 Pi 浏览器中运行的应用程序，供其他 Pi 用户使用。您可以在 Pi 开发者门户注册并配置您的应用程序，以便将其连接到 Pi 区块链。&lt;/p&gt;&lt;h3&gt;如何注册您的应用&lt;/h3&gt;&lt;p&gt;1.您可以使用 Pi 浏览器访问 Pi 开发者门户。访问pi://develop.piPi 开发者门户，网址为 [此处应填写网址]。首次进入主页时，您不会看到任何应用。要注册您的应用，请点击“新建应用”按钮。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://www.zuud.cn/zb_users/upload/2025/12/20251204151808176483268852506.png&quot; alt=&quot;绘画&quot; width=&quot;300&quot;/&gt;&lt;/p&gt;&lt;p&gt;2.首先，您需要填写 3 个必填字段。“应用网络”选项允许您选择应用连接的主机网络。根据此选项，Pi SDK 会自动将您的应用连接到相应的网络，即 Pi 主网或 Pi 测试网。请注意，一个应用一次只能连接到一个网络，并且一旦注册应用，此选项将无法更改。这意味着建议您创建两个不同的应用，一个连接到测试网用于测试，另一个连接到主网用于生产环境。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://www.zuud.cn/zb_users/upload/2025/12/20251204151811176483269166649.png&quot; alt=&quot;绘画&quot; width=&quot;300&quot;/&gt;&lt;/p&gt;&lt;p&gt;3.注册应用后，您可以查看应用的详细信息。每个应用都有自己的“应用清单”，帮助您跟踪成功设置应用所需的步骤。要查看清单，请点击“应用清单”按钮。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://www.zuud.cn/zb_users/upload/2025/12/20251204151816176483269619955.png&quot; alt=&quot;绘画&quot; width=&quot;300&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;br style=&quot;box-sizing: border-box; color: rgb(31, 35, 40); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Noto Sans&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;; font-size: 16px; text-wrap-mode: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;/p&gt;&lt;p&gt;4.清单步骤将随着您完成每个步骤而依次解锁。第一步是配置主机选项。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://www.zuud.cn/zb_users/upload/2025/12/20251204151825176483270561352.png&quot; alt=&quot;绘画&quot; width=&quot;300&quot;/&gt;&lt;/p&gt;&lt;p&gt;5.配置好托管选项后，您会看到“应用钱包”按钮已启用，下一步是将钱包连接到应用。请按照说明创建应用并将其连接到您的应用。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://www.zuud.cn/zb_users/upload/2025/12/20251204151831176483271123208.png&quot; alt=&quot;绘画&quot; width=&quot;300&quot;/&gt;&lt;/p&gt;&lt;p&gt;6.将应用钱包连接到应用后，清单将显示相关文档，您可以参考这些文档开始使用。接下来，您可以查看并按照剩余步骤完成应用的配置。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://www.zuud.cn/zb_users/upload/2025/12/20251204151844176483272433771.png&quot; alt=&quot;绘画&quot; width=&quot;300&quot;/&gt;&lt;/p&gt;&lt;h3&gt;Pi 浏览器中的测试网应用程序&lt;/h3&gt;&lt;p&gt;如果您已将您的应用程序注册到 Pi 测试网，并且在 Pi 浏览器中访问您的应用程序，则顶部将显示黑黄相间的条纹，以表明此应用程序已连接到 Pi 测试网。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://www.zuud.cn/zb_users/upload/2025/12/20251204151847176483272781267.png&quot; alt=&quot;绘画&quot; width=&quot;300&quot;/&gt;&lt;/p&gt;&lt;h3&gt;遗留项目创建于 2022 年 7 月 26 日之前&lt;/h3&gt;&lt;p&gt;在 Pi 主网 SDK 发布之前存在的项目将指向 Pi 测试网。&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;此内容无法更改或更新&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;创建新的开发者门户项目是最佳实践。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;拥有先前创建的遗留项目的开发人员和团队&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1.创建一个新的开发者门户项目&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: circle;&quot;&gt;&lt;li&gt;&lt;p&gt;选择主网 - 这将是应用程序的主网版本&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;URL&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: square;&quot;&gt;&lt;li&gt;&lt;p&gt;A.该项目应包含 Pioneers 通过 Pi 浏览器访问应用程序所需的 URL。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;B.URL所有权将通过验证过程确定。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: circle;&quot;&gt;&lt;li&gt;&lt;p&gt;支付钱包&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: square;&quot;&gt;&lt;li&gt;&lt;p&gt;A.在开发者/应用钱包创建完成之前，创建新项目页面的开发者的钱包地址将用于处理所有交易。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;B.如果项目页面创建者没有在主网迁移中创建的 Pi 钱包地址，则所有交易都将失败。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;2.创建第二个新的开发者项目页面&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;选择测试网 - 这将用于测试目的&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;URL&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;A.不能与主网 URL 相同&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;B.必须由开发商所有。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;设置所需的访问权限&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;本项目可以与步骤 1 中创建的主网项目关联起来。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;3.将主网项目链接到 Brainstorm 项目（如果适用）&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;截至 2022 年 7 月，一个开发者门户项目只能链接到一个头脑风暴项目。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;特殊考虑&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;如果一个应用团队中没有任何成员拥有主网钱包&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;请通过Pi 支持门户联系 Pi CT。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;对于“你的问题与什么有关？”这个问题&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;选择“Pi 主网 SDK 钱包”&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;提交联系信息&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Pi CT 的一名成员将跟进此事。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/pi-apps/pi-platform-docs/blob/master/img/testnet_indicator.png&quot; style=&quot;box-sizing: border-box; background-color: rgba(0, 0, 0, 0); text-underline-offset: 0.2rem;&quot;&gt;&lt;/a&gt;&lt;/p&gt;</description><pubDate>Thu, 04 Dec 2025 11:50:19 +0800</pubDate></item><item><title>身份验证</title><link>http://www.zuud.cn/doc/20251265/</link><description>&lt;p&gt;本文简要介绍了如何使用 Pi SDK 和 API 接口处理用户身份验证。如需详细说明，请参阅Pi.authenticate（SDK 参考文档）和/me（API 参考文档）。&lt;/p&gt;&lt;h3&gt;指导&lt;/h3&gt;&lt;p&gt;以下是您在对应用用户进行身份验证时可以遵循的步骤：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. 调用authenticate()Pi SDK&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;使用 Pi SDK authenticate()，您可以获取用户信息以及访问令牌。&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;const&amp;nbsp;authRes&amp;nbsp;=&amp;nbsp;await&amp;nbsp;window.Pi.authenticate(scopes,&amp;nbsp;onIncompletePaymentFound);&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;/me2.使用访问令牌向 Pi API 端点发送 GET 请求进行验证&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;要验证您在步骤 1 中获取的数据，您需要向/mePi API 端点发送一个 GET 请求，并在请求头中包含访问令牌。如果访问令牌有效，则会返回包含UserDTO的响应。但是，如果令牌无效，则会返回 HTTP 401 未授权错误代码。&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;const&amp;nbsp;me&amp;nbsp;=&amp;nbsp;await&amp;nbsp;axios.get(&amp;#39;https://api.minepi.com/v2/me&amp;#39;,&amp;nbsp;{headers:&amp;nbsp;{&amp;#39;Authorization&amp;#39;:&amp;nbsp;`Bearer&amp;nbsp;${accessToken}}});&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Thu, 04 Dec 2025 11:48:19 +0800</pubDate></item><item><title>广告</title><link>http://www.zuud.cn/doc/20251264/</link><description>&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;本文档介绍了广告及其示例流程。有关 Pi SDK 提供的纯函数定义，请参阅SDK 参考文档的“广告”部分。&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;介绍&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;Pi 应用平台让开发者有机会将广告集成到他们的 Pi 应用中并获得奖励。Pi 生态系统中的所有应用都可以展示广告，但只有经过 Pi 核心团队批准的应用才能实现盈利。目前支持三种类型的广告：插页式广告、激励式广告和横幅广告。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;插页式广告&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;插播广告是全屏广告，旨在显示在某些内容之间，通常是在自然过渡点或休息时间，例如在活动或游戏关卡之间。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;从技术上讲，插页式广告可以随时显示，但请查看我们的最佳实践文档以了解更多信息。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;激励广告&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;激励广告是全屏广告，旨在向用户展示，用户观看后可在开发者的应用内获得奖励。例如，如果您正在开发一款游戏应用，玩家的生命值耗尽但仍想继续游戏，您可以提供观看激励广告来获得额外生命值的选项。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;由于激励广告旨在奖励用户，因此只有经过应用身份验证的用户才能看到它们&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;横幅广告&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;横幅广告是一种叠加式广告，会在用户使用应用时出现在屏幕顶部或底部。与全屏广告相比，横幅广告的干扰性更小，并且可以在应用使用过程中持续显示。横幅广告非常适合在不干扰用户体验的前提下，保持广告的持续曝光。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;由于横幅广告始终可见，因此应将其放置在不会干扰应用程序主要内容或功能的非侵入性位置。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;目前 Pi SDK不支持横幅广告，但您可以通过在开发者门户的广告设置中启用“加载中横幅广告”选项来使用此功能。加载中横幅广告会在您的应用加载时自动向用户显示。要了解更多信息，请参阅“启用加载中横幅广告”部分。&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;先决条件&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;要获得 Pi 开发者广告网络的奖励，您必须在 Pi 开发者门户网站上申请。提交申请后，Pi 核心团队将审核您的申请。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;注意：根据您的应用是否已获准加入 Pi 开发者广告网络，广告模块的某些方法可能会返回略有不同的响应。这些差异在SDK 参考文档的方法定义中均有说明。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;开发者广告网络应用程序&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;即将推出...&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;支持用户树莓派浏览器上的广告网络&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;您的用户可能正在使用旧版本的 Pi Browser，这些版本不支持开发者广告网络。您可以使用Pi.nativeFeaturesListSDK 方法确保广告网络可用，该方法会返回一个数组，列出给定 Pi Browser 版本上可用的原生功能。为了使广告正常运行，原生功能列表数组中必须包含ad_network字符串。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;//&amp;nbsp;you&amp;nbsp;usually&amp;nbsp;would&amp;nbsp;check&amp;nbsp;the&amp;nbsp;ads&amp;nbsp;support&amp;nbsp;ahead&amp;nbsp;of&amp;nbsp;time&amp;nbsp;and&amp;nbsp;store&amp;nbsp;the&amp;nbsp;information
(async&amp;nbsp;()&amp;nbsp;=&amp;gt;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;await&amp;nbsp;Pi.init({&amp;nbsp;version:&amp;nbsp;&amp;quot;2.0&amp;quot;&amp;nbsp;});
&amp;nbsp;&amp;nbsp;const&amp;nbsp;nativeFeaturesList&amp;nbsp;=&amp;nbsp;await&amp;nbsp;Pi.nativeFeaturesList();
&amp;nbsp;&amp;nbsp;const&amp;nbsp;adNetworkSupported&amp;nbsp;=&amp;nbsp;nativeFeaturesList.includes(&amp;quot;ad_network&amp;quot;);
&amp;nbsp;&amp;nbsp;//&amp;nbsp;store&amp;nbsp;adNetworkSupported&amp;nbsp;for&amp;nbsp;later&amp;nbsp;use
})();&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;如果ad_network缺少该功能，并且您想向用户展示广告，您可以鼓励他们更新 Pi 浏览器。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;当 promises 从Pi.Ads.requestAdandPi.Ads.showAd方法返回并解析为时&amp;quot;ADS_NOT_SUPPORTED&amp;quot;，它等同&amp;quot;ad_network&amp;quot;于原生功能列表数组中缺少该功能。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;有关上面使用的 Pi SDK 方法的详细定义，请转到SDK 参考。&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;执行&lt;/span&gt;&lt;/h3&gt;&lt;h3&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;基本用法&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;Pi 浏览器内部管理广告可用性策略，自动加载初始广告并在需要显示时重新加载。这旨在确保广告始终处于可显示状态。因此，在大多数情况下，您只需调用相应Pi.Ads.showAd()方法并将广告类型作为参数传递，即可向用户展示广告。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;插页式广告&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;插页式广告易于集成，通常显示在一些过渡节点附近。例如，一款关卡制游戏应用可以每隔三关显示一次插页式广告。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;//&amp;nbsp;we&amp;nbsp;pretend&amp;nbsp;that&amp;nbsp;the&amp;nbsp;game&amp;nbsp;app&amp;nbsp;has&amp;nbsp;just&amp;nbsp;reached&amp;nbsp;end&amp;nbsp;of&amp;nbsp;3rd&amp;nbsp;level&amp;nbsp;according&amp;nbsp;to&amp;nbsp;above&amp;nbsp;example
completeLevel();
if&amp;nbsp;(currentLevel&amp;nbsp;%&amp;nbsp;3&amp;nbsp;===&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;await&amp;nbsp;Pi.Ads.showAd(&amp;quot;interstitial&amp;quot;);
}
startNewLevel();&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;激励广告&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;激励广告旨在奖励观看广告的用户。以游戏应用为例，如果你的游戏给用户一定数量的生命值，而当他用完生命值时，你可以让他观看广告来换取一条额外的生命值。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;激励广告的展示依然简单，但需要更多努力来确保安全性并验证用户是否应该获得奖励。该Pi.Ads.showAd(&amp;quot;rewarded&amp;quot;)方法返回一个带有额外字段的 Promise adId，您可以使用该字段根据 Pi Platform API 验证 Pi SDK 响应的有效性。&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;用户可能正在使用你的应用作弊！&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;展示激励广告后，用户应该能在您的应用中获得某种奖励。由于用户可能运行的是破解版的 SDK 并拦截您的displayAd(&amp;#39;rewarded&amp;#39;)方法，因此您必须在奖励用户之前，使用 Pi Platform API 验证广告的激励状态。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;有关 Pi 平台 API 的文档，请参阅平台 API 文档。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;mediator_ack_status只有当给定的广告有效时，才应该向用户提供奖励&amp;quot;granted&amp;quot;。&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;const&amp;nbsp;showAdResponse&amp;nbsp;=&amp;nbsp;await&amp;nbsp;Pi.Ads.showAd(&amp;quot;rewarded&amp;quot;);
if&amp;nbsp;(showAdResponse.result&amp;nbsp;===&amp;nbsp;&amp;quot;AD_REWARDED&amp;quot;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;//&amp;nbsp;delegate&amp;nbsp;rewarding&amp;nbsp;user&amp;nbsp;to&amp;nbsp;your&amp;nbsp;backend
&amp;nbsp;&amp;nbsp;//&amp;nbsp;e.g.:
&amp;nbsp;&amp;nbsp;const&amp;nbsp;result&amp;nbsp;=&amp;nbsp;await&amp;nbsp;rewardUserForWatchingRewardedAd(showAdResponse.adId);
&amp;nbsp;&amp;nbsp;if&amp;nbsp;(result.rewarded&amp;nbsp;===&amp;nbsp;true)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;grantUserAdditionalLive();
&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;启用加载横幅广告&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;您可以在开发者门户启用加载中横幅广告。https://develop.pinet.com在 Pi 浏览器中找到您想要启用加载中横幅广告的应用。前往“开发者广告网络”菜单项，然后选择“设置”。从那里切换“启用加载中横幅广告”选项。您可以随时禁用它。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;您的应用广告相关设置已被缓存，因此要看到效果，您可能需要等待或重置 Pi Browser 以使缓存失效。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;高级用法&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;虽然上一节中的示例足以让您的应用程序开始向用户显示广告，但您可能会发现自己需要执行其他操作，例如手动请求广告或检查广告可用性。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;在某些情况下，广告加载可能会失败或中断。如果您发现某个广告不可用，可以尝试手动调用函数，Pi.Ads.requestAd()并将广告类型作为参数传递。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;在其他情况下，您可能需要在调用方法之前知道广告是否已准备就绪Pi.Ads.showAd()。您可以使用Pi.Ads.isAdReady()传递广告类型作为参数的方法来检查这一点。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;有关 Pi SDK 方法及其所有可能响应类型的完整定义，请查看SDK 参考文档。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;插页式广告高级使用方法&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;//&amp;nbsp;we&amp;nbsp;pretend&amp;nbsp;that&amp;nbsp;the&amp;nbsp;game&amp;nbsp;app&amp;nbsp;has&amp;nbsp;just&amp;nbsp;reached&amp;nbsp;end&amp;nbsp;of&amp;nbsp;3rd&amp;nbsp;level&amp;nbsp;according&amp;nbsp;to&amp;nbsp;previous&amp;nbsp;example
completeLevel();
if&amp;nbsp;(currentLevel&amp;nbsp;%&amp;nbsp;3&amp;nbsp;===&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;const&amp;nbsp;isAdReadyResponse&amp;nbsp;=&amp;nbsp;await&amp;nbsp;Pi.Ads.isAdReady(&amp;quot;interstitial&amp;quot;);
&amp;nbsp;&amp;nbsp;if&amp;nbsp;(isAdReadyResponse.ready&amp;nbsp;===&amp;nbsp;true)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;Pi.Ads.showAd(&amp;quot;interstitial&amp;quot;);
&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;const&amp;nbsp;requestAdResponse&amp;nbsp;=&amp;nbsp;await&amp;nbsp;Pi.Ads.requestAd(&amp;quot;interstitial&amp;quot;);
&amp;nbsp;&amp;nbsp;if&amp;nbsp;(requestAdResponse.result&amp;nbsp;!==&amp;nbsp;&amp;quot;AD_LOADED&amp;quot;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;indicate&amp;nbsp;to&amp;nbsp;user&amp;nbsp;that&amp;nbsp;ad&amp;nbsp;could&amp;nbsp;not&amp;nbsp;be&amp;nbsp;loaded
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;
&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;const&amp;nbsp;showAdResponse&amp;nbsp;=&amp;nbsp;await&amp;nbsp;Pi.Ads.showAd(&amp;quot;interstitial&amp;quot;);
&amp;nbsp;&amp;nbsp;if&amp;nbsp;(showAdResponse.result&amp;nbsp;!==&amp;nbsp;&amp;quot;AD_CLOSED&amp;quot;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;indicate&amp;nbsp;to&amp;nbsp;user&amp;nbsp;that&amp;nbsp;ad&amp;nbsp;could&amp;nbsp;not&amp;nbsp;be&amp;nbsp;displayed
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;
&amp;nbsp;&amp;nbsp;}
}
startNextLevel();&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;如您所见，结合这 3 种方法，您可以在广告流程的任何步骤中对不愉快的路径做出反应。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;激励广告高级使用&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;假设您已获准在您的应用上展示广告，以下是向用户展示广告的大致流程。&lt;/span&gt;&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: decimal;&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;用户访问您的应用后，希望观看广告以获得奖励。&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;您的应用使用 Pi SDK 广告模块在应用内显示广告。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;*有关 Pi SDK 方法的文档，请参阅SDK 参考。&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;使用adId从 SDK 方法获取的信息后，您需要从 Pi 服务器验证广告状态。详情请参见下一节。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;*有关 Pi 平台 API 的文档，请参阅平台 API 文档。&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;验证通过后，即可奖励用户。&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;使用 Pi Platform API 进行激励广告状态验证&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;用户可能正在使用你的应用作弊！&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;展示激励广告后，用户应该能在您的应用中获得某种奖励。由于用户可能运行的是破解版的 SDK 并拦截您的displayAd(&amp;#39;rewarded&amp;#39;)方法，因此您必须在奖励用户之前，使用 Pi Platform API 验证广告的激励状态。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;mediator_ack_status只有当给定的广告有效时，才应该向用户提供奖励&amp;quot;granted&amp;quot;。&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;const&amp;nbsp;showRewardedAd&amp;nbsp;=&amp;nbsp;async&amp;nbsp;()&amp;nbsp;=&amp;gt;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;try&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;isAdReadyResponse&amp;nbsp;=&amp;nbsp;await&amp;nbsp;Pi.Ads.isAdReady(&amp;quot;rewarded&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(isAdReadyResponse.ready&amp;nbsp;===&amp;nbsp;false)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;requestAdResponse&amp;nbsp;=&amp;nbsp;await&amp;nbsp;Pi.Ads.requestAd(&amp;quot;rewarded&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(requestAdResponse.result&amp;nbsp;===&amp;nbsp;&amp;quot;ADS_NOT_SUPPORTED&amp;quot;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;display&amp;nbsp;modal&amp;nbsp;to&amp;nbsp;update&amp;nbsp;Pi&amp;nbsp;Browser
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;showAdsNotSupportedModal();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(requestAdResponse.result&amp;nbsp;!==&amp;nbsp;&amp;quot;AD_LOADED&amp;quot;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;display&amp;nbsp;modal&amp;nbsp;ads&amp;nbsp;are&amp;nbsp;temporarily&amp;nbsp;unavailable&amp;nbsp;and&amp;nbsp;user&amp;nbsp;should&amp;nbsp;try&amp;nbsp;again&amp;nbsp;later
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;showAdUnavailableModal();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;showAdResponse&amp;nbsp;=&amp;nbsp;await&amp;nbsp;Pi.Ads.showAd(&amp;quot;rewarded&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(showAdResponse.result&amp;nbsp;===&amp;nbsp;&amp;quot;AD_REWARDED&amp;quot;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;reward&amp;nbsp;user&amp;nbsp;logic:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;usually&amp;nbsp;delegate&amp;nbsp;rewarding&amp;nbsp;user&amp;nbsp;to&amp;nbsp;your&amp;nbsp;backend&amp;nbsp;which&amp;nbsp;would
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;firstly&amp;nbsp;verify&amp;nbsp;`adId`&amp;nbsp;against&amp;nbsp;Pi&amp;nbsp;Platform&amp;nbsp;API,&amp;nbsp;then&amp;nbsp;decide&amp;nbsp;whether&amp;nbsp;to
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;reward&amp;nbsp;the&amp;nbsp;user&amp;nbsp;and&amp;nbsp;rewarded&amp;nbsp;user&amp;nbsp;if&amp;nbsp;the&amp;nbsp;rewarded&amp;nbsp;ad&amp;nbsp;status&amp;nbsp;is&amp;nbsp;confirmed
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;e.g.:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;result&amp;nbsp;=&amp;nbsp;await&amp;nbsp;rewardUserForWatchingRewardedAd(adId);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(result.rewarded&amp;nbsp;===&amp;nbsp;true)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;showRewardedModal(result.reward);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;showRewardFailModal(result.error);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;fallback&amp;nbsp;logic
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;showAdErrorModal();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;}&amp;nbsp;catch&amp;nbsp;(err)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;good&amp;nbsp;practice&amp;nbsp;to&amp;nbsp;handle&amp;nbsp;any&amp;nbsp;potential&amp;nbsp;errors
&amp;nbsp;&amp;nbsp;}
};&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Thu, 04 Dec 2025 11:38:43 +0800</pubDate></item><item><title>客户端 SDK 参考</title><link>http://www.zuud.cn/doc/20251263/</link><description>&lt;h3&gt;初始化&lt;/h3&gt;&lt;p&gt;script在所有需要调用 Pi Apps SDK 的页面中添加以下标签：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;&amp;lt;script&amp;nbsp;src=&amp;quot;https://sdk.minepi.com/pi-sdk.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;
&amp;nbsp;&amp;nbsp;Pi.init({&amp;nbsp;version:&amp;nbsp;&amp;quot;2.0&amp;quot;&amp;nbsp;});
&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;p&gt;传递给 init 函数的 config 对象接受以下键：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;version（字符串，必填） - 此项为必填项，用于确保您的应用与可能带来重大变更的新 SDK 版本兼容（在这种情况下，重大变更将在更高的版本号下实现）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;sandbox: (布尔值，可选) - 这允许您配置 SDK 在沙箱中运行。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;在沙盒模式下使用 SDK：&lt;/h3&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;&amp;lt;script&amp;nbsp;src=&amp;quot;https://sdk.minepi.com/pi-sdk.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;
&amp;nbsp;&amp;nbsp;Pi.init({&amp;nbsp;version:&amp;nbsp;&amp;quot;2.0&amp;quot;,&amp;nbsp;sandbox:&amp;nbsp;true&amp;nbsp;});
&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;p&gt;您现在可以在沙盒环境 ( &lt;a href=&quot;https://sandbox.minepi.com&quot; _src=&quot;https://sandbox.minepi.com&quot;&gt;https://sandbox.minepi.com&lt;/a&gt;&amp;nbsp;) 中运行您的应用程序，前提是您已在开发者门户中配置了开发 URL。要配置此 URL 并查看您的沙盒 URL，请在 Pi 浏览器中打开 develop.pi 访问开发者门户。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;通常情况下，如果您使用的框架或样板支持此功能，您应该能够设置沙箱标志以匹配您的开发环境。例如，大多数优秀的 Node 样板会将 `--sandbox-mode` 的值设置process.env.NODE_ENV为 `--sandbox-mode`&amp;quot;development&amp;quot;或`--sandbox &amp;quot;production&amp;quot;-mode`，您可以执行类似这样的操作： Pi.init({ version: &amp;quot;2.0&amp;quot;, sandbox: &amp;lt;%= process.env.NODE_ENV !== &amp;#39;production&amp;#39; %&amp;gt; })`--sandbox-mode`。这取决于您的设置，但通常情况下，当您的应用程序在开发环境中运行时，Pi SDK 就会以沙箱模式运行。&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;验证&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;警告：通过此方法获取的用户信息不应传递到后端，而应仅用于展示逻辑（例如显示用户名）。 后端应使用平台 API 作为权威数据源。您可以使用通过此方法获取的访问令牌，通过后端请求 `/me` 端点来验证用户身份。&lt;/p&gt;&lt;/blockquote&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;Pi.authenticate(scopes:&amp;nbsp;Array&amp;lt;Scope&amp;gt;,&amp;nbsp;onIncompletePaymentFound:&amp;nbsp;Function&amp;lt;PaymentDTO&amp;gt;):&amp;nbsp;Promise&amp;lt;AuthResult&amp;gt;&lt;/pre&gt;&lt;p&gt;返回值：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;type&amp;nbsp;AuthResult&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;accessToken:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;user:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uid:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;username:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;};
};&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;scopes&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;可用范围：username，，paymentswallet_address&lt;/p&gt;&lt;p&gt;以下是对象上各种可用键的详细说明AuthResult[&amp;#39;user&amp;#39;]，以及这些键存在所需的作用域：&lt;/p&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;strong&gt;场地&lt;/strong&gt;&lt;/td&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;strong&gt;描述&lt;/strong&gt;&lt;/td&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;strong&gt;所需范围&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;uid&lt;/td&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;用户的应用本地标识符。此标识符仅适用于此用户和此应用。如果用户撤销授予您应用的权限，此标识符将会更改。&lt;/td&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;（没有任何）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;username&lt;/td&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;用户的 Pi 用户名。&lt;/td&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;username&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;payments&lt;/td&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;如果您的应用需要在应用和用户之间进行支付，则此项为必填项。&lt;/td&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;payments&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;wallet_address&lt;/td&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;在您的应用上进行身份验证的用户的钱包地址。&lt;/td&gt;&lt;td width=&quot;422&quot; valign=&quot;top&quot; style=&quot;word-break: break-all;&quot;&gt;wallet_address&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;onIncompletePaymentFound&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;签名：(payment: PaymentDTO) =&amp;gt; void&lt;/p&gt;&lt;p&gt;每次用户通过身份验证并尝试启动新的支付流程时，SDK 都会检查该用户是否存在未完成的支付。在此上下文中，未完成的支付是指已提交到 Pi 区块链但尚未处理的支付status.developer_completed（false即开发者尚未调用 /complete该支付的端点）。&lt;/p&gt;&lt;p&gt;如果发现付款不完整，则会调用此回调函数并传入付款信息PaymentDTO。&lt;/p&gt;&lt;p&gt;当此回调被调用时，您有责任完成相应的付款（您很可能需要将付款 DTO 发送到您的服务器，并根据您的业务逻辑进行处理）。您需要在向用户请求新的付款之前完成此操作。&lt;/p&gt;&lt;h3&gt;付款&lt;/h3&gt;&lt;p&gt;创建新的付款方式：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;type&amp;nbsp;PaymentData&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;amount:&amp;nbsp;number,
&amp;nbsp;&amp;nbsp;memo:&amp;nbsp;string,
&amp;nbsp;&amp;nbsp;metadata:&amp;nbsp;Object,
};
type&amp;nbsp;PaymentCallbacks&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;onReadyForServerApproval:&amp;nbsp;(paymentId:&amp;nbsp;string)&amp;nbsp;=&amp;gt;&amp;nbsp;void,
&amp;nbsp;&amp;nbsp;onReadyForServerCompletion:&amp;nbsp;(paymentId:&amp;nbsp;string,&amp;nbsp;txid:&amp;nbsp;string)&amp;nbsp;=&amp;gt;&amp;nbsp;void,
&amp;nbsp;&amp;nbsp;onCancel:&amp;nbsp;(paymentId:&amp;nbsp;string)&amp;nbsp;=&amp;gt;&amp;nbsp;void,
&amp;nbsp;&amp;nbsp;onError:&amp;nbsp;(error:&amp;nbsp;Error,&amp;nbsp;payment?:&amp;nbsp;PaymentDTO)&amp;nbsp;=&amp;gt;&amp;nbsp;void,
};
Pi.createPayment(paymentData:&amp;nbsp;PaymentData,&amp;nbsp;callbacks:&amp;nbsp;PaymentCallbacks):&amp;nbsp;void;&lt;/pre&gt;&lt;p&gt;该createPayment方法接受两个参数：paymentData和callbacks。&lt;/p&gt;&lt;p&gt;它将立即启动支付流程，该流程将在您的应用程序顶部打开，使用户能够查看付款并提交区块链交易，或拒绝该交易。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;警告：同时进行多笔付款：&lt;/p&gt;&lt;p&gt;创建新付款时，如果当前用户已在您的应用中存在未结付款：&lt;/p&gt;&lt;p&gt;如果用户尚未完成区块链交易，则未完成的付款将被取消。&lt;/p&gt;&lt;p&gt;如果用户已经进行了区块链交易，则新的付款将被拒绝（onError将调用），并且onIncompletePaymentFound传递给该authenticate 方法的回调函数将使用现有的付款进行调用（使用此回调函数来解决此问题，例如，将先前的付款发送到您的服务器以完成服务器端操作）。&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;paymentData关键信息：&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;amount&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这是用户需要向您的应用支付的金额。&lt;/p&gt;&lt;p&gt;例子：3.1415。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;memo&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;本次付款的备注。此备注将在付款确认页面对用户可见。请在此处简要说明用户付款的用途。&lt;/p&gt;&lt;p&gt;例子：Digital kitten #1234。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;metadata&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;您可以将此任意 JavaScript 对象附加到此付款。此对象仅供您自己使用。您应该使用此对象将此付款与您的内部业务逻辑关联起来。&lt;/p&gt;&lt;p&gt;例子：{ orderId: 1234, itemIds: [11, 42, 314] }&lt;/p&gt;&lt;h3&gt;callbacks关键信息：&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;onReadyForServerApproval&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;签名：(paymentId: string) =&amp;gt; void&lt;/p&gt;&lt;p&gt;当从 Pi 服务器获取到支付标识符 (paymentId) 时，会调用此函数。在审批期间，如果审批失败，此回调函数将被多次调用。如果初始尝试失败，Pi SDK 将继续大约每 10 秒调用一次该函数，直到审批计时器结束。&lt;/p&gt;&lt;p&gt;使用此回调函数将 paymentId 发送到您的后端进行服务器端审批。有关服务器端审批和完整支付流程的更多信息，请参阅专门的 “支付”页面。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;onReadyForServerCompletion&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;签名：(paymentId: string, txid: string) =&amp;gt; void&lt;/p&gt;&lt;p&gt;当用户将交易提交到 Pi 区块链后，会调用此函数。在完成期间，如果交易失败，此回调函数将被多次调用。如果初始尝试失败，Pi SDK 将继续大约每隔 10 秒调用一次该函数，直到完成计时器结束。&lt;/p&gt;&lt;p&gt;使用此回调函数将区块链交易标识符 (txid) 和支付 ID 发送到您的后端，以便进行服务器端完成。有关服务器端完成和完整支付流程的更多信息，请参阅专门的 “支付”页面。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;onCancel&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;签名：(paymentId: string) =&amp;gt; void&lt;/p&gt;&lt;p&gt;当付款被取消时（无论是用户操作还是通过程序取消），都会调用此函数。&lt;/p&gt;&lt;p&gt;付款可能因用户手动拒绝而取消，也可能因其他阻止情况而取消：例如，用户账户余额不足无法支付，或者同时创建了另一笔付款……&lt;/p&gt;&lt;p&gt;&lt;strong&gt;onError&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;签名：(error: Error, payment?: PaymentDTO) =&amp;gt; void&lt;/p&gt;&lt;p&gt;当发生错误且无法完成付款时，将调用此函数。如果付款已创建，则会提供第二个参数，您可以使用该参数来调查错误。否则，只会提供第一个参数。&lt;/p&gt;&lt;h3&gt;类型PaymentDTO&lt;/h3&gt;&lt;p&gt;onIncompletePaymentFound这种类型用于传递给和的参数onError。&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;type&amp;nbsp;PaymentDTO&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;//&amp;nbsp;Payment&amp;nbsp;data:
&amp;nbsp;&amp;nbsp;identifier:&amp;nbsp;string;&amp;nbsp;//&amp;nbsp;payment&amp;nbsp;identifier
&amp;nbsp;&amp;nbsp;user_uid:&amp;nbsp;string;&amp;nbsp;//&amp;nbsp;user&amp;#39;s&amp;nbsp;app-specific&amp;nbsp;ID
&amp;nbsp;&amp;nbsp;amount:&amp;nbsp;number;&amp;nbsp;//&amp;nbsp;payment&amp;nbsp;amount
&amp;nbsp;&amp;nbsp;memo:&amp;nbsp;string;&amp;nbsp;//&amp;nbsp;a&amp;nbsp;string&amp;nbsp;provided&amp;nbsp;by&amp;nbsp;the&amp;nbsp;developer,&amp;nbsp;shown&amp;nbsp;to&amp;nbsp;the&amp;nbsp;user
&amp;nbsp;&amp;nbsp;metadata:&amp;nbsp;Object;&amp;nbsp;//&amp;nbsp;an&amp;nbsp;object&amp;nbsp;provided&amp;nbsp;by&amp;nbsp;the&amp;nbsp;developer&amp;nbsp;for&amp;nbsp;their&amp;nbsp;own&amp;nbsp;usage
&amp;nbsp;&amp;nbsp;from_address:&amp;nbsp;string;&amp;nbsp;//&amp;nbsp;sender&amp;nbsp;address&amp;nbsp;of&amp;nbsp;the&amp;nbsp;blockchain&amp;nbsp;transaction
&amp;nbsp;&amp;nbsp;to_address:&amp;nbsp;string;&amp;nbsp;//&amp;nbsp;recipient&amp;nbsp;address&amp;nbsp;of&amp;nbsp;the&amp;nbsp;blockchain&amp;nbsp;transaction
&amp;nbsp;&amp;nbsp;direction:&amp;nbsp;Direction;&amp;nbsp;//&amp;nbsp;direction&amp;nbsp;of&amp;nbsp;the&amp;nbsp;payment
&amp;nbsp;&amp;nbsp;created_at:&amp;nbsp;string;&amp;nbsp;//&amp;nbsp;payment&amp;#39;s&amp;nbsp;creation&amp;nbsp;timestamp
&amp;nbsp;&amp;nbsp;network:&amp;nbsp;AppNetwork;&amp;nbsp;//&amp;nbsp;a&amp;nbsp;network&amp;nbsp;of&amp;nbsp;the&amp;nbsp;payment
&amp;nbsp;&amp;nbsp;//&amp;nbsp;Status&amp;nbsp;flags&amp;nbsp;representing&amp;nbsp;the&amp;nbsp;current&amp;nbsp;state&amp;nbsp;of&amp;nbsp;this&amp;nbsp;payment
&amp;nbsp;&amp;nbsp;status:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;developer_approved:&amp;nbsp;boolean;&amp;nbsp;//&amp;nbsp;Server-Side&amp;nbsp;Approval
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;transaction_verified:&amp;nbsp;boolean;&amp;nbsp;//&amp;nbsp;blockchain&amp;nbsp;transaction&amp;nbsp;verified
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;developer_completed:&amp;nbsp;boolean;&amp;nbsp;//&amp;nbsp;server-Side&amp;nbsp;Completion
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cancelled:&amp;nbsp;boolean;&amp;nbsp;//&amp;nbsp;cancelled&amp;nbsp;by&amp;nbsp;the&amp;nbsp;developer&amp;nbsp;or&amp;nbsp;by&amp;nbsp;Pi&amp;nbsp;Network
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;user_cancelled:&amp;nbsp;boolean;&amp;nbsp;//&amp;nbsp;cancelled&amp;nbsp;by&amp;nbsp;the&amp;nbsp;user
&amp;nbsp;&amp;nbsp;};
&amp;nbsp;&amp;nbsp;//&amp;nbsp;Blockchain&amp;nbsp;transaction&amp;nbsp;data:
&amp;nbsp;&amp;nbsp;transaction:&amp;nbsp;null&amp;nbsp;|&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;This&amp;nbsp;is&amp;nbsp;null&amp;nbsp;if&amp;nbsp;no&amp;nbsp;transaction&amp;nbsp;has&amp;nbsp;been&amp;nbsp;made&amp;nbsp;yet
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;txid:&amp;nbsp;string;&amp;nbsp;//&amp;nbsp;id&amp;nbsp;of&amp;nbsp;the&amp;nbsp;blockchain&amp;nbsp;transaction
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;verified:&amp;nbsp;boolean;&amp;nbsp;//&amp;nbsp;true&amp;nbsp;if&amp;nbsp;the&amp;nbsp;transaction&amp;nbsp;matches&amp;nbsp;the&amp;nbsp;payment,&amp;nbsp;false&amp;nbsp;otherwise
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_link:&amp;nbsp;string;&amp;nbsp;//&amp;nbsp;a&amp;nbsp;link&amp;nbsp;to&amp;nbsp;the&amp;nbsp;operation&amp;nbsp;on&amp;nbsp;the&amp;nbsp;Blockchain&amp;nbsp;API
&amp;nbsp;&amp;nbsp;};
};&lt;/pre&gt;&lt;h3&gt;类型Direction&lt;/h3&gt;&lt;p&gt;开发者可以通过这种类型检查付款方向。&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;type&amp;nbsp;Direction&amp;nbsp;=&amp;nbsp;&amp;quot;user_to_app&amp;quot;&amp;nbsp;|&amp;nbsp;&amp;quot;app_to_user&amp;quot;;&lt;/pre&gt;&lt;h3&gt;类型AppNetwork&lt;/h3&gt;&lt;p&gt;显示付款正在使用的网络。&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;type&amp;nbsp;AppNetwork&amp;nbsp;=&amp;nbsp;&amp;quot;Pi&amp;nbsp;Network&amp;quot;&amp;nbsp;|&amp;nbsp;&amp;quot;Pi&amp;nbsp;Testnet&amp;quot;;&lt;/pre&gt;&lt;h3&gt;类型Scope&lt;/h3&gt;&lt;p&gt;您可以向用户请求权限。&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;type&amp;nbsp;Scope&amp;nbsp;=&amp;nbsp;&amp;quot;username&amp;quot;&amp;nbsp;|&amp;nbsp;&amp;quot;payments&amp;quot;&amp;nbsp;|&amp;nbsp;&amp;quot;wallet_address&amp;quot;;&lt;/pre&gt;&lt;h3&gt;原生功能列表&lt;/h3&gt;&lt;p&gt;使用此方法可获取用户正在使用的特定版本 Pi Browser 的可用原生功能列表。某些 SDK 功能可能需要特定版本才能正常工作。&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;type&amp;nbsp;NativeFeature&amp;nbsp;=&amp;nbsp;&amp;quot;inline_media&amp;quot;&amp;nbsp;|&amp;nbsp;&amp;quot;request_permission&amp;quot;&amp;nbsp;|&amp;nbsp;&amp;quot;ad_network&amp;quot;;
Pi.nativeFeaturesList():&amp;nbsp;Promise&amp;lt;Array&amp;lt;NativeFeature&amp;gt;&amp;gt;;&lt;/pre&gt;&lt;h3&gt;分享对话框&lt;/h3&gt;&lt;p&gt;打开原生共享对话框：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;Pi.openShareDialog(title:&amp;nbsp;string,&amp;nbsp;message:&amp;nbsp;string):&amp;nbsp;void;&lt;/pre&gt;&lt;p&gt;使用此方法打开原生分享对话框（由手机操作系统提供），使用户能够与朋友分享您应用中的内容。&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;title：所分享消息的标题&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;message当用户在共享流程中选择目标应用时，将发送此消息。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;广告&lt;/h2&gt;&lt;p&gt;SDK 包含一个Ads模块（对象），允许开发者向用户展示广告。它提供了多种方法，可用于插页式广告和激励广告。所有方法都利用了基于 Promise 的异步特性。&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;type&amp;nbsp;AdType&amp;nbsp;=&amp;nbsp;&amp;quot;interstitial&amp;quot;&amp;nbsp;|&amp;nbsp;&amp;quot;rewarded&amp;quot;;&lt;/pre&gt;&lt;h3&gt;显示广告&lt;/h3&gt;&lt;p&gt;使用showAd(adType: &amp;quot;interstitial&amp;quot; | &amp;quot;rewarded&amp;quot;)此方法向用户展示广告。它返回一个 Promise，该 Promise 会解析为以下类型的对象ShowAdResponse：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;type&amp;nbsp;ShowAdResponse&amp;nbsp;=
&amp;nbsp;&amp;nbsp;|&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type:&amp;nbsp;&amp;quot;interstitial&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result:&amp;nbsp;&amp;quot;AD_CLOSED&amp;quot;&amp;nbsp;|&amp;nbsp;&amp;quot;AD_DISPLAY_ERROR&amp;quot;&amp;nbsp;|&amp;nbsp;&amp;quot;AD_NETWORK_ERROR&amp;quot;&amp;nbsp;|&amp;nbsp;&amp;quot;AD_NOT_AVAILABLE&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;|&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type:&amp;nbsp;&amp;quot;rewarded&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result:&amp;nbsp;&amp;quot;AD_REWARDED&amp;quot;&amp;nbsp;|&amp;nbsp;&amp;quot;AD_CLOSED&amp;quot;&amp;nbsp;|&amp;nbsp;&amp;quot;AD_DISPLAY_ERROR&amp;quot;&amp;nbsp;|&amp;nbsp;&amp;quot;AD_NETWORK_ERROR&amp;quot;&amp;nbsp;|&amp;nbsp;&amp;quot;AD_NOT_AVAILABLE&amp;quot;&amp;nbsp;|&amp;nbsp;&amp;quot;ADS_NOT_SUPPORTED&amp;quot;&amp;nbsp;|&amp;nbsp;&amp;quot;USER_UNAUTHENTICATED&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;adId?:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};
Pi.Ads.showAd(adType:&amp;nbsp;AdType):&amp;nbsp;Promise&amp;lt;ShowAdResponse&amp;gt;&lt;/pre&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;&amp;quot;AD_NOT_AVAILABLE&amp;quot;表示广告加载失败。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&amp;quot;AD_CLOSED&amp;quot;表示广告已成功展示并关闭。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&amp;quot;AD_REWARDED&amp;quot;表示广告已成功展示并获得奖励（仅适用于rewarded广告）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&amp;quot;AD_DISPLAY_ERROR&amp;quot;表示广告已成功加载但未能显示。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&amp;quot;AD_NETWORK_ERROR&amp;quot;这表明用户可能遇到了网络连接问题。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&amp;quot;ADS_NOT_SUPPORTED&amp;quot;- 表示用户使用的应用版本不支持广告，&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&amp;quot;USER_UNAUTHENTICATED&amp;quot;- 表示用户未经身份验证，因此无法显示激励广告（仅限rewarded广告）。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Pi 浏览器内部管理广告可用性策略，自动加载初始广告并在每次显示时重新加载。这确保广告始终处于可显示状态。然而，在极少数情况下，广告加载可能会中断，或者第三方应用可能会showAd()过快地使用方法（甚至在下一个广告准备就绪之前）。为了方便开发者处理这些情况，Pi SDK 提供了额外的方法：isAdReady()和requestAd()。&lt;/p&gt;&lt;h3&gt;笔记：&lt;/h3&gt;&lt;blockquote&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;如果您的应用已获 Pi Developer Ad Network 批准，则响应Pi.Ads.showAd(&amp;#39;rewarded&amp;#39;)中将包含其他adId字段，您可以使用 Pi Platform API 验证奖励状态。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;如果您的申请未获 Pi 开发者广告网络批准，则响应adId中将缺少该字段Pi.Ads.showAd(&amp;#39;rewarded&amp;#39;)。您不应在未adId使用Pi 平台 API进行验证的情况下向用户发放奖励。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;h3&gt;检查广告是否已准备就绪&lt;/h3&gt;&lt;p&gt;使用此isAdReady(adType: &amp;quot;interstitial&amp;quot; | &amp;quot;rewarded&amp;quot;)方法检查特定类型的广告是否可用。此方法返回一个 Promise，该 Promise 会解析为IsAdReadyResponse.&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;type&amp;nbsp;IsAdReadyResponse&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;type:&amp;nbsp;&amp;quot;interstitial&amp;quot;&amp;nbsp;|&amp;nbsp;&amp;quot;rewarded&amp;quot;;
&amp;nbsp;&amp;nbsp;ready:&amp;nbsp;boolean;
};
Pi.Ads.isAdReady(adType:&amp;nbsp;AdType):&amp;nbsp;Promise&amp;lt;IsAdReadyResponse&amp;gt;&lt;/pre&gt;&lt;p&gt;Pi 浏览器内部管理广告可用性策略，自动加载初始广告并在每次显示时重新加载。这确保广告始终处于可显示状态。然而，在极少数情况下，广告加载可能会中断，或者第三方应用可能会showAd()过快地使用方法（甚至在下一个广告准备就绪之前）。为了解决此类问题，Pi SDK 提供了此方法，允许开发者显式地检查广告的可用性。&lt;/p&gt;&lt;h3&gt;请求广告&lt;/h3&gt;&lt;p&gt;使用requestAd(adType: &amp;quot;interstitial&amp;quot; | &amp;quot;rewarded&amp;quot;)此方法请求插页式广告或激励广告。它返回一个 Promise，该 Promise 会解析为以下类型的对象RequestAdResponse：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;type&amp;nbsp;RequestAdResponse&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;type:&amp;nbsp;&amp;quot;interstitial&amp;quot;&amp;nbsp;|&amp;nbsp;&amp;quot;rewarded&amp;quot;;
&amp;nbsp;&amp;nbsp;result:&amp;nbsp;&amp;quot;AD_LOADED&amp;quot;&amp;nbsp;|&amp;nbsp;&amp;quot;AD_FAILED_TO_LOAD&amp;quot;&amp;nbsp;|&amp;nbsp;&amp;quot;AD_NOT_AVAILABLE&amp;quot;;
};&lt;/pre&gt;&lt;p&gt;Pi.Ads.requestAd(adType: AdType): Promise&amp;lt;RequestAdResponse&amp;gt;&lt;/p&gt;&lt;p&gt;与广告可用性策略一样，Pi 浏览器内部会管理请求新广告以替换已显示广告的过程。虽然不能保证广告始终可用，但开发者可以使用requestAd()方法手动重试广告请求，以防请求返回的 Promise 解析isAdReady()失败false。&lt;/p&gt;&lt;h3&gt;在系统浏览器中打开 URL&lt;/h3&gt;&lt;p&gt;请使用系统浏览器而不是 Pi Browser 打开 URL。&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;Pi.openUrlInSystemBrowser(url:&amp;nbsp;string):&amp;nbsp;Promise&amp;lt;void&amp;gt;&lt;/pre&gt;&lt;p&gt;该方法返回一个 Promise，当 URL 成功打开时，该 Promise 会被解析；Error如果出现错误，则会被拒绝。可能的错误信息包括：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;&amp;quot;Failed to open URL&amp;quot;这表明系统浏览器无法打开该网址，可能是由于网址错误造成的。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&amp;quot;No minimal requirements&amp;quot;这表明最终用户使用的是较旧版本的Pi浏览器，该版本不支持此SDK方法。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&amp;quot;Unexpected error&amp;quot;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;根据错误信息，您可以在应用程序中针对每种错误情况采取不同的处理方式。但是，如果收到&amp;quot;No minimal requirements&amp;quot;错误提示，强烈建议您鼓励用户更新 Pi 浏览器。&lt;/p&gt;</description><pubDate>Thu, 04 Dec 2025 10:55:24 +0800</pubDate></item><item><title>自述文件</title><link>http://www.zuud.cn/doc/20251262/</link><description>&lt;h2&gt;前端 JavaScript SDK&lt;/h2&gt;&lt;p&gt;JS SDK 是前端 SDK，旨在用于您的 HTML 页面或单页应用程序，并在 Pi 浏览器中运行。&lt;/p&gt;&lt;p&gt;为了使 SDK 能够正常运行，您需要在开发者门户上声明您的应用程序（在 Pi 浏览器中打开 develop.pi 以访问开发者门户）。&lt;/p&gt;&lt;p&gt;此 SDK不适用于服务器端 NodeJS 应用程序。&lt;/p&gt;&lt;h3&gt;安装&lt;/h3&gt;&lt;p&gt;script在所有需要调用 Pi Apps SDK 的页面中添加以下标签：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;&amp;lt;script&amp;nbsp;src=&amp;quot;https://sdk.minepi.com/pi-sdk.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;Pi.init({&amp;nbsp;version:&amp;nbsp;&amp;quot;2.0&amp;quot;&amp;nbsp;})&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;p&gt;这将把 Pi Network JS SDK 作为全局window.Pi对象加载。&lt;/p&gt;&lt;h3&gt;用法&lt;/h3&gt;&lt;p&gt;对用户进行身份验证&lt;/p&gt;&lt;p&gt;在成功验证用户身份之前，您无法执行任何与用户相关的操作（例如读取用户信息、向用户请求付款）。首次访问时，系统会弹出对话框，询问用户是否同意与您的应用共享其数据。&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;//&amp;nbsp;Authenticate&amp;nbsp;the&amp;nbsp;user,&amp;nbsp;and&amp;nbsp;get&amp;nbsp;permission&amp;nbsp;to&amp;nbsp;request&amp;nbsp;payments&amp;nbsp;from&amp;nbsp;them:
const&amp;nbsp;scopes&amp;nbsp;=&amp;nbsp;[&amp;#39;payments&amp;#39;];
//&amp;nbsp;Read&amp;nbsp;more&amp;nbsp;about&amp;nbsp;this&amp;nbsp;callback&amp;nbsp;in&amp;nbsp;the&amp;nbsp;SDK&amp;nbsp;reference:
function&amp;nbsp;onIncompletePaymentFound(payment)&amp;nbsp;{&amp;nbsp;/*&amp;nbsp;...&amp;nbsp;*/&amp;nbsp;};
Pi.authenticate(scopes,&amp;nbsp;onIncompletePaymentFound).then(function(auth)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;console.log(`Hi&amp;nbsp;there!&amp;nbsp;You&amp;#39;re&amp;nbsp;ready&amp;nbsp;to&amp;nbsp;make&amp;nbsp;payments!`);
}).catch(function(error)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;console.error(error);
});&lt;/pre&gt;&lt;h3&gt;请求付款（用户到应用）&lt;/h3&gt;&lt;p&gt;该createPayment方法允许您请求当前用户向您的应用帐户付款。&lt;/p&gt;&lt;p&gt;Pi 钱包会弹出一个模态框，用户可以通过该模态框签署交易并将其提交到 Pi 区块链。&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;Pi.createPayment({
&amp;nbsp;&amp;nbsp;//&amp;nbsp;Amount&amp;nbsp;of&amp;nbsp;π&amp;nbsp;to&amp;nbsp;be&amp;nbsp;paid:
&amp;nbsp;&amp;nbsp;amount:&amp;nbsp;3.14,
&amp;nbsp;&amp;nbsp;//&amp;nbsp;An&amp;nbsp;explanation&amp;nbsp;of&amp;nbsp;the&amp;nbsp;payment&amp;nbsp;-&amp;nbsp;will&amp;nbsp;be&amp;nbsp;shown&amp;nbsp;to&amp;nbsp;the&amp;nbsp;user:
&amp;nbsp;&amp;nbsp;memo:&amp;nbsp;&amp;quot;...&amp;quot;,&amp;nbsp;//&amp;nbsp;e.g:&amp;nbsp;&amp;quot;Digital&amp;nbsp;kitten&amp;nbsp;#1234&amp;quot;,
&amp;nbsp;&amp;nbsp;//&amp;nbsp;An&amp;nbsp;arbitrary&amp;nbsp;developer-provided&amp;nbsp;metadata&amp;nbsp;object&amp;nbsp;-&amp;nbsp;for&amp;nbsp;your&amp;nbsp;own&amp;nbsp;usage:
&amp;nbsp;&amp;nbsp;metadata:&amp;nbsp;{&amp;nbsp;/*&amp;nbsp;...&amp;nbsp;*/&amp;nbsp;},&amp;nbsp;//&amp;nbsp;e.g:&amp;nbsp;{&amp;nbsp;kittenId:&amp;nbsp;1234&amp;nbsp;}
},&amp;nbsp;{
&amp;nbsp;&amp;nbsp;//&amp;nbsp;Callbacks&amp;nbsp;you&amp;nbsp;need&amp;nbsp;to&amp;nbsp;implement&amp;nbsp;-&amp;nbsp;read&amp;nbsp;more&amp;nbsp;about&amp;nbsp;those&amp;nbsp;in&amp;nbsp;the&amp;nbsp;detailed&amp;nbsp;docs&amp;nbsp;linked&amp;nbsp;below:
&amp;nbsp;&amp;nbsp;onReadyForServerApproval:&amp;nbsp;function(paymentId)&amp;nbsp;{&amp;nbsp;/*&amp;nbsp;...&amp;nbsp;*/&amp;nbsp;},
&amp;nbsp;&amp;nbsp;onReadyForServerCompletion:&amp;nbsp;function(paymentId,&amp;nbsp;txid)&amp;nbsp;{&amp;nbsp;/*&amp;nbsp;...&amp;nbsp;*/&amp;nbsp;},
&amp;nbsp;&amp;nbsp;onCancel:&amp;nbsp;function(paymentId)&amp;nbsp;{&amp;nbsp;/*&amp;nbsp;...&amp;nbsp;*/&amp;nbsp;},
&amp;nbsp;&amp;nbsp;onError:&amp;nbsp;function(error,&amp;nbsp;payment)&amp;nbsp;{&amp;nbsp;/*&amp;nbsp;...&amp;nbsp;*/&amp;nbsp;},
});&lt;/pre&gt;&lt;h3&gt;请求付款（应用对用户）&lt;/h3&gt;&lt;p&gt;如果您想通过应用向用户发送 Pi，则需要使用 Pi Network 的后端 SDK，具体取决于您的后端代码所使用的编程语言。 更多信息，请参阅高级支付指南。&lt;/p&gt;&lt;p&gt;为了确保所有相关方（您的应用程序、您的服务器、Pi 服务器和 Pi 区块链）保持同步，付款需要经过服务器端批准流程（对于用户到应用程序的付款）和/或服务器端完成 流程（对于所有类型的付款）。&lt;/p&gt;&lt;p&gt;请参阅：&lt;/p&gt;&lt;p&gt;请参阅完整的付款文档，了解完整的付款流程。&lt;/p&gt;&lt;p&gt;请参阅高级支付文档，了解应用到用户的支付流程。&lt;/p&gt;&lt;p&gt;请查阅平台 API 文档，了解如何确认付款并从您的服务器进行确认。&lt;/p&gt;&lt;p&gt;客户端 SDK 文档详细介绍了 Pi Apps SDK 及其提供的方法。&lt;/p&gt;&lt;p&gt;运行演示应用程序，查看如何在应用程序代码中实现各种必需流程的示例。&lt;/p&gt;</description><pubDate>Thu, 04 Dec 2025 10:50:54 +0800</pubDate></item></channel></rss>