デジタル配布
Web サービス(DDWS)
GetInvoice - サービス マニュアル
目次
1 はじめに ... 3 1.1 概要 ... 3 1.2 サポート ドキュメント ... 3 2 スタート アップ ... 4 3 請求書取得サービスの概要 ... 4 3.1 GetInvoiceList ... 6 3.2 GetInvoiceDetails ... 6 3.3 GetInvoice サービスの利点 ... 6 4 GetInvoice サービス リファレンス情報 ... 6 4.1 複数の CSN に関する注意 ... 6 4.2 要求スキーマ ... 7 4.3 応答スキーマ ... 8 4.3.1 GetInvoiceList ... 8 4.3.2 GetInvoiceDetails... 8 4.4 エラー スキーマ... 11 4.5 要求メッセージ ... 11 4.5.1 要求メッセージ - GetInvoiceList ... 11 4.5.2 要求メッセージ - GetInvoiceDetails ... 12 4.6 応答メッセージ ... 13 4.6.1 応答メッセージ - GetInvoiceList ... 13 4.6.2 応答メッセージ - GetInvoiceDetails ... 13 4.7 エラー メッセージ ... 18 4.7.1 サンプルのエラー応答 ... 19 5 付録 ... 19 5.1 複数の CSN を入力するための C# コード ... 19 5.1.1 メイン プログラム ... 19 5.1.2 ユーティリティ クラス ... 20 5.1.3 POCO... 24改訂履歴
バージョン 日付 作成者 コメント 2.1 10/22/2015 AR 「修正履歴」セクションを 追加 2.2 12/14/2015 AR セクション 4.3 の GetInvoiceDetails 応答の invoice_header の下に、 adsk_vat_number、 recurring_po、 total_amount を追加 2.3 12/22/2015 AR セクション 4.2、 purchase_order_number の最大長さを 35 文字に 置き換え 2.4 02/23/2016 RL invoice_items に bill_per_start_dt フィール ドと bill_per_end_dt フィールドを追加 2.5 02/23/2016 ER contract_end の 説明を更新1 はじめに
1.1 概要
デジタル配布 Web サービス(DDWS)プラットフォームは、すべてにおいてパートナーからはロー タッチで、オート デスクからはゼロ タッチで、パートナーからオートデスクに直接作成される発注のための自動化されたソリュー ションです。この新しいビジネス機能は、パートナーとオートデスクの間での実際の B2B Web サービス トランザ クションに使用できます。 パートナーがオートデスクのデジタル サービス プラットフォームを効果的に実装するには、関連企業が REST Web サービス、OAuth、JSON に精通している必要があります。サンプル クライアント アプリケーションは、プロ グラミング ガイド ドキュメントで(Ruby 言語で記述)提供されています。これは、デジタル サービス API を使用す る前述の関連企業の開発者に役立ちます。1.2 サポート ドキュメント
• オートデスク パートナー開発者用ガイド: このガイドは、パートナーのオンボーディング プロセスおよび DDWS サービスへのアクセスに役立ちます。このガイドは、統合に必要な初期のアクティビティを段階的 にガイドする手順を使用して、オートデスクのデジタル サービス プラットフォームの概要もパートナーに説 明します。• 認証 API ドキュメント: このドキュメントでは、サービス API を使用するために必要な資格情報、署名、ア クセス トークンを生成する手順をパートナーに説明します。また、パートナーの統合アプリケーションを開 発するための情報も記載されています。Web サービスの統合の基礎知識や一般的なアプリケーション開 発について説明します。
2 スタート アップ
オンボーディング プロセスの一環として、パートナーは、一意の顧客固有番号(CSN)に関連付けられ、そのアプリ ケーションはオートデスクに登録されます。 オンボーディング プロセスの詳細については、『オートデスク パートナー開発者用ガイド』を参照してください。3 請求書取得サービスの概要
入力を指定するリクエスタに日付範囲(開始日と終了日)があるシナリオにすることができます。この場合、サービ スは、特定の期間の請求書が膨大な量になる可能性があるため、特定の期間に請求書の詳細のすべてを指定 することはできません。 取得する請求書には、このサービスで定義された 2 つの操作があります。 • getInvoiceList • getInvoiceDetails上の図は、getInvoice サービスを表したものです。オートデスクのデジタル サービス プラットフォームを実装することに よって、プロセスをより効率化することができます。次のグラフィックスのシリーズは、Web ストアのユーザ エクスペリ エンスを示しています。 この最初のスクリーンショットは、getInvoiceList 操作を呼び出す方法を示しています。顧客は、特定の期間に対応す る請求書を取得するために、日付範囲を入力します。この入力に基づいて、日付範囲内にあるすべての請求書が顧客 に表示されます。 請求書のリストを取得した後、顧客は、次のスクリーンショットに示すように、特定の請求書番号/PO 番号/販売注文番 号に関する請求書の詳細を取得することができます。
3.1 GetInvoiceList
この操作の目的は、入力に日付範囲だけが含まれている場合に、バック エンド システムから請求書リストを取 得することです。リクエスタが応答を受け取ったら、入力として請求書番号/PO 番号/販売注文番号を使用して getInvoiceDetails を呼び出します。次の入力は、サービスの呼び出しに必要です。 1. customer_number 2. invoice_date_from 3. invoice_date_to3.2 GetInvoiceDetails
この操作の目的は、特定の入力用に請求書の詳細を取得することです。この操作は、次の一連の入力を使用し て呼び出すことができます。1. customer_number and purchase_order_number/ invoice_number / sales_order_number 3 つすべてのパラメータ(po_number、invoice_number、order_number)がサービス要求に存在する場合は、 検索基準の優先順位は、次のように定義されます。 1. invoice_number (高) 2. purchase_order_number 3. sales_order_number (低) 注: 有効な請求書だけが GetInvoice API の応答の一部として追加されます。
3.3 GetInvoice サービスの利点
1. HTTP 接続を介してすべてのアプリケーションから簡単に使用できる軽量の REST Web サービスです。 2. 必要に応じてパートナーが請求書の情報を取得するための機能で、電子メールや EDI IDoc データ内の PDF の請求書を検索する必要がなくなります。 3. このサービスによって、パートナーは、特定の日付範囲で、または指定した請求書番号、PO 番号、注文番号 によって、請求書を検索することができます。 4. パートナーは、請求書のデータをカスタマイズしたり、必要に応じてその内部システムにプラグインすることが できます。4 GetInvoice サービス リファレンス情報
4.1 複数の CSN に関する注意
注: GetInvoice サービスは、要求ごとに 1 つの customer_number (CSN)のみをサポートしています。パート ナーに複数の CSN がある場合、そのパートナーは対応する情報を取得するために、サービスを複数回呼び出 す必要があります。これを実行する方法の 1 つは、使用できるすべての CSN に対して、GetInvoice サービスを 呼び出す、接続しているアプリケーション内でループをプログラムすることです。このようなスクリプトは、呼び出 しごとに生成する資格情報とアクセス トークンを処理することも重要です。このようなスクリプトの完全なサンプ ルは、このサービス リファレンス マニュアルの付録セクションにあります。以下には、前述の例に関連するセグ メントが含まれています。// Looping through each CSN
var container = new List<ResponseContainer>(); foreach (var csn in credentials.CSNs)
{
// Signing partner's credentials
var firstSignature = Utils.GetFirstSignature(credentials); // Sending request to OAuth server to generate an Access Token
var tokenDetails = Utils.CallOAuthEndPoint(firstSignature); // Signing Access Token
var secondSignature = Utils.GetSecondSignature(tokenDetails, credentials);
// Calling Get Invoice WebService
var endPoint = string.Format( "https://enterprise-api-
stg.autodesk.com/v1/invoices?customer_number={0}&invoice_date_from=2015-08-01&invoice_date_to=2015-09-01", csn);
var invoice = Utils.GetInvoices(endPoint, secondSignature, csn); // Storing WebService's response
var invoiceContainer =
JsonConvert.DeserializeObject<InvoiceContainer>(invoice); container.Add(new ResponseContainer { CSN = csn,
Response = invoiceContainer });
}
// Writing response to file
var json = JsonConvert.SerializeObject(container, Formatting.Indented); Utils.WriteJsonToFile(json);
4.2 要求スキーマ
次の表に、getInvoiceList() と getInvoiceDetails() 両方の要求メッセージ パラメータの詳細を示します。 要素 フィールド タイプ 入力の長さ/形式 使用率 ge tI nv o ic e Li s t() 要素 customer_number 文字列 長さ: 最大 10 文字 必須 Invoice_date_from 日付 形式: ISO 8601 YYYY-MM-DD 必須 invoice_date_to 日付 形式: ISO 8601 YYYY-MM-DD 必須 ge tI Inv o iceD e ta il s () 要素 customer_number 文字列 長さ: 最大 10 文字 必須 invoice_number 文字列 長さ: 最大 10 文字 1 つまたはすべてのpurchase_order_nu mber 文字列 長さ: 最大 35 文字 いずれかを customer_number とともに渡すことが できる sales_order_number 文字列 長さ: 最大 10 文字
4.3 応答スキーマ
4.3.1 GetInvoiceList フィールド名 説明 invoice_number 請求書番号 bill_to_customer 顧客番号 1 purchase_order_number 顧客の PO 番号 invoice_date ドキュメント内のポスト日付 形式: ISO 8601 YYYY-MM-DD transaction_type ドキュメント タイプの説明 invoice_total_amount 伝票通貨の金額 invoice_currency 通貨キー account_doc_description 項目のテキスト customer_po_number 顧客の PO 番号 sales_order_number 販売および配布のドキュメント番号 4.3.2 GetInvoiceDetails フィールド名 説明 invoice_bankinfo invoice_number 販売および配布のドキュメント番号 name 銀行名 bank_keys 銀行キー bank_number 銀行の番号 bank_branchid 銀行の支店 bank_account_number 銀行の口座番号 currency 銀行の通貨 alternative_bank_account 代替の銀行口座番号(不明瞭な口座番号用) lockbox_number LockBox 番号 swiftcode 国際送金用の SWIFT コード iban IBAN (国際銀行の口座番号) bank_control_key 銀行のコントロール キー country 国 address 銀行の住所 city 市区町村 district 区域 region 地域(都道府県、郡) postalcode 郵便番号/私書箱tel_number 電話番号
fax_number FAX 番号
additional 追加情報(ABI コード/CAB コード/GIRO/Sort コードなど)
invoice_header invoice_date 請求のインデックスと印刷の請求日 形式: ISO 8601 invoice_number 販売および配布のドキュメント番号 po_date 顧客の PO 日 形式: ISO 8601 order_date 販売注文日 形式: ISO 8601 YYYY-MM-DD purchase_order_number 顧客の PO 番号 customer_po_number 出荷先の PO 番号 transaction_type Char 20 ship_date 日付 形式: ISO 8601 YYYY-MM-DD invoice_currency SD 伝票通貨 sales_order_number 注文 contract_number 顧客またはベンダーの内部参照 payment_term 支払い期間 payment_due 支払い期日 形式: ISO 8601 YYYY-MM-DD local_currency 通貨キー exchange_rate 価格決定の為替レート vat_number VAT 登録番号 delivery_code インコタームズ(パート 1) delivery_description インコタームズ(パート 2) delivery_number 配送 numbers_item 自然数 tax_amount 伝票通貨の税額 tax_type 税金タイプ tax_rate 税率 freight_charge 運送料 tracking_number 運送状番号 opportunity_id 商談 ID extra_po_identifier 追加購入の拡張子 invoice_amount 伝票通貨の正味価格 weight_total 総重量 weight_uom 重量の単位 reserve_header_field バックアップのヘッダ フィールド adsk_vat_number オートデスクの VAT 登録番号 recurring_po サブスクリプションの自動更新による注文の購入注文
total_amount 正味価格 + 税 invoice_items invoice_number 請求ドキュメント line_number 請求項目 sku 型番 sku_description 販売注文項目の短いテキスト physical_media 文字値から ELD 値 invoice_currency SD 伝票通貨 contract_start 契約開始日 形式: ISO 8601 YYYY-MM-DD contract_end 契約終了日 形式: ISO 8601 YYYY-MM-DD 月単位または年単位の自動更新契約の場合、次の規則が適用 されます。 契約が解約されると、フィールド contract_end に解約日が表示 されます。 契約が有効である場合、フィールド contract_end に "Auto-Renewing Contract" と表示されます。 quantity 実際の請求量 quantity_uom 基本の計測単位 seats 自然数 unit_price 単価 unit_discount 単価割引 net_value 伝票通貨での支払項目の正味価格 serial_number シリアル番号 current_serial_number 現在のシリアル番号 old_serial_number 旧シリアル番号 partner_subs_id パートナー Subs # vat_description VAT テキスト reserve_item_field バックアップの項目フィールド bill_per_start_dt 請求期間の開始日 bill_per_end_dt 請求期間の終了日 invoice_partners invoice_number 販売および配布のドキュメント番号 line_number 請求項目 partner_type 顧客タイプ partner_number 顧客番号 1 contact_number 担当者の人数 partner_name 名前 street 番地 po_box 私書箱 city 市区町村 postal_code 郵便番号
pobox_postal_code 私書箱、郵便番号 country 国名 tel_number 代表電話番号 fax_number ファックス番号 district 区域 region 地域(都道府県、郡) country_iso 国 ISO コード
4.4 エラー スキーマ
フィールド名 説明 status 確認応答: "OK"、"FAILED"、"ERROR" message エラーのメッセージ transactionid 一意のトランザクション ID (請求書番号とタイムスタンプの組み合わせ)4.5 要求メッセージ
入力パラメータに基づいて、getInvoiceList() または getInvoiceDetails() の操作が呼び出されます。入力に "開始日" と "終了日" パラメータがある場合は、getInvoiceList() が呼び出されます。入力に PO 番号、請求 書番号、または販売注文番号がある場合は、getInvoiceDetails() が呼び出されます。 以下は、両方の操作のサンプル要求です。 4.5.1 要求メッセージ - GetInvoiceList http://enterprise-api- stg.autodesk.com/v1/invoices?customer_number=5117338390&invoice_date_from=2014-06-01&invoice_date_to=2014-06-30 Message Headers Content-Type: application/jsonAuthorization: Bearer <<Access Token>> CSN: <<CSN>>
signature: <<Signed Access Token>>
4.5.2 要求メッセージ - GetInvoiceDetails
http://enterprise-api-stg.autodesk.com/v1/invoices?customer_number=5163338143&invoice_number=9052068717 Message Headers
Content-Type: application/json
Authorization: Bearer <<Access Token>> CSN: <<CSN>>
signature: <<Signed Access Token>>
timestamp: <<Timestamp for the signed Access Token>> OR http://enterprise-api-stg.autodesk.com/v1/invoices?customer_number=5163338143&invoice_number=9052068717&sal es_order_number=7355393800 Message Headers Content-Type: application/json
Authorization: Bearer <<Access Token>> CSN: <<CSN>>
signature: <<Signed Access Token>>
timestamp: <<Timestamp for the signed Access Token>> OR http://enterprise-api-stg.autodesk.com/v1/invoices?customer_number=5163338143&invoice_number=905206871&pur chase_order_number=712100000424 Message Headers Content-Type: application/json
Authorization: Bearer <<Access Token>> CSN: <<CSN>>
signature: <<Signed Access Token>>
timestamp: <<Timestamp for the signed Access Token>>
OR http://enterprise-api-stg.autodesk.com/v1/invoices?customer_number=5163338143&invoice_number=9052068717&sal es_order_number=7355393800&purchase_order_number=712100000424 Message Headers Content-Type: application/json
Authorization: Bearer <<Access Token>> CSN: <<CSN>>
signature: <<Signed Access Token>>
4.6 応答メッセージ
注: オートデスクは、次の構造で応答を送信します。パートナーは、必要に応じて、これを別の構造に再フォーマット することができます。 4.6.1 応答メッセージ - GetInvoiceList { "status": "OK", "transaction_id": "INV701765101433844843", "message": [ { "invoice_number": "9052238559", "purchase_order_number": "9833356789", "bill_to_customer": "5163338143", "invoice_date": "2014-06-11”, "customer_po_number": "", "transaction_type": "Invoice", "invoice_total_amount": 328.5, "invoice_currency": "USD", "account_doc_description": "", "sales_order_number": "7333403750" }, { "invoice_number": "9052158556", "purchase_order_number ": "7865345690", "bill_to_customer ": "5163268143", "invoice_date": "2014-06-24", "customer_po_number ": "", "transaction_type": "Invoice", "invoice_total_amount: 2161.53, "invoice_currency": "USD", "account_doc_description ": "", "sales_order_number ": "7052971819" } ] } 4.6.2 応答メッセージ - GetInvoiceDetails { "status": "OK", "transaction_id": "INV701765101433844843", "message": [ { "invoice_bankinfo": [ { “invoice_number”:” 9044468717”, "name": "Merghle", "bank_keys": "","bank_number": "", "bank_branchid": "", "bank_account_number": "", "currency": "", "alternative_bank_account": "", "lockbox_number": "", "swiftcode": "", “iban": "", "bank_control_key": "", "country": "", "address": "",
"city": "Carol Stream, IL 60132-2188", “district”:””,
"region": "", "postalcode": "", "tel_number":”", "fax_number ": "",
"additional": "MAIL PAYMENTS TO: AUTODESK, INC. C/O MERGHLE" }, { “invoice_number”:” 9054468717”, "name": "Merghle", "bank_keys": "", "bank_number": "", "bank_branchid": "", "bank_account_number": "40574469", "currency": "", "alternative_bank_account": "", "lockbox_number": "", "swiftcode": "", "iban": "", "bank_control_key": "", "country": "", "address": "", "city": "", “district”:””, "region": "", "postalcode": "", "tel_number":”", "fax_number ": "",
"additional": "ABA# 021000089/WIRE PAYMENTS TO:" } ], "invoice_header": [ { "invoice_date": "2014-10-24", "invoice_number": "9052333717", "po_date": "2014-07-09", "order_date": "2014-09-24", "purchase_order_number": "D20000036_R2D2", "customer_po_number": "", "transaction_type": "Invoice", "ship_date": null,
"invoice_currency": "USD",
"sales_order_number": "7354493780", "contract_number": "D44000442", "payment_term": "30",
"payment_due": "Up to 11/23/2014 without deduction", "local_currency": "USD",
"exchange_rate": 1, "vat_number": "", "delivery_code": "CIF",
"delivery_description": "FOB Origin", "delivery_number": "", "numbers_of_items": 1, "tax_amount": 0, "tax_type": "TPS;TVQ", "tax_rate": "7.975%;7%", "tracking_number": "1ZR43W412049469", "extra_po_identifier": "", "freight_charge": 0, "opportunity_id": "", " invoice_amount": 30, "weight_total": 0, "weight_uom": "", "reserve_header_field": "" } ], "invoice_items": [ { "invoice_number": "9033338717", "line_number": "000050", "sku": "961F1-WW6573-L994",
"sku_description": "ADSKFD 2014 TL:MT SUB WW ELD",
“physical_media”:””, "invoice_currency": "USD", "contract_start": "2014-09-24", "contract_end": "2015-12-31", "quantity": 1, "quantity_uom": "EA", "seats": 0, "unit_price": 30, "unit_discount": 0, "net_value": 30, "serial_number": "364-72262293", "current_serial_number": "", "old_serial_number": "", "partner_subs_id": "", “vat_description”:””, "reserve_item_field": "", "bill_per_start_dt": "2016-02-22T00:00:00+0000", "bill_per_end_dt": "2016-03-21T00:00:00+0000" } ], "invoice_partners": [ {
"invoice_number": "9052222717", "line_number": "000000",
"partner_type": "", "partner_number": "",
"contact_number": "0000000000", "partner_name": "Autochair Inc.", "street": "McInnis Parkway", "po_box": "",
"city": "SAN ROFFEL", "postal_code": "94903", "pobox_postal_code": "", "country": "USA", "tel_number": "415-507-5000", "fax_number": "", "district": "MARIN", "region": "CA" }, { "invoice_number": "9033368717", "line_number": "000000",
"partner_type": "Sold to",
"partner_number": "5162644143", "contact_number": "0000000000", "partner_name": "Quechua Rentals", "street": "410 Terry Ave N",
"po_box": "", "city": "Seattle", "postal_code": "98109-5210", "pobox_postal_code": "", "country": "USA", "tel_number": "", "fax_number": "", "district": "KING", "region": "WA" }, { "invoice_number": "9054558717", "line_number": "000000",
"partner_type": "Bill to",
"partner_number": "5163268143", "contact_number": "0000000000", "partner_name": "Quechua Rentals", "street": "410 Terry Ave N",
"po_box": "", "city": "Seattle", "postal_code": "93109-5210", "pobox_postal_code": "", "country": "USA", "tel_number": "", "fax_number": "", "district": "KING", "region": "WA" },
{
"invoice_number": "9053338717", "line_number": "000000",
"partner_type": "Ship to",
"partner_number": "5166668390", "contact_number": "0000000000", "partner_name": "Quechua Rentals", "street": "410 Terry Ave N",
"po_box": "", "city": "Seattle", "postal_code": "98209-5210", "pobox_postal_code": "", "country": "USA", "tel_number": "", "fax_number": "", "district": "KING", "region": "WA" }, { "invoice_number": "9053368717", "line_number": "000050", "partner_type": "Reseller", "partner_number": "5162644143", "contact_number": "0000000000", "partner_name": "Quechua Rentals", "street": "410 Terry Ave N",
"po_box": "", "city": "Seattle", "postal_code": "98229-5210", "pobox_postal_code": "", "country": "USA", "tel_number": "", "fax_number": "", "district": "KING", "region": "WA" } ] } ] } 注: 税金タイプと税率が複数ある場合、サービスは、次のようなデータを返します。
ここでは、値が ‘;’ で区切られます。tax_type と tax_rate はシーケンスで指定されます(例: tax_rate 7.975% は tax_type “TPS” に対応し、tax_rate “7%” は tax_type “TVQ” に対応しています)。
4.7 エラー メッセージ
次の表は、エラーが発生する応答メッセージに表示されるエラー コードとそれぞれのエラー メッセージを示し ています。 エラー メッセージ エラー コード エラーの説明 顧客番号を入力してください UAN-GEN-00108 顧客番号の値が空白です フィールドを空白にすることはできません。 日付を入力してください UAN-GEN-00108 請求開始日/請求終了日の値が空白 です 日付範囲は 90 日以内にしてください。入 力内容を確認してもう一度試してください UAN-GEN-00141 日付範囲が 90 日を超えていないか どうかを確認してください 顧客番号は 10 文字以内にしてください。 入力内容を確認してもう一度試してください UAN-GEN-00123 顧客番号が 10 文字を超えていない かどうかを確認してください YYYY-MM-DD 形式で有効な開始日を入 力してください UAN-GEN-00119 日付の形式を確認してください YYYY-MM-DD 形式で有効な終了日を入 力してください UAN-GEN-00119 日付の形式を確認してください 処理を妨げるシステムの問題が発生しまし た。後でもう一度試してください UAN-GEN-00122 技術的な例外 請求書番号は正確に 10 文字にする必要 があります。入力内容を確認してもう一度 試してください UAN-GEN-00123 請求書番号が 10 文字以外かどうか を確認してください 販売注文番号は正確に 10 文字にする必 要があります。入力内容を確認してもう一 度試してください UAN-GEN-00123 販売注文番号が 10 文字以外かどう かを確認してください 請求開始日は請求終了日より前にする必 要があります UAN-INV-00002 請求開始日の値が請求終了日より 前かどうかを確認してください 入力した顧客番号は無効です。 APG-DWS-INV-002 パートナーによって送信された CSN が無効です { "status": "OK", "transaction_id": "INV701111351434507983", "message": [] } - 現在の検索に対する記録が見つか らない場合、空のメッセージが指定さ れてサービス レイヤに応答が返され ます。4.7.1 サンプルのエラー応答
5 付録
5.1 複数の CSN を入力するための C# コード
以下は、GetInvoice サービスに複数の CSN 入力に書き込むことができるスクリプト パートナーの例です。 GetInvoice サービスは、要求ごとに 1 つの CSN のみを処理できるので、これを念頭に置いて、アプリケー ションをプログラムする必要があります。これを実行する方法の 1 つは、署名とアクセス トークンの生成を考 慮して、すべての CSN に要求するループをプログラムすることです。これを実行するコードの例を以下に示し ます。 5.1.1 メイン プログラム using System; using System.Collections.Generic; using System.Text; using MultipleInvoiceCallPoC.POCOs; using Newtonsoft.Json; using System.Diagnostics; using System.Threading; namespace MultipleInvoiceCallPoC { class Program {static void Main(string[] args) {
//"Acquiring credentials
var credentials = new Credentials
{
BasePath = "https://www.example.com",
ConsumerKey = "AbM03alqHyT3uv3D3cYQV0gq8K0kkKNf", ConsumerSecret = "SCqY7IKSoIZ1ZbY5",
CSNs = new List<string>() { { "status": "Error", "transactionid": "INV51046287871433503736", "message": [ { "error_code": "UAN-GEN-00108",
"error_message": "Please enter Customer Number" }
] }
"51626566", "51626567", "51626568", "51626569", "51626570" } };
// Looping through each CSN
var container = new List<ResponseContainer>(); foreach (var csn in credentials.CSNs)
{
// Signing partner's credentials
var firstSignature = Utils.GetFirstSignature(credentials); // Sending request to OAuth server to generate an Access Token
var tokenDetails = Utils.CallOAuthEndPoint(firstSignature); // Signing Access Token
var secondSignature = Utils.GetSecondSignature(tokenDetails, credentials); // Calling Get Invoice WebService
var endPoint = string.Format( "https://enterprise-api-
stg.autodesk.com/v1/invoices?customer_number={0}&invoice_date_from=2015-08-01&invoice_date_to=2015-09-01", csn);
var invoice = Utils.GetInvoices(endPoint, secondSignature, csn); // Storing WebService's response
var invoiceContainer =
JsonConvert.DeserializeObject<InvoiceContainer>(invoice); container.Add(new ResponseContainer { CSN = csn,
Response = invoiceContainer });
}
// Writing response to file
var json = JsonConvert.SerializeObject(container, Formatting.Indented); Utils.WriteJsonToFile(json);
} } }
5.1.2 ユーティリティ クラス
public class Utils
{
/// <summary>
/// Sets up the OAuth URL end-point and headers to be send in the request in order to
/// generate the Access Token
/// </summary>
/// <param name="firstSignature">Class that contains Partner's signed credentials</param>
/// <returns>String with a JSON object</returns>
public static string GetAccesToken(string url, FirstSignature firstSignature) {
var request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST";
request.ContentType = "application/json";
request.Headers.Add("Authorization", string.Format("Basic {0}", firstSignature.Base64Credentials));
request.Headers.Add("signature", firstSignature.SignedSignature);
request.Headers.Add("timestamp", string.Format("{0}", firstSignature.Timestamp)); return GetResponse(request);
}
/// <summary>
/// Sets up the GetInvoice URL end-point, headers for the request and a particular CSN
/// </summary>
/// <param name="url">String that contains the GetInvoices end-point</param>
/// <param name="secondSignature">Class that contains a signed Access Token</param>
/// <param name="csn">String that contains CSN</param>
/// <returns>String with a JSON object</returns>
public static string GetInvoices(string url, SecondSignature secondSignature, string csn)
{
var request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET";
request.ContentType = "application/json";
request.Headers.Add("Authorization", secondSignature.Authorization); request.Headers.Add("CSN", csn);
request.Headers.Add("signature", secondSignature.SignedSignature);
request.Headers.Add("timestamp", string.Format("{0}", secondSignature.Timestamp)); return GetResponse(request);
}
/// <summary>
/// Gets a response from an Internet resource
/// </summary>
/// <param name="request">Requet data </param>
/// <returns>String with a JSON object</returns>
public static string GetResponse(HttpWebRequest request) {
try {
var response = (HttpWebResponse)request.GetResponse(); var enc = System.Text.Encoding.GetEncoding("utf-8");
var responseStream = new StreamReader(response.GetResponseStream(), enc); var result = string.Empty;
response.Close(); return result; } catch (Exception e) { Trace.WriteLine(e.Message); return string.Empty;
} }
/// <summary>
/// Calls Invoices Endpoint and retrieves a list of invoices
/// </summary>
/// <param name="firstSignature">Class that contains Partner's signed credentials</param>
/// <returns>Class with access token data</returns>
public static AccessToken CallOAuthEndPoint(FirstSignature firstSignature) {
var url =
"https://enterprise-api-dev.autodesk.com/v2/oauth/generateaccesstoken?grant_type=client_credentials";
var details = Utils.GetAccesToken(url, firstSignature);
var tokenDetails = JsonConvert.DeserializeObject<AccessToken>(details); return tokenDetails;
}
/// <summary>
/// Takes Partner's credentials and signs them
/// </summary>
/// <param name="credentials">Class with partner's credentials data</param>
/// <returns>class containing partner's signed credentials</returns>
public static FirstSignature GetFirstSignature(Credentials credentials) {
var credTemp = string.Format("{0}:{1}", credentials.ConsumerKey, credentials.ConsumerSecret);
var firstSignature = new FirstSignature
{
Base64Credentials = Base64Encode(credTemp), Timestamp = GetEpochTimestamp()
};
var message = string.Format("{0}{1}{2}", credentials.BasePath, credentials.ConsumerKey, firstSignature.Timestamp); firstSignature.SignedSignature = GenerateSignature(message, credentials.ConsumerSecret); return firstSignature; } /// <summary>
/// Takes Access Token and signs it
/// </summary>
/// <param name="token">Class with access token data</param>
/// <param name="credentials">Class with partner's credentials data</param>
public static SecondSignature GetSecondSignature(AccessToken token, Credentials
credentials) {
var secondSignature = new SecondSignature
{
Timestamp = GetEpochTimestamp(), CSN = credentials.CSN,
Authorization = string.Format("Bearer {0}", token.access_token) };
var message = string.Format("{0}{1}{2}", credentials.BasePath, token.access_token, secondSignature.Timestamp); secondSignature.SignedSignature = GenerateSignature(message, credentials.ConsumerSecret); return secondSignature; } /// <summary>
/// Encode string to base64
/// </summary>
/// <param name="plainText">String to be encoded</param>
/// <returns>Enconded string</returns>
public static string Base64Encode(string plainText) {
var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText); return System.Convert.ToBase64String(plainTextBytes);
}
/// <summary>
/// Decodes base64 string
/// </summary>
/// <param name="base64EncodedData">String to be decoded</param>
/// <returns>Decoded string</returns>
public static string Base64Decode(string base64EncodedData) {
var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData); return System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
}
/// <summary>
/// Gets Epoch Unix timestamp
/// </summary>
/// <returns>Epoch Unix timestamp</returns>
public static int GetEpochTimestamp() {
return (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; }
/// <summary>
/// Hashing of the signature using HMACSHA256
/// </summary>
/// <param name="message">String with the message to be hashed</param>
/// <param name="secret">String with the consumer secret</param>
/// <returns>Hashed string</returns>
{
var encoding = new System.Text.ASCIIEncoding(); byte[] keyByte = encoding.GetBytes(secret); byte[] messageBytes = encoding.GetBytes(message); using (var hmacsha256 = new HMACSHA256(keyByte)) {
byte[] hashmessage = hmacsha256.ComputeHash(messageBytes); return Convert.ToBase64String(hashmessage);
} }
/// <summary>
/// Prints a JSON object to a file
/// </summary>
/// <param name="json">String with a JSON Object</param>
public static void WriteJsonToFile(string json) {
using (System.IO.StreamWriter file =
new System.IO.StreamWriter(@"C:\temp\json.txt")) { file.WriteLine(json); } } } 5.1.3 POCO namespace MultipleInvoiceCallPoC { /// <summary>
/// Class used to store Access Token data
/// </summary>
public class AccessToken
{
public string access_token { get; set; } public string expires_in { get; set; } public string token_type { get; set; } }
}
namespace MultipleInvoiceCallPoC.POCOs {
/// <summary>
/// Class used to encapsulate the Partner's credentials data
/// </summary>
public class Credentials
{
public string BasePath { get; set; } public string CSN { get; set; }
public List<string> CSNs { get; set; } public string ConsumerKey { get; set; } public string ConsumerSecret { get; set; } }
}
namespace MultipleInvoiceCallPoC.POCOs {
/// <summary>
/// Class used to encapsulate the Partner's signed credentials
/// </summary>
public class FirstSignature
{
public string Base64Credentials { get; set; } public int Timestamp { get; set; }
public string SignedSignature { get; set; } }
}
namespace MultipleInvoiceCallPoC.POCOs {
/// <summary>
/// Class used to encapsulate a signed Access Token
/// </summary>
public class SecondSignature
{
public string SignedSignature { get; set; } public int Timestamp { get; set; }
public string Authorization { get; set; } public string CSN { get; set; }
} }
namespace MultipleInvoiceCallPoC.POCOs {
/// <summary>
/// Class that represents an Invoice
/// </summary>
public class Invoice
{
public string invoice_number { get; set; }
public string purchase_order_number { get; set; } public string sales_order_number { get; set; } public string bill_to_customer { get; set; } public string invoice_date { get; set; } public string transaction_type { get; set; } public string invoice_total_amount { get; set; } public string invoice_currency { get; set; }
public string account_doc_description { get; set; } public string customer_po_number { get; set; }
}
/// <summary>
/// Class used to contain Invoice data retreived from calling GetInvoices end-point
/// </summary>
public class InvoiceContainer
{
public string status { get; set; }
public Invoice[] message { get; set; } }
/// <summary>
/// Auxiliary class for display purposes used to contain Invoice data for a particular CSN
/// </summary>
public class ResponseContainer
{
public string CSN { get; set; }
public InvoiceContainer Response{get; set;} }
}
注: このサービス リファレンス マニュアルは、対象となる受信者が一人で使用するためのもので、権限を与え られているか、開示から保護されている可能性がある、所有権や機密情報が含まれている可能性があります。 無許可の確認、使用、開示または配布は禁止されています。