一括ステータスレポートのダウンロード
完了した一括課金スケジュール作成ジョブの詳細なステータスレポートをダウンロードします。レポートには、元のCSVデータに加えて、各行の作成ステータスとエラーメッセージを示す追加カラムが含まれます。
API認証情報
リクエストパラメータ
必須 - 1フィールドパスパラメータ
`recurring_id`STRING(required)
一括作成エンドポイントから返されたRecurring export ID。IDはrecr_で始まります。ジョブは "completed" 状態である必要があります。
レスポンス
200
レポートダウンロードステータスレポートを含むCSVファイルを返します。レスポンスのContent-Typeはtext/csvです。
CSVカラムに含まれる内容:
- アップロードされたCSVのすべての元のカラム
status- 行処理ステータス(successまたはfailed)schedule_id- 成功した行の作成されたスケジュールID (schd_*)error_code- 失敗した行のエラーコードerror_message- 失敗した行の詳細なエラー説明
customer_key,customer,card,amount,description,every,period,days_of_month,start_date,end_date,status,schedule_id,error_code,error_message sub_001,cust_test_abc123,,100000,Monthly plan,1,month,1,2025-02-01,2026-01-31,success,schd_test_xyz789,, sub_002,cust_test_invalid,,50000,Basic plan,1,month,15,2025-02-01,,failed,,invalid_customer,Customer not found
400
不正なリクエストリクエストの検証に失敗しました。詳細はエラーメッセージを確認してください。
一般的な原因:
- 無効なrecurring_id形式
- ジョブがまだ完了していない(pendingまたはprocessing中)
401
認証エラー認証に失敗しました。APIキーが無効または欠落しています。
一般的な原因:
- Authorizationヘッダーが欠落
- 無効なシークレットキー
- シークレットキーの代わりにパブリックキーを使用
- HTTP Basic Auth形式が不正
404
見つかりません一括作成ジョブが見つからないか、レポートが利用できません。
一般的な原因:
- 無効なrecurring_id
- ジョブが別のアカウントに属している
- テストモードと本番モードのキーを混同
- レポートの有効期限が切れている(30日以上経過)
5xx
サーバーエラーサーバー側でエラーが発生しました。これらは稀ですが、適切に処理する必要があります。
対処方法:
- 指数バックオフでリクエストをリトライ
- status.omise.coでサービスインシデントを確認
- 詳細なガイダンスはエラー処理を参照
コードサンプル
- cURL
- Ruby
- Python
- Node.js
- PHP
- Java
- C#
- Go
# 一括作成ステータスレポートをダウンロード
curl https://api.omise.co/recurring_exports/recr_test_5xuy4w91xqz7d1w9u0t/download \
-u skey_test_5xuy4w91xqz7d1w9u0t: \
-o status_report.csv
require 'omise'
require 'net/http'
require 'uri'
Omise.api_key = 'skey_test_5xuy4w91xqz7d1w9u0t'
recurring_id = 'recr_test_5xuy4w91xqz7d1w9u0t'
uri = URI("https://api.omise.co/recurring_exports/#{recurring_id}/download")
request = Net::HTTP::Get.new(uri)
request.basic_auth(Omise.api_key, '')
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
# ファイルに保存
File.open('status_report.csv', 'w') do |file|
file.write(response.body)
end
puts "Report saved to status_report.csv"
import omise
import requests
omise.api_secret = 'skey_test_5xuy4w91xqz7d1w9u0t'
recurring_id = 'recr_test_5xuy4w91xqz7d1w9u0t'
response = requests.get(
f'https://api.omise.co/recurring_exports/{recurring_id}/download',
auth=(omise.api_secret, '')
)
# ファイルに保存
with open('status_report.csv', 'wb') as f:
f.write(response.content)
print("Report saved to status_report.csv")
# またはCSVを解析して処理
import csv
import io
reader = csv.DictReader(io.StringIO(response.text))
for row in reader:
if row['status'] == 'failed':
print(f"Failed: {row['customer_key']} - {row['error_message']}")
const omise = require('omise')({
secretKey: 'skey_test_5xuy4w91xqz7d1w9u0t'
});
const axios = require('axios');
const fs = require('fs');
const recurringId = 'recr_test_5xuy4w91xqz7d1w9u0t';
const response = await axios.get(
`https://api.omise.co/recurring_exports/${recurringId}/download`,
{
auth: {
username: 'skey_test_5xuy4w91xqz7d1w9u0t',
password: ''
},
responseType: 'text'
}
);
// ファイルに保存
fs.writeFileSync('status_report.csv', response.data);
console.log('Report saved to status_report.csv');
// または解析して処理
const Papa = require('papaparse');
const parsed = Papa.parse(response.data, { header: true });
parsed.data.forEach(row => {
if (row.status === 'failed') {
console.log(`Failed: ${row.customer_key} - ${row.error_message}`);
}
});
<?php
define('OMISE_SECRET_KEY', 'skey_test_5xuy4w91xqz7d1w9u0t');
$recurring_id = 'recr_test_5xuy4w91xqz7d1w9u0t';
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.omise.co/recurring_exports/{$recurring_id}/download",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_USERPWD => OMISE_SECRET_KEY . ':'
]);
$response = curl_exec($curl);
curl_close($curl);
// ファイルに保存
file_put_contents('status_report.csv', $response);
echo "Report saved to status_report.csv\n";
// または解析して処理
$lines = explode("\n", $response);
$header = str_getcsv(array_shift($lines));
foreach ($lines as $line) {
if (empty($line)) continue;
$row = array_combine($header, str_getcsv($line));
if ($row['status'] === 'failed') {
echo "Failed: {$row['customer_key']} - {$row['error_message']}\n";
}
}
import java.io.FileOutputStream;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.Base64;
HttpClient client = HttpClient.newHttpClient();
String recurringId = "recr_test_5xuy4w91xqz7d1w9u0t";
String auth = Base64.getEncoder().encodeToString("skey_test_5xuy4w91xqz7d1w9u0t:".getBytes());
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.omise.co/recurring_exports/" + recurringId + "/download"))
.header("Authorization", "Basic " + auth)
.GET()
.build();
HttpResponse<byte[]> response = client.send(request, HttpResponse.BodyHandlers.ofByteArray());
// ファイルに保存
try (FileOutputStream fos = new FileOutputStream("status_report.csv")) {
fos.write(response.body());
}
System.out.println("Report saved to status_report.csv");
using System.Net.Http;
using System.Net.Http.Headers;
using System.IO;
var client = new HttpClient();
var credentials = Convert.ToBase64String(
System.Text.Encoding.ASCII.GetBytes("skey_test_5xuy4w91xqz7d1w9u0t:")
);
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Basic", credentials);
var recurringId = "recr_test_5xuy4w91xqz7d1w9u0t";
var response = await client.GetAsync(
$"https://api.omise.co/recurring_exports/{recurringId}/download"
);
var content = await response.Content.ReadAsByteArrayAsync();
// ファイルに保存
await File.WriteAllBytesAsync("status_report.csv", content);
Console.WriteLine("Report saved to status_report.csv");
package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
recurringId := "recr_test_5xuy4w91xqz7d1w9u0t"
req, _ := http.NewRequest("GET",
"https://api.omise.co/recurring_exports/"+recurringId+"/download", nil)
req.SetBasicAuth("skey_test_5xuy4w91xqz7d1w9u0t", "")
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
// ファイルに保存
file, _ := os.Create("status_report.csv")
defer file.Close()
io.Copy(file, resp.Body)
fmt.Println("Report saved to status_report.csv")
}
ステータスレポートの処理
レポートをダウンロードした後、失敗した行を処理できます:
import csv
def process_status_report(filepath):
successful = []
failed = []
with open(filepath, 'r') as f:
reader = csv.DictReader(f)
for row in reader:
if row['status'] == 'success':
successful.append({
'customer_key': row['customer_key'],
'schedule_id': row['schedule_id']
})
else:
failed.append({
'customer_key': row['customer_key'],
'error_code': row['error_code'],
'error_message': row['error_message']
})
print(f"Successful: {len(successful)}")
print(f"Failed: {len(failed)}")
# 失敗した行をリトライするか、関連チームに通知
for fail in failed:
print(f" - {fail['customer_key']}: {fail['error_message']}")
return successful, failed
successful, failed = process_status_report('status_report.csv')
エラーと結果コード
行ステータス値
| ステータス | 説明 |
|---|---|
success | スケジュールが正常に作成されました |
failed | スケジュールの作成に失敗しました |
レポート内の一般的なエラーコード
| コード | 説明 | 解決方法 |
|---|---|---|
invalid_customer | 顧客IDが見つかりません | 顧客が存在し、アクティ ブであることを確認 |
no_card_attached | 顧客に支払いカードがない | 顧客にカードを紐付け |
invalid_card | カードIDが見つからないか期限切れ | 有効なカードを使用するか、削除してデフォルトを使用 |
invalid_amount | 金額がゼロ、負、または無効 | 正の整数の金額を指定 |
invalid_period | 期間の値が認識されません | day、week、またはmonthを使用 |
invalid_days_of_month | 無効な日の値 | 1-28の値を使用 |
invalid_date_format | 日付形式が認識されません | YYYY-MM-DD形式を使用 |
start_date_in_past | 開始日が過去 | 現在または将来の日付を使用 |
end_date_before_start | 終了日が開始日より前 | 終了日が開始日より後であることを確認 |
duplicate_schedule | 顧客のスケジュールが既に存在 | 既存のスケジュールを確認 |
試してみる
必須 - 1項目
あなたのIP:
...読み込み中...