ZaifPaymentの決済API利用方法
Zaif Paymentとは何か
お客さんが支払った暗号通貨(BTC、MONA、SKEB)を日本円で受け取ることができるサービス。
例えばお客さんに300円払ってほしい場合、ZaifPaymentのAPIでインボイスを発行すれば300円分の暗号通貨を算出して決済用のページを作ってくれる。
2024年9月4日、ZaifPaymentにSkebCoinが追加された。
利用方法
ZaifPaymentを利用するには
- Zaifのアカウント
- ZaifPaymentの利用申請
が必要である。
Zaifのアカウントを作成してからZaifPaymentの利用申請をすればスムーズだ。筆者の場合は申請から2日ほどで利用可のメールが届いた。
APIキーの取得方法
-
上部メニューの各種サービスから開発者用APIのページに行く。Zaifの導線はわかりづらいがここだ。
-
2段階認証のトークンが必要になっているはずなので、入力してキーを追加できるようにする。
-
キーの名前を決めてCreateボタンを押す。名前は適当でよい。また、決済関係のみを使用する場合権限は全て不要。
-
アクセス可能なIPアドレスを制限できるので、必要であれば設定しておく。
-
keyとsecretが発行される。APIの利用には両方必要。
APIの使い方
Zaifの決済用エンドポイントは1つしかなく、送信するパラメーターに応じて4つの機能が利用できるようになっている。ただし2024年9月19日現在、ドキュメントは不完全かつ嘘が書いてある。
- ドキュメント
https://zaif-api-document.readthedocs.io/ja/latest/index.html - 決済API
https://zaif-api-document.readthedocs.io/ja/latest/PaymentAPI.html
エンドポイント
エンドポイント:https://api.zaif.jp/ecapi
メソッド:POST
必須設定
4つの機能全てで必要なヘッダー情報とパラメーター
パラメーター | 説明 |
---|---|
key | APIキー |
md5secret | secretをMD5でハッシュ化したもの |
sha1secret | secretをSHA1でハッシュ化したもの |
md5secretとsha1secretはどちらか片方だけでよい。
ドキュメントによるとヘッダーに設定すれば良いように読めるが、これらは必ずヘッダーとPOSTで送信するパラメーターの両方に含めなければならない。さもないとno data found for the key
という未記載のエラーが返される。
インボイスの作成
インボイス(請求)を作成し、支払用アドレスとページを作成する。
最低限必要なパラメーターはkeyとsecretを含めて6つだ。
パラメーター | 説明 |
---|---|
key | APIキー |
sha1secret | secretをSHA1でハッシュ化したもの |
nonce | 1以上の数(※注意、後述) |
method | APIメソッド名。この機能では"createInvoice" |
currency | 使用通貨。"btc","mona","SKEB"のいずれか |
amount | 請求金額。日本円。 |
nonceについて
ドキュメントには
注釈
メソッド毎の固有のパラメータも全てPOSTパラメータにて送信してください。 nonceパラメータの値は実効毎に増分されていないとエラーが発生します。また、増分量は少数点以下の値にも対応しております。 ミリ秒まで含むunixtimeを使うと比較的簡単にAPIを呼び出すことができますが、多重送信の防止と呼び出し順序にnonceパラメータを使用して呼び出しの管理をすることを検討してください。
と書いてあるが不可能である。実際にはミリ秒まで含むunixtimeを受け付けず、ミリ秒のunixtimeを送信するとnonce out of range
という未記載エラーが返却される。 通常のunixtime(10桁)なら実行できる。
コード例(Ruby)
require "http"
API_KEY = "作成したkey"
API_SECRET = "作成したsecret"
API_SECRET_SHA1 = Digest::SHA1.hexdigest(API_SECRET)
headers = {
key: API_KEY,
sha1secret: API_SECRET_SHA1
}
params = {
key: API_KEY,
sha1secret: API_SECRET_SHA1,
nonce: Time.now.to_i,
method: "createInvoice",
currency: "SKEB",
amount: 300,
}
res = HTTP.headers(headers).post("https://api.zaif.jp/ecapi", :form => params).to_s
p res
レスポンス
成功すれば送信した情報や換算レートとともに決済用アドレスとURLが返ってくる。
URLにアクセスすると下記のような画面が表示される。
インボイス情報の取得
作成したインボイスの情報を得る。
最低限必要なパラメーターはkeyとsecretを含めて5つだ。
パラメーター | 説明 |
---|---|
key | APIキー |
sha1secret | secretをSHA1でハッシュ化したもの |
nonce | 1以上の数(※作成時と同様に注意) |
method | APIメソッド名。この機能では"getInvoice" |
invoiceId | 情報を取得したいインボイスのID |
コード例(Ruby)
require "http"
API_KEY = "作成したkey"
API_SECRET = "作成したsecret"
API_SECRET_SHA1 = Digest::SHA1.hexdigest(API_SECRET)
headers = {
key: API_KEY,
sha1secret: API_SECRET_SHA1
}
params = {
key: API_KEY,
sha1secret: API_SECRET_SHA1,
nonce: Time.now.to_i,
method: "getInvoice",
invoiceId: "情報を取得したいインボイスのID",
}
res = HTTP.headers(headers).post("https://api.zaif.jp/ecapi", :form => params).to_s
p res
レスポンス
成功すると指定したインボイスの情報が返却される。
インボイスの検索
注文番号でインボイスを検索してインボイスIDを返す。
最低限必要なパラメーターはkeyとsecretを含めて5つだ。
パラメーター | 説明 |
---|---|
key | APIキー |
sha1secret | secretをSHA1でハッシュ化したもの |
nonce | 1以上の数(※作成時と同様に注意) |
method | APIメソッド名。この機能では"getInvoiceIdsByOrderNumber" |
orderNumber | 注文番号 |
orderNumber
インボイス作成時に設定していないと検索できないと思われる。あとから検索する可能性があれば、createInvoiceのパラメーターにorderNumberを設定しておこう。
コード例(Ruby)
require "http"
API_KEY = "作成したkey"
API_SECRET = "作成したsecret"
API_SECRET_SHA1 = Digest::SHA1.hexdigest(API_SECRET)
headers = {
key: API_KEY,
sha1secret: API_SECRET_SHA1
}
params = {
key: API_KEY,
sha1secret: API_SECRET_SHA1,
nonce: Time.now.to_i,
method: "getInvoiceIdsByOrderNumber",
orderNumber: "インボイス作成時に設定した任意の注文番号"
}
res = HTTP.headers(headers).post("https://api.zaif.jp/ecapi", :form => params).to_s
p res
レスポンス
成功すると見つかったインボイスのIDが返ってくる。
インボイスのキャンセル
作成した有効期限内のインボイスを取消す。
最低限必要なパラメーターはkeyとsecretを含めて5つだ。
パラメーター | 説明 |
---|---|
key | APIキー |
sha1secret | secretをSHA1でハッシュ化したもの |
nonce | 1以上の数(※作成時と同様に注意) |
method | APIメソッド名。この機能では"cancelInvoice" |
invoiceId | キャンセルしたいインボイスのID |
コード例(Ruby)
require "http"
API_KEY = "作成したkey"
API_SECRET = "作成したsecret"
API_SECRET_SHA1 = Digest::SHA1.hexdigest(API_SECRET)
headers = {
key: API_KEY,
sha1secret: API_SECRET_SHA1
}
params = {
key: API_KEY,
sha1secret: API_SECRET_SHA1,
nonce: Time.now.to_i,
method: "cancelInvoice",
invoiceId: "キャンセルしたいインボイスのID",
}
res = HTTP.headers(headers).post("https://api.zaif.jp/ecapi", :form => params).to_s
p res
レスポンス
成功すると取り消したインボイスの情報が返ってくる。該当するインボイスの決済ページにアクセスすると下記のように取消済みと表示される。
ZaifPaymentでSkebCoinによる支払いを受けたかった
ここからは余談だ。私は自分の運営するサービスでSkebCoinによる支払いを実装しようとしたが、今のところは様子見することにした。
注意深い方はインボイス作成時の画面でお気付きであろう。2024-09-19 20:54:54の時点で300円分のインボイスを作成すると29326.08696SKEBを要求される。この時の換算レートは0.01022980であり、ZaifのSkebCoinのレート0.1159とは乖離している。これでは、お客さんは300円を払うのに実質3398円ほどを負担しなければならないのではないだろうか?何度かインボイスの発行を試しているが、APIの換算レートがZaifの時価に近づくことはなかった。レートが安定しないと決済には使えない。なお、Zaifに問い合わせたらレート乖離は仕様と回答された。
私は表現の自由を守る決済の選択肢[1]であるSkebCoinを応援している。ぜひ頑張ってほしい。
追記、スプレッドについて
10月1日、なるがみ氏に本記事が拾われた。氏の情報によると以下とのことだ。
スプレッドは送金金額が大きいほど小さくなるそうです。
Discussion