マーケティングチーム

【初心者向け】fincodeで請求業務DX|Pythonで”決済機能付き請求書”をAPI発行する方法(インボイス機能)

             
SharefacebookX|twitterURLのコピー

index

                 

    fincodeマーケティング担当です。

    「毎月の請求書発行業務を自動化したい」 「Webサービスから直接顧客に請求書を送りたい」 「請求書を送るだけでなく、そのまますぐにクレジットカード等で支払ってもらいたい」

    BtoB、BtoCを問わず、ビジネスにおいて「請求・決済」は避けて通れない業務です。
    しかし、請求書を作成し、PDF化してメールで送り、入金を確認して消込作業を行う…といったアナログなフローに疲弊している方も多いのではないでしょうか。

    もし、これらが簡単なプログラムコードで完結するとしたらどうでしょう?

    この記事では、オンライン決済サービス「fincode byGMO」が提供する「インボイス機能」を活用し、Pythonを使って”決済機能付き請求書”をAPI経由で発行する方法を徹底解説します。

    fincodeは、エンジニアファーストな設計が特徴です。
    今回は、プログラミング初心者の方や、ビジネスサイドの方でも概要を理解できるよう詳しく説明していきます。

    本実装例で実現できること:請求業務のDX

    本記事で紹介するサンプルコードを実装すると、以下のフローを自動化できます。

    • 顧客登録APIで、fincode上に顧客IDを登録
    • インボイス作成APIで、顧客情報や取引内容等のインボイス情報を登録し、インボイスIDを生成
    • インボイス発行APIで、生成したインボイスIDに対して、決済機能付き請求書のURL(Invoice URL)を発行
    • 発行されたURLをブラウザで開くだけで、顧客はクレジットカードや銀行振込(バーチャル口座)で即座に支払い可能

    fincodeの「インボイス機能」とは

    「インボイス機能」とは、単に請求書のPDFを作るだけの機能ではありません。
    「請求」と「決済」をシームレスに統合した機能です。

    通常、請求書を受け取った顧客は、銀行振込の手続きをする必要があります。
    しかし、fincodeのインボイス機能では、発行されるURL自体が「請求書 兼 決済フォーム」になっています。

    顧客はそのページで請求内容を確認し、そのままクレジットカード番号を入力して決済を完了できます。
    運営側にとっても、「誰から入金があったか」が自動的にシステム上で紐づく(消込が不要になる)ため、経理業務の負担が劇的に軽減されます。

    fincodeでは、これらの機能を管理画面から手動で行うことも、APIを使ってプログラムから自動で行うことも可能です。

    インボイス機能 サービスページ

    fincodeが選ばれる理由

    決済APIを提供するサービスは世の中に数多く存在しますが、その中でもfincodeは「エンジニアにとっての開発しやすさ」を追求しています。

    ① シンプルで直感的なREST API
    fincodeのAPIは、RESTの原則に基づいて設計されたシンプルで統一性のあるAPIです。
    エンジニアにとっては理解がしやすく、直感的に開発を進めることができます。

    ② 登録後即座に使えるテスト環境
    Webサイトからアカウントを作成するだけで、テスト環境のAPIキーが発行され、開発をスタートできます。

    ③ わかりやすいドキュメントと日本語サポート
    fincodeはGMOグループが運営する国産サービスであり、日本語のドキュメントが充実していることはもちろん、日本のビジネスフローに最適化されています。

    事前準備(初心者向けガイド)

    ここからは実際に手を動かしていきましょう。まずはPythonでAPIを叩くための準備を行います。

    fincodeのAPIキーの取得方法

    まだアカウントをお持ちでない方は、fincodeサービスサイトから「アカウント登録」を行ってください。
    登録後、管理画面にログインすると「テスト環境」が利用可能な状態になっています。

    1. fincodeテスト環境の管理画面にログイン
    テスト環境のアカウントを作成する >
    テスト環境管理画面にログインする >

    2. 「API・Webhook」タブから シークレットキー をコピー
    fincodeのテスト用シークレットキーは「m_test_**********************」という形式です。

    3. 環境変数に設定する
    シークレットキーは、セキュリティの観点からコードに直書きせず、環境変数から読み込むことを推奨します。
    本記事の実装例では、シークレットキーは環境変数(※1)から読み込みます。
    (※1)プログラムが動く環境(パソコンやサーバー)にあらかじめ登録しておく設定情報のことです。APIキーなどの秘密情報をコードに書かず、安全に管理するために使われます。

    Pythonライブラリのインストール

    本記事では、PythonでHTTPリクエストを送るためのライブラリである requests を使用します。
    コマンドプロンプト(またはターミナル)で以下のコマンドを実行してインストールしてください。

    bash
    pip install requests

    コード全文:最小構成で動くPythonサンプル

    ここからは、Pythonだけで完結する最小構成のサンプルコードを紹介します。

    • スクリプト①:顧客IDを1件登録する
    • スクリプト②:インボイスを作成 → 発行する

    の2ファイル構成です。

    スクリプト①:顧客IDを登録する(/v1/customers)

    請求書を発行するためには、「誰に送るか」という顧客情報が必要です。
    まずは最小構成の顧客IDと名前だけで、CUST001 という顧客IDを1件登録します。

    Python
    import os
    import requests
    
    API_KEY = os.getenv("FINCODE_TEST_SECRET_KEY")  # 例: m_test_****************
    BASE_URL = "https://api.test.fincode.jp"
    
    HEADERS = {
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json",
    }
    
    url = f"{BASE_URL}/v1/customers"
    
    data = {
        "id": "CUST001",
        "name": "aaa"
    }
    
    # HTTP POSTリクエストの送信
    try:
        response = requests.post(url, headers=HEADERS, json=data)
    
        # レスポンスの処理
        if response.status_code == 200:
            # 成功した場合の処理
            print(f"Success: {response.json()}")
        else:
            # エラーの処理
            print(f"Error: {response.json()}")
    except requests.RequestException as e:
        # 通信エラーの処理
        print(f"Request error: {e}")

    コードのポイント解説
    APIのエンドポイント: /v1/customers に対して POST リクエストを送ることで新規登録が行われます。

    スクリプト②:インボイスを作成→発行する(/v1/invoices)

    顧客登録ができたら、次はいよいよ「インボイス(請求データ)」の作成です。ここが本記事のメインパートです。
    インボイス作成では、請求先の住所、明細(商品ごとの金額)、支払期日、利用可能な決済手段などを細かく指定できます。
    「インボイス作成」と「インボイス発行」を1本のスクリプトで実行します。

    Python
    import os
    import requests
    
    API_KEY = os.getenv("FINCODE_TEST_SECRET_KEY")  # 例: m_test_****************
    BASE_URL = "https://api.test.fincode.jp"
    
    HEADERS = {
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json",
    }
    
    
    def create_invoice(customer_id: str):
        """インボイス作成"""
        url = f"{BASE_URL}/v1/invoices"
    
        data = {
            "customer_id": customer_id,
            "customer_honorific": "様",
            "customer_overwrite": {
                "name": "株式会社テスト",
                "email": "customer@example.com",
                "addr_state": "13",
                "addr_city": "新宿区",
                "addr_line_1": "1-1-1",
                "addr_line_2": "テストビル",
                "addr_line_3": "",
                "addr_post_code": "1600022",
            },
            "issuer_overwrite": {
                "addr_state": "13",
                "addr_city": "新宿区",
                "addr_line_1": "1-1-1",
                "addr_line_2": "テストビル",
                "addr_line_3": "",
                "addr_post_code": "1600022",
                "email": "issuer@example.com",
                "phone_number": "0312345678",
            },
            "lines": [
                {
                    "date": "2025/12/25",
                    "name": "商品B",
                    "unit_price": 10000,
                    "quantity": 2,
                    "tax_rate": 10,
                }
            ],
            "pay_types": [
                "Virtualaccount",
                "Card",
            ],
            "card": {
                "job_code": "CAPTURE",
            },
            "due_date": "2026/01/31",
        }
    
        response = requests.post(
            url,
            headers=HEADERS,
            json=data,
            timeout=10,
        )
        response.raise_for_status()
        body = response.json()
        print("Create Invoice:", body)
        return body
    
    
    def open_invoice(invoice_id: str):
        """インボイス発行"""
        url = f"{BASE_URL}/v1/invoices/{invoice_id}/open"
    
        data = {
            "bill_mail_send_flag": "0",
            "receipt_mail_send_flag": "0",
            "underpayment_mail_send_flag": "0",
        }
    
        response = requests.put(
            url,
            headers=HEADERS,
            json=data,
            timeout=10,
        )
        response.raise_for_status()
        body = response.json()
        print("Open Invoice:", body)
        return body
    
    
    if __name__ == "__main__":
        #登録した顧客IDと合わせる
        CUSTOMER_ID = "CUST001"
    
        #インボイス作成
        created = create_invoice(CUSTOMER_ID)
        invoice_id = created["id"]
        print("Invoice ID:", invoice_id)
    
        #インボイス発行
        opened = open_invoice(invoice_id)
        print("Invoice URL:", opened.get("invoice_url"))

    コードの流れを分解して理解する

    ここからは、上記コードの流れをステップごとに分解して見ていきます。

    ① APIキーと環境変数を設定する

    Python
    API_KEY = os.getenv("FINCODE_TEST_SECRET_KEY")
    BASE_URL = "https://api.test.fincode.jp"
    
    • テスト環境用のシークレットキーを、環境変数 FINCODE_TEST_SECRET_KEY から取得します。
    • セキュリティ上、APIキーをPythonコードに直書きするのは推奨されません。環境変数で管理しましょう。

    ② 顧客IDを登録する(/v1/customers)

    Python
    data = {
        "id": "CUST001",
        "name": "aaa"
    }

    主な項目は以下の通りです。

    項目 内容 補足
    id 顧客ID インボイスAPIから参照するID
    name 顧客名 任意の文字列

    ここで登録した CUST001 を、後続のインボイス作成APIの customer_id に指定します。

    ③ インボイス作成APIで請求内容を登録する(/v1/invoices)

    Python
        data = {
            "customer_id": customer_id,
            "customer_honorific": "様",
            "customer_overwrite": {
                "name": "株式会社テスト",
                "email": "customer@example.com",
                "addr_state": "13",
                "addr_city": "新宿区",
                "addr_line_1": "1-1-1",
                "addr_line_2": "テストビル",
                "addr_line_3": "",
                "addr_post_code": "1600022",
            },
            "issuer_overwrite": {
                "addr_state": "13",
                "addr_city": "新宿区",
                "addr_line_1": "1-1-1",
                "addr_line_2": "テストビル",
                "addr_line_3": "",
                "addr_post_code": "1600022",
                "email": "issuer@example.com",
                "phone_number": "0312345678",
            },
            "lines": [
                {
                    "date": "2025/12/25",
                    "name": "商品B",
                    "unit_price": 10000,
                    "quantity": 2,
                    "tax_rate": 10,
                }
            ],
            "pay_types": [
                "Virtualaccount",
                "Card",
            ],
            "card": {
                "job_code": "CAPTURE",
            },
            "due_date": "2026/01/31",
        }

    主な項目は以下の通りです。

    項目 内容 補足
    id 顧客ID 事前に登録した CUST001
    customer_honorific 敬称 「様」「御中」など
    customer_overwrite 顧客情報の上書き 請求書上に表示したい宛名や住所など
    issuer_overwrite 発行元情報の上書き 自社の住所・連絡先など
    lines 請求明細の配列 商品名・単価・数量・税率など
    pay_types 利用可能な決済手段 "Card" / "Virtualaccount" など
    card.job_code 売上確定方法 "CAPTURE" = 即時売上 / "AUTH" = 仮売上
    due_date 支払期日 yyyy/MM/dd 形式

    この時点では、インボイスのステータスは「DRAFT(下書き)」の状態です。
    請求自体はまだ開始されていません。

    ④ インボイス発行APIで請求を開始する(/v1/invoices/{id}/open)

    Python
        data = {
            "bill_mail_send_flag": "0",
            "receipt_mail_send_flag": "0",
            "underpayment_mail_send_flag": "0",
        }

    主なフラグは次の通りです。

    項目 内容
    bill_mail_send_flag 請求書メール送信フラグ("0":送信しない / "1":送信する)
    receipt_mail_send_flag 領収書メール送信フラグ("0":送信しない / "1":送信する)
    underpayment_mail_send_flag 差額請求メール送信フラグ("0":送信しない / "1":送信する)

    成功すると、レスポンスに

    • status: AWAITING_CUSTOMER_PAYMENT(支払い待ち)などのステータス
    • invoice_url: 顧客向けの請求ページURL

    が含まれます。この invoice_url を顧客に共有することで、オンラインでの支払いが可能になります。

    インボイスのテストを行う

    テスト環境でインボイスを発行したら、レスポンスに含まれる invoice_url をブラウザで開いてみてください。

    • 請求内容・金額・支払期日などが表示された請求ページが開く
    • カード決済を有効にしている場合、テスト用カード番号を使って支払いテストが可能

    fincodeではテスト用のカード番号やテストリソースが用意されています。詳細はドキュメントをご確認ください。
    テスト時は、有効期限やカード名義人は任意の値で問題ありません。

    想定質問(FAQ)

    Q1. 決済手段をカードだけにするにはどうすればいいですか?
    pay_types["Card"] のみにしてください。
    バーチャル口座のみを使いたい場合は ["Virtualaccount"] のみにする、という形で制御できます。

    Q2. 請求番号(invoice_number)は必須ですか?
    → 本記事のサンプルでは指定していませんが、指定しない場合はインボイス発行時に自動採番されます。

    Q3. 本番環境で使うには何を変えれば良いですか?
    → 主に以下の2点です。

    • BASE_URLhttps://api.fincode.jp に変更
    • 本番環境用のシークレットキーを環境変数に設定

    それ以外のリクエスト形式(ヘッダーやJSON構造など)は基本的に同じです。

    おわりに

    本記事では、fincodeのテスト環境を使って、Pythonで簡単に”決済機能付き請求書”をAPI経由で発行できる「インボイス機能」の実装について説明しました。
    ぜひ、今回のサンプルをベースに、自社サービスの請求・入金まわりの自動化にチャレンジしてみてください。

    運営会社

    会社名 GMOイプシロン株式会社(英文表記:GMO Epsilon, Inc.)
    設立年月日 2002年9月26日
    所在地 〒150-0043
    東京都渋谷区道玄坂1丁目14番6号 ヒューマックス渋谷ビル7F
    資本金 1億5百万円
    事業内容 オンライン販売の決済代行、代金回収代行及びそれらに付帯する業務
    主要株主 GMOペイメントゲートウェイ株式会社 (東証プライム上場:3769)
    グループ会社 GMOインターネットグループ

    東証プライム上場企業のGMOペイメントゲートウェイの連結会社として、プライバシーマーク認証やPCI DSS、ISMS準拠のセキュリティ基準で安心してご利用いただける環境を提供しています。

     

    事業規模によって決済手数料のご提案が可能です。
    見積依頼 >

    fincodeサービス概要の資料ダウンロードはこちらから
    資料請求 >

     

    あわせて読みたいおすすめの記事

    【初心者向け】Pythonでfincodeの決済APIを実行する実装例(決済URL作成編)

    【Python】クレジットカード決済の実装方法(決済登録API+決済実行JS編)

    Python(Flask)でPayPay決済APIを実装する方法(決済登録API+決済実行API)

    この記事をShareする facebook X|twitter URLをコピー
    fincode byGMOはスタートアップが成功するために設計されたオンライン決済インフラです。直感的なAPIやローコードコンポーネントで工数少なく実装可能です。
    マーケティングチーム
    マーケティングチーム
    fincode byGMOのマーケティングチームです! リリース情報や業界情報などを発信していきます。

    関連事例