2021/04/03
TaxJar API連携
アメリカの消費税は、日本のように国で一律税率ではなく、州の税率と郡市の税率で構成され、更には市などでの税率も異なります。
また、商品により減免措置がある場合もあります。ですから、開発の際、自ら計算プログラムを書くことが難しいです。
開発をより効率的に進むため、サードパーティーapiを使うのがよくあります。
TaxJar オフィシャルサイト:https://www.taxjar.com/
TaxJar for Developers: https://developers.taxjar.com/api/reference/
1.事前準備
TaxJarのAPIを連携するため、まずアカウントを作らなければいけないです。
アカウントを作った後、マイページでlicence key(token)を生成します。
Live Tokenは生産環境用、Sandbox Tokenは開発環境用です。
2.api連携
Springboot + Mavenを使用しているため、まずpom.xmlでdependencyを定義します。
そして、apiTokenを配置ファイルに入れます。
1 2 | taxjar: apiToken: xxxxxxxxxxxxxxxxxxxx |
3.税率計算
今回使用しているのはアドレスと商品を使用して税率を計算する方法です。
TaxCalculationUtilクラスを作ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | public class TaxCalculationUtil { protected static String apiToken = ""; @Value("${taxjar.apiToken}") private String token; @PostConstruct public void getApiToken() { apiToken = token; } public static TaxResponse taxForOrder(OrderAddress address, List<OrderItem> itemList) throws TaxjarException { Taxjar client = new Taxjar(apiToken); BigDecimal amount = BigDecimal.ZERO; // fromアドレス Map<String, Object> params = new HashMap<>(); params.put("from_country", "US"); params.put("from_zip", "94538"); params.put("from_state", "CA"); params.put("from_city", "Fremont"); params.put("from_street", "46724 Lakeview Blvd"); // toアドレス params.put("to_country", address.getCountry()); params.put("to_state", address.getState()); params.put("to_city", address.getCity()); params.put("to_street", address.getStreet()); params.put("to_zip", address.getZipcode()); params.put("shipping", address.getShipping()); // 商品情報 List<Map> lineItems = new ArrayList(); for (OrderItem item : itemList) { Map<String, Object> lineItem = new HashMap<>(); lineItem.put("id", item.getId()); lineItem.put("quantity", item.getQuantity()); lineItem.put("product_tax_code", item.PRODUCT_TAX_CODE); // 商品総額を計算 BigDecimal itemTotal = item.getPrice().multiply(BigDecimal.valueOf(item.getQuantity())); amount = amount.add(itemTotal); lineItem.put("unit_price", item.getPrice()); lineItems.add(lineItem); } params.put("amount", amount); params.put("line_items", lineItems); TaxResponse result = client.taxForOrder(params); return result; } } |
また、割引、商品の種類なども税率に影響があるが、必須ではないため、必要がある場合、追加します。
4.戻り値
戻り値の形はJSONであり、必要がある値を取ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | { "amount_to_collect": 1.71, "breakdown": { "city_tax_collectable": 1.31, "city_tax_rate": 0.04375, "city_taxable_amount": 29.95, "combined_tax_rate": 0.05711, "county_tax_collectable": 0, "county_tax_rate": 0, "county_taxable_amount": 0, "line_items": [ { "city_amount": 0.87, "city_tax_rate": 0.04375, "city_taxable_amount": 19.95, "combined_tax_rate": 0.04375, "county_amount": 0, "county_tax_rate": 0, "county_taxable_amount": 0, "id": "1", "special_district_amount": 0, "special_district_taxable_amount": 0, "special_tax_rate": 0, "state_amount": 0, "state_sales_tax_rate": 0, "state_taxable_amount": 0, "tax_collectable": 0.87, "taxable_amount": 19.95 } ], ... "order_total_amount": 29.95, "rate": 0.05711, "shipping": 10, "tax_source": "destination", "taxable_amount": 29.95 } |
サードパーティーAPIに連携する際、正しい値を渡したら、正確な結果を戻リます。
Author Profile
スターフィールド編集部
SHARE