ウェブサイトでUSDC決済を受け付ける方法

あらかじめ選んだネットワークで、注文1件のUSDC決済を設定します。対象のトークンを確認し、プロジェクトにアドレスを接続して請求書を作成し、サーバーで結果を確認しましょう。

更新日:

ウェブサイトでUSDC決済を受け付けるには、注文をCryptanioの請求書に紐付け、ネットワークと対象のトークンを事前に決めます。ここでは、Ethereum上のUSDCでの支払いに合意した店舗を例に説明します。サーバーが注文ごとの請求書を作成し、購入者に決済ページを案内した後、結果を確認して注文を確定します。資金は自分のアドレスに入金されます。

この手順では資産を固定します。購入者は、名前が似ている任意のコインではなく、提示された決済情報で指定されたUSDCを送る必要があります。決済リンクとサーバー連携のどちらを選ぶかについては、ウェブサイトで暗号資産決済を受け付けるためのガイドで説明しています。

1. どのUSDCを受け付けるかを確認する

ネットワークとトークンの識別子をCircleの公式一覧と照合します。USDCという名前やウォレットのロゴだけでは不十分です。Circleがそのネットワークに対応していても、Cryptanioのプロジェクトでその経路が有効になっているとは限りません。

Circleは、発行者自身がそのネットワークで発行するnative USDCと、第三者のブリッジが作成するbridged USDCを区別しています。請求書への支払いで、この2つを相互に置き換えられるものとして扱わないでください。違いはCircleの解説に記載されています。ここでは、EthereumでサポートされているCircleのUSDCを選びます。別のネットワークを使う場合は、そのトークンと利用可否を改めて確認してください。

native USDCのnativeという言葉は、ブロックチェーンのネイティブ通貨を意味しません。EthereumではUSDCはあくまでトークンであり、ネイティブ通貨はETHです。この違いはアドレスの情報を入力するときに必要になります。

2. 対象の資産を受け取るアドレスを用意する

「支払い」サービスが有効なプロジェクト、自分のウォレットの公開アドレス、プロジェクトを設定する権限が必要です。「支払い」を開き、プロジェクトと「アドレス」セクションを選んでから、「アドレスを追加します」を押します。「手動」タブでEthereumを選び、自分で管理しているアドレスを入力します。

「1つのアセット」を選び、「アセット」に、このネットワークでサポートされているUSDCの識別子を入力します。識別子はCircleの一覧と照合してください。空欄はネイティブ通貨を意味し、native USDCを意味するものではありません。「受信」を有効にしたままアドレスを追加し、接続が有効であることとネットワークが利用可能であることを確認します。アドレス帳に保存するだけでは、必要なサービスの受け取り先として接続されません。

手動管理のアドレスプールには、決済情報として割り当てられる未使用のアドレスを用意します。秘密鍵やシードフレーズを渡さないでください。公開アドレスの接続には不要です。ネットワークとトークンの組み合わせを確認する基本事項は、「ネットワークとトークンの違い」で説明しています。

3. 注文の請求書を作成する

このプロジェクトへのアクセス権、invoices(「請求書」)セクション、「読み書きします」の権限を持つ、サーバー用の本番APIキーを用意します。リクエストを送る前に、自分のシステムの注文番号を保存してください。キーを購入者に渡してはいけません。

以下は、資産を固定するAPI v1の対応済みサンプルです。生成されたリクエストで、注文のネットワーク、資産、金額を確認してください。USDCの金額はトークンの数量を表し、銀行口座で米ドルを受け取ることを意味しません。

#!/usr/bin/env bash
set -euo pipefail
: "${CRYPTANIO_API_KEY:?Set CRYPTANIO_API_KEY}"
: "${CRYPTANIO_OPERATION_ID:?Set CRYPTANIO_OPERATION_ID}"
: "${CRYPTANIO_PROJECT_ID:?Set CRYPTANIO_PROJECT_ID}"
json_string() {
  local text="$1" char code index output='"'
  for ((index=0; index<${#text}; index++)); do
    char="${text:index:1}"
    case "$char" in
      '"'|'\') output+="\\$char" ;;
      *) printf -v code '%d' "'$char"
         if ((code < 32)); then printf -v char '\\u%04x' "$code"; fi
         output+="$char" ;;
    esac
  done
  printf '%s"' "$output"
}
response_file="$(mktemp)"
trap 'rm -f "$response_file"' EXIT
transfer_status=0
http_status="$(curl \
  --silent --show-error --max-time 30 --request POST \
  --header "Authorization: Bearer $CRYPTANIO_API_KEY" \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header "Idempotency-Key: $CRYPTANIO_OPERATION_ID" \
  --data-binary '{"project":'"$(json_string "$CRYPTANIO_PROJECT_ID")"',"chain":"ethereum","asset":"USDC","amount":"12.50","reference":"order-42","expires_in":60,"customer":{"id":"customer-42"},"metadata":{"order":"42"}}' \
  "https://api.cryptanio.com/v1/invoices" \
  --output "$response_file" --write-out '%{http_code}')" || transfer_status=$?
if [[ "$http_status" == 2?? ]]; then
  cat "$response_file"
  exit "$transfer_status"
fi
printf 'HTTP %s\n' "$http_status" >&2
cat "$response_file" >&2
exit 1

サンプルをダウンロード

自分のプロジェクトと注文情報を指定します。新しい操作には一意のIdempotency-Keyを使い、障害後に同じリクエストを再送するときは以前のキーを維持します。注文と作成された請求書IDの対応関係、受け取ったcheckout_url、レスポンスに含まれる正確な決済情報を保存してください。返された金額を丸めたり、価格表の数字に置き換えたりしないでください。

4. 顧客に決済ページを案内する

サイトの注文画面から、受け取ったcheckout_urlを開けるようにします。請求書IDからページのURLを組み立てたり、割り当てられた決済情報の代わりに固定のウォレットアドレスを使ったりしないでください。この手順ではネットワークと資産はすでに選択されているため、顧客は送金前にウォレットで両方を確認する必要があります。

ウォレットの手数料ルールと支払期限を考慮し、正確な金額を送るよう案内します。顧客が別のバージョンのUSDCを持っている場合、トークンの名前を変えるだけでは、その送金が適切な支払いになるわけではありません。まず正しい送金経路に合意してください。Cryptanioによる自動交換やブリッジを約束しないでください。

5. 注文を確定し、全体の流れを確認する

サーバーはwebhookまたはAPIポーリングを使い、請求書の最新の状態を確認する必要があります。状態がpaidになったら、重複実行の防止を維持しながら注文を履行します。トランザクションの発見、スクリーンショット、購入者がサイトに戻ったことは、この確認の代わりにはなりません。

不足入金、過剰入金、期限後の入金、トランザクションの巻き戻しは、該当する請求書の状態に従って処理します。判断が難しい場合はTXIDを保存し、未払い注文の診断ガイドを利用してください。金額が似ているという理由だけで、別の資産の入金をこの注文に充当しないでください。

自分の注文で、決済情報、送金、確認、注文の履行まで、全体の流れを検証します。本番モードでは実際の資金とネットワーク手数料が発生します。ページの見た目や人工的なイベントだけを確認しても、選んだUSDCが実際に入金され、正しく計上されることの証明にはなりません。