以下是使用 PHP 作为开发语言的版本的原始 Markdown 文本:

如何使用 PHP 接入 imsafu

imsafu 是一个支付处理服务,允许您创建和查询支付。本文档将引导您完成访问 imsafu 服务。

准备

在开始之前,请确保满足以下先决条件:

  1. 在您的计算机上安装了 PHP 环境。
  2. 具备基本的 PHP 开发知识。

安装依赖项

访问 imsafu 服务没有任何固定的依赖,在这里我们提供了一些默认的依赖库,您可以替换成任何有类似功能的其他库。

创建 imsafu 所需变量

与 imsafu 测试服务器连接可以使用以下变量。如果想要连接正式服务器,可以加入等待列表。

$options = array(
  "url" => "https://devnet.imsafu.com",
  "api" => "https://allowpay-api-devnet.fly.dev/v1",
  "apiSecret" => "your-api-secret",
  "receiver" => "your-wallet-account",
  "merchantBrand" => "imsafu demo",
  "merchantRedirectURL" => "https://merchant.com/redirect"
);

创建新的支付

首先,我们需要生成一个随机的长度为32个字符的十六进制字符串作为新订单的 ID。

function generateOrderID() {
  return '0x' . str_pad(bin2hex(random_bytes(32)), 32, '0', STR_PAD_RIGHT);
}

要创建新的支付,我们需要实现一个 createPayment 函数。该函数接受支付金额作为参数,并返回一个解析为 PaymentResponse 对象

function createPayment($amount) {
  global $options;
  $newOrderID = generateOrderID();

  $payload = array(
    "payment" => array(
      "orderID" => $newOrderID,
      "receiver" => $options['receiver'],
      "amount" => strval($amount),
    ),
    "notifyURL" => $options['url'] . "/notify"
  );

  $headers = array(
    "Content-Type: application/json",
    "Authorization: Bearer " . $options['apiSecret']
  );

  $ch = curl_init($options['api'] . "/depositPay");
  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
  curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

  $response = curl_exec($ch);

  if ($response === false) {
    return null;
  }

  $responseData = json_decode($response, true);
  return $responseData;
}

生成支付链接

首先,编写一个方法来生成支付链接。

function buildPaymentURL($itemMemo, $res) {
  global $options;

  $urlSearchParams = http_build_query(array(
    "payID" => $res['payment']['payID'],
    "brand" => $options['merchantBrand'],
    "memo" => $itemMemo,
    "redirect_url" => $options['merchantRedirectURL'],
    "currency" => "USD"
  ));

  $url = $options['url'] . "/payment_qrcode?" . $urlSearchParams;
  return $url;
}
$amount = 100;
$createPaymentResponse = createPayment($amount);
$paymentURL = buildPaymentURL("test item", $createPaymentResponse);

用户支付

将生成的 paymentURL 显示给用户,用户点击后可以在网页打开支付界面。具体支付流程可以参考使用 imsafu 支付

检索支付信息

在用户支付完成后,imsafu 会向创建订单时传入的 notifyURL 发送包含 payIDPOST 请求。我们需要通过 getPayment 接口检索支付信息,并确认用户支付是否成功。

要检索支付信息,我们需要先实现一个 getPayment 函数。该函数接受支付ID(payID)作为参数,并返回一个解析为 PaymentResponse 对象

function getPayment($payID) {
  global $options;

  $headers = array(
    "Content-Type: application/json",
    "Authorization: Bearer " . $options['apiSecret']
  );

  $ch = curl_init($options['api'] . "/depositPays/" . $payID);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

  $response = curl_exec($ch);

  if ($response === false) {
    return null;
  }

  $responseData = json_decode($response, true);
  return $responseData;
}
// 从 notify 请求中获得 payID

$paymentResponse = getPayment($payID);

// 进行其他操作

附录:代码中使用的类型定义

class Payment {
  public $payID;
  public $orderID;
  public $receiver;
  public $amount;
  public $originalAmount;
  public $maxFeeAmount;
  public $deadline;
}

class Chain {
  public $id;
  public $symbol;
  public $name;
}

class Token {
  public $symbol;
  public $address;
}

class ReceiveTx {
  public $chain;
  public $txID;
  public $confirmedAt;
  public $amount;
  public $feeAmount;
  public $token;
}

class Deposit {
  public $chainID;
  public $token;
}

class PaymentResponse {
  public $status;
  public $payment;
  public $owner;
  public $depositAddress;
  public $callID;
  public $receiveTx;
  public $deposits;
}

请注意,以上代码示例仅用于演示目的,实际使用时需要根据具体情况进行适当的调整和安全性增强。

Last Updated:
Contributors: xavierdiff