# 接收 Pix 付款 (/zh/docs/pix-processamento/tutoriais/receive-pix)

<QuickLinks>
  <QuickLink href="/docs/pix-processamento/endpoints/pix-operations/post_pix" title="POST /pix" />

  <QuickLink href="/docs/pix-processamento/endpoints/pix-operations/get_pix" title="GET /pix" />

  <QuickLink href="/docs/pix-processamento/webhooks" title="Webhooks" />

  <QuickLink href="/docs/pix-processamento/glossary" title="术语表" />
</QuickLinks>

<Mermaid
  chart="`
flowchart LR
  A[&#x22;创建收款单&#x22;] --> B[&#x22;向客户展示 QR&#x22;]
  B --> C[&#x22;客户在其银行付款&#x22;]
  C --> D[&#x22;COMPLETED callback&#x22;]
  D --> E[&#x22;标记订单为已支付&#x22;]

  click A &#x22;/zh/docs/pix-processamento/endpoints/pix-operations/post_pix&#x22; &#x22;POST /pix&#x22;
  click B &#x22;/zh/docs/pix-processamento/endpoints/pix-operations/get_pix_qrcode&#x22; &#x22;GET /pix/qr-code&#x22;
  click D &#x22;/zh/docs/pix-processamento/webhooks&#x22; &#x22;Webhooks&#x22;
  click E &#x22;/zh/docs/pix-processamento/best-practices/idempotency&#x22; &#x22;幂等性&#x22;

  style A fill:#f59e0b,stroke:#d97706,color:#ffffff
  style D fill:#14ce71,stroke:#0eb464,color:#ffffff
  style E fill:#14ce71,stroke:#0eb464,color:#ffffff
`"
/>

<Steps>
  <Step>
    ### 生成收款单 [#生成收款单]

    endpoint：[`POST /pix`](/docs/pix-processamento/endpoints/pix-operations/post_pix)。仅 `amount` 为必填项，[以雷亚尔为单位](/docs/pix-processamento/best-practices/money)，绝不用分；其他字段用于丰富 QR 和对账信息。

    <Tabs items="['curl', 'Node.js']">
      <Tab value="curl">
        ```bash
        curl -X POST https://api.payzu.processamento.com/v1/pix \
          -H "Authorization: Bearer $TOKEN" \
          -H "Content-Type: application/json" \
          -d '{
            "amount": 99.90,
            "generatedName": "João da Silva",
            "generatedDocument": "12345678909",
            "callbackUrl": "https://seusite.com.br/webhooks/payzu",
            "clientReference": "pedido-2025-001",
            "virtualAccount": "loja-rj-01",
            "expiresIn": 600
          }'
        ```
      </Tab>

      <Tab value="Node.js">
        ```ts
        const res = await fetch('https://api.payzu.processamento.com/v1/pix', {
          method: 'POST',
          headers: {
            Authorization: `Bearer ${process.env.PAYZU_TOKEN}`,
            'Content-Type': 'application/json',
          },
          body: JSON.stringify({
            amount: 99.90,
            generatedName: 'João da Silva',
            generatedDocument: '12345678909',
            callbackUrl: 'https://seusite.com.br/webhooks/payzu',
            clientReference: 'pedido-2025-001',
            virtualAccount: 'loja-rj-01',
            expiresIn: 600,
          }),
        });
        const charge = await res.json();
        ```
      </Tab>
    </Tabs>

    响应：

    ```json
    {
      "id": "PAYZU20260811R4TZ8WD1NC000000",
      "status": "PENDING",
      "amount": 99.90,
      "qrCodeText": "00020126870014br.gov.bcb.pix...",
      "qrCodeUrl": "https://api.payzu.processamento.com/v1/pix/qr-code/PAYZU20260811R4TZ8WD1NC000000",
      "clientReference": "pedido-2025-001",
      "virtualAccount": "loja-rj-01",
      "expiresAt": "2025-08-17T22:00:00.000Z"
    }
    ```
  </Step>

  <Step>
    ### 向客户展示 QR Code [#向客户展示-qr-code]

    两种方式：

    **直接图片**，在 `<img>` 中使用 `qrCodeUrl`：

    ```html
    <img src="https://api.payzu.processamento.com/v1/pix/qr-code/PAYZU2025..." />
    ```

    **复制粘贴**，将 `qrCodeText` 显示在带按钮的 input 中：

    ```html
    <input value="00020126870014br.gov.bcb.pix2565..." readonly />
    <button onclick="navigator.clipboard.writeText(qrCodeText)">复制</button>
    ```

    <Callout type="info">
      PayZu 每笔收款生成**动态** QR。
    </Callout>
  </Step>

  <Step>
    ### 在付款时接收 callback [#在付款时接收-callback]

    当客户完成 Pix 付款后，PayZu 将向您的 `callbackUrl` 发送 `POST`：

    ```json
    {
      "id": "PAYZU20260811R4TZ8WD1NC000000",
      "type": "DEPOSIT",
      "status": "COMPLETED",
      "amount": 99.90,
      "clientReference": "pedido-2025-001",
      "virtualAccount": "loja-rj-01",
      "endToEndId": "E60746948202508172200X7H4K2P9M5Q",
      "paidAt": "2025-08-17T22:00:12.000Z"
    }
    ```

    处理器示例：

    <Tabs items="['Node.js (Express)', 'Python (Flask)']">
      <Tab value="Node.js (Express)">
        ```ts
        import express from 'express';
        const app = express();

        app.post('/webhooks/payzu', express.json(), async (req, res) => {
          const tx = req.body;

          if (await isProcessed(tx.id, tx.status)) return res.status(200).end();

          if (tx.type === 'DEPOSIT' && tx.status === 'COMPLETED') {
            await markOrderPaid(tx.clientReference, tx);
          }

          res.status(204).end();
        });
        ```
      </Tab>

      <Tab value="Python (Flask)">
        ```python
        from flask import Flask, request
        app = Flask(__name__)

        @app.post('/webhooks/payzu')
        def payzu_webhook():
            tx = request.get_json()
            if is_processed(tx['id'], tx['status']):
                return '', 200
            if tx['type'] == 'DEPOSIT' and tx['status'] == 'COMPLETED':
                mark_order_paid(tx['clientReference'], tx)
            return '', 204
        ```
      </Tab>
    </Tabs>

    <Callout type="warn">
      请在 **5 秒**内以 `2xx` 响应；完整的重试策略请见 [Webhooks](/docs/pix-processamento/webhooks)。
    </Callout>
  </Step>

  <Step>
    ### 通过 polling 后备查询 [#通过-polling-后备查询]

    如果 callback 未送达，可直接通过 [`GET /pix`](/docs/pix-processamento/endpoints/pix-operations/get_pix) 查询。接受 `id`、`clientReference`、`endToEndId` 或 `virtualAccount`，**仅使用其中一个**。

    <Tabs items="['curl', 'Node.js']">
      <Tab value="curl">
        ```bash
        curl "https://api.payzu.processamento.com/v1/pix?clientReference=pedido-2025-001" \
          -H "Authorization: Bearer $TOKEN" \
          -H "Content-Type: application/json"
        ```
      </Tab>

      <Tab value="Node.js">
        ```ts
        const res = await fetch(
          `https://api.payzu.processamento.com/v1/pix?clientReference=pedido-2025-001`,
          {
            headers: {
              Authorization: `Bearer ${process.env.PAYZU_TOKEN}`,
              'Content-Type': 'application/json',
            },
          },
        );
        const charge = await res.json();
        ```
      </Tab>
    </Tabs>

    <Callout type="info">
      polling 应作为后备方案。请将 callback 配置为主要来源。
    </Callout>
  </Step>

  <Step>
    ### 凭证 [#凭证]

    付款完成后，通过 [`GET /proof/{id}`](/docs/pix-processamento/endpoints/pix-operations/get_proof) 下载官方凭证：

    ```bash
    curl "https://api.payzu.processamento.com/v1/proof/PAYZU20260811R4TZ8WD1NC000000" \
      -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json"
    ```
  </Step>
</Steps>

## 下一步 [#下一步]

<QuickLinks>
  <QuickLink href="/docs/pix-processamento/webhooks" title="Webhooks" />

  <QuickLink href="/docs/pix-processamento/error-codes" title="错误代码" />
</QuickLinks>