メインコンテンツへスキップ

Documentation Index

Fetch the complete documentation index at: https://docs.revize.app/llms.txt

Use this file to discover all available pages before exploring further.

公開キャンセルAPIを使うと、購入後メール、サポートページ、チャットボット、カスタムフォームなど、どこにでもセルフサービスの注文キャンセルを追加できます。アプリの埋め込みは不要です。

キャンセルAPIを使う理由

どこからでもキャンセル

メール、FAQページ、チャットボットフロー、ストア外のあらゆるカスタムインターフェースにキャンセルボタンを追加できます。

アプリ埋め込み不要

Revize顧客ポータルとは独立して動作します。APIエンドポイントを呼び出すだけです。

あなたのルールが適用

APIはキャンセル時間枠と適格性ルールを自動的に尊重します。

シンプルな統合

1つのエンドポイント、シンプルなリクエスト形式。あらゆるシステムやプラットフォームと簡単に統合できます。

APIエンドポイント

POST https://revize.untechnickle.com/api/public/v1/{shop-domain-slug}/cancel_order
パラメータ:
  • shop-domain-slug — Shopifyストアのドメインから.myshopify.comを除いた部分(例:my-store.myshopify.comの場合はmy-store

リクエスト形式

{
  "order_number": "#2667",
  "email": "customer@example.com"
}
フィールド必須説明
order_numberstringはい#記号を含む注文番号
emailstringはい注文に使用されたお客様のメールアドレス

レスポンスコード

APIは結果を示すstatusフィールドを返します。
Status説明
SUCCESS注文が正常にキャンセルされました
ORDER_NOT_FOUND注文が存在しないか、メールが一致しません
NOT_CANCELLABLE注文をキャンセルできません(ポリシー制限)
ORDER_FULFILLED注文はすでにフルフィルメント済みでキャンセルできません
NOT_EDITABLE注文の編集がロックされています
CANCEL_DISABLEDこのストアでキャンセル機能が有効になっていません
APP_INACTIVERevizeアプリがアクティブではありません
SHOP_NOT_FOUNDストアがシステム内で見つかりません
DOMAIN_MISSINGリクエストにストアドメインスラグがありません
FAILED一般的な操作の失敗

統合の例

APIを呼び出すJavaScriptの例です。
async function cancelOrder(orderNumber, email) {
  const shopDomain = 'your-store'; // Without .myshopify.com
  const apiUrl = 'https://revize.untechnickle.com';
  
  try {
    const response = await fetch(
      `${apiUrl}/api/public/v1/${shopDomain}/cancel_order`,
      {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
          'Accept': 'application/json'
        },
        body: JSON.stringify({
          order_number: orderNumber,
          email: email
        })
      }
    );
    
    const result = await response.json();
    
    if (result.success === true || result.status === 'SUCCESS') {
      console.log('Order cancelled successfully');
      return { success: true };
    } else {
      console.log('Cancellation failed:', result.status);
      return { success: false, status: result.status };
    }
  } catch (error) {
    console.error('Error:', error);
    return { success: false, status: 'FAILED' };
  }
}

Shopifyテーマセクション

Shopifyテーマの任意のページにキャンセルフォームを追加できます。すぐに使えるこのセクションは、すべてのAPI呼び出しを処理し、適切なメッセージを表示します。
order-cancellation-form.liquid
<div class="order-cancel-section">
  <div class="order-cancel-container">
    <div class="order-cancel-form">
      {% if section.settings.show_heading %}
        <h2>{{ section.settings.heading }}</h2>
      {% endif %}
      
      {% if section.settings.show_description %}
        <p class="form-description">{{ section.settings.description }}</p>
      {% endif %}
      
      <form id="cancelOrderForm">
        <div class="form-group">
          <label for="orderNumber">{{ section.settings.order_label }}</label>
          <input 
            type="text" 
            id="orderNumber" 
            name="orderNumber" 
            required
            placeholder="{{ section.settings.order_placeholder }}"
          >
          <small>{{ section.settings.order_help_text }}</small>
        </div>
        
        <div class="form-group">
          <label for="email">{{ section.settings.email_label }}</label>
          <input 
            type="email" 
            id="email" 
            name="email" 
            required
            placeholder="{{ section.settings.email_placeholder }}"
          >
        </div>
        
        <button type="submit" id="submitBtn">{{ section.settings.button_text }}</button>
        <div id="message"></div>
      </form>
    </div>
  </div>
</div>

<script>
document.getElementById('cancelOrderForm').addEventListener('submit', async (e) => {
  e.preventDefault();
  
  const submitBtn = document.getElementById('submitBtn');
  const messageDiv = document.getElementById('message');
  
  submitBtn.disabled = true;
  submitBtn.textContent = 'Processing...';
  messageDiv.textContent = '';
  messageDiv.className = '';
  
  const orderNumber = document.getElementById('orderNumber').value.trim();
  const email = document.getElementById('email').value.trim();
  
  const shopDomain = {{ shop.permanent_domain | json }};
  const domainSlug = shopDomain.replace('.myshopify.com', '');
  const apiUrl = {{ section.settings.api_url | json }};
  
  const statusMessages = {
    'SUCCESS': {{ section.settings.msg_success | json }},
    'ORDER_NOT_FOUND': {{ section.settings.msg_order_not_found | json }},
    'NOT_CANCELLABLE': {{ section.settings.msg_not_cancellable | json }},
    'ORDER_FULFILLED': {{ section.settings.msg_order_fulfilled | json }},
    'NOT_EDITABLE': {{ section.settings.msg_not_editable | json }},
    'CANCEL_DISABLED': {{ section.settings.msg_cancel_disabled | json }},
    'APP_INACTIVE': {{ section.settings.msg_app_inactive | json }},
    'FAILED': {{ section.settings.msg_failed | json }}
  };
  
  const buttonText = {{ section.settings.button_text | json }};
  
  try {
    const response = await fetch(`${apiUrl}/api/public/v1/${domainSlug}/cancel_order`, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Accept': 'application/json'
      },
      body: JSON.stringify({
        order_number: orderNumber,
        email: email
      })
    });
    
    const result = await response.json();
    
    if (result.success === true || result.status === 'SUCCESS') {
      messageDiv.className = 'success';
      messageDiv.textContent = statusMessages['SUCCESS'];
      document.getElementById('cancelOrderForm').reset();
    } else {
      messageDiv.className = 'error';
      messageDiv.textContent = statusMessages[result.status] || statusMessages['FAILED'];
    }
    
  } catch (error) {
    console.error('Error:', error);
    messageDiv.className = 'error';
    messageDiv.textContent = statusMessages['FAILED'];
  } finally {
    submitBtn.disabled = false;
    submitBtn.textContent = buttonText;
  }
});
</script>

<style>
.order-cancel-section {
  padding: {{ section.settings.section_padding_top }}px 0 {{ section.settings.section_padding_bottom }}px;
  background: {{ section.settings.background_color }};
}

.order-cancel-container {
  max-width: 1200px;
  margin: 0 auto;
  padding: 0 20px;
}

.order-cancel-form {
  max-width: {{ section.settings.form_width }}px;
  margin: 0 auto;
  padding: {{ section.settings.form_padding }}px;
  border: 1px solid {{ section.settings.border_color }};
  border-radius: {{ section.settings.border_radius }}px;
  background: {{ section.settings.form_background }};
}

.order-cancel-form h2 {
  margin-bottom: 10px;
  font-size: {{ section.settings.heading_size }}px;
  color: {{ section.settings.heading_color }};
  text-align: {{ section.settings.text_align }};
}

.order-cancel-form .form-description {
  margin-bottom: 24px;
  color: {{ section.settings.description_color }};
  text-align: {{ section.settings.text_align }};
}

.form-group {
  margin-bottom: 20px;
  text-align: left;
}

.form-group label {
  display: block;
  margin-bottom: 8px;
  font-weight: 600;
  font-size: 14px;
}

.form-group input {
  width: 100%;
  padding: 12px;
  border: 1px solid {{ section.settings.input_border_color }};
  border-radius: 4px;
  font-size: 14px;
  box-sizing: border-box;
}

.form-group small {
  display: block;
  margin-top: 4px;
  color: #666;
  font-size: 12px;
}

button {
  width: 100%;
  padding: 14px;
  background: {{ section.settings.button_background }};
  color: {{ section.settings.button_text_color }};
  border: none;
  border-radius: 4px;
  font-size: 16px;
  font-weight: 600;
  cursor: pointer;
}

button:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}

#message {
  margin-top: 20px;
  padding: 12px;
  border-radius: 4px;
  text-align: center;
}

#message.success {
  background: #d4edda;
  color: #155724;
}

#message.error {
  background: #f8d7da;
  color: #721c24;
}
</style>

{% schema %}
{
  "name": "Order Cancellation Form",
  "settings": [
    {
      "type": "text",
      "id": "api_url",
      "label": "API URL",
      "default": "https://revize.untechnickle.com"
    },
    {
      "type": "text",
      "id": "heading",
      "label": "Heading",
      "default": "Cancel Your Order"
    },
    {
      "type": "textarea",
      "id": "description",
      "label": "Description",
      "default": "Enter your order number and email to cancel your order"
    },
    {
      "type": "text",
      "id": "button_text",
      "label": "Button Text",
      "default": "Cancel Order"
    },
    {
      "type": "textarea",
      "id": "msg_success",
      "label": "Success Message",
      "default": "Your order has been cancelled successfully!"
    },
    {
      "type": "textarea",
      "id": "msg_order_not_found",
      "label": "Order Not Found",
      "default": "We couldn't find an order with that number and email."
    },
    {
      "type": "textarea",
      "id": "msg_not_cancellable",
      "label": "Not Cancellable",
      "default": "This order cannot be cancelled due to our cancellation policy."
    },
    {
      "type": "textarea",
      "id": "msg_order_fulfilled",
      "label": "Order Fulfilled",
      "default": "This order has already been fulfilled and cannot be cancelled."
    },
    {
      "type": "textarea",
      "id": "msg_failed",
      "label": "General Error",
      "default": "Unable to process your request. Please try again."
    }
  ],
  "presets": [{ "name": "Order Cancellation Form" }]
}
{% endschema %}

よくあるユースケース

FAQ/ヘルプページでのセルフサービスキャンセルサポートやFAQページにキャンセルフォームを追加し、お客様がサポートに連絡せずに注文をキャンセルできるようにします。
  • サポートチケットを削減
  • 24時間365日利用可能
  • 即時処理

セットアップ要件

公開キャンセルAPIは、当社チームによる有効化が必要な高度な機能です。
1

有効化のためにお問い合わせ

当社チームにご連絡いただき、ストアの公開キャンセルAPIを有効化します。
2

返金設定の構成

Payments & Refundsで返金方法(元の支払い方法またはストアクレジット)を設定します。
3

統合詳細の取得

ユースケースに必要なストアドメインスラグとカスタム設定を提供します。
4

下書き注文でテスト

本番運用前にテスト注文を作成して、APIが正しく動作することを確認します。
この機能はProプランで利用可能です。価格やセットアップサポートについてはお問い合わせください。

よくある質問

はい。APIは編集ウィンドウ設定、注文制限、返金ポリシーを自動的に適用します。編集ウィンドウ外の注文やブロックタグ付き注文はAPI経由でキャンセルできません。
返金はRevizeの支払い設定に従って、元の支払い方法またはストアクレジットとして処理されます。これは顧客ポータル経由のキャンセルと同じです。
もちろんです。APIは外部統合用に設計されています。チャットボット、メール配信サービス、カスタムアプリ、HTTPリクエストを行えるあらゆるシステムで利用できます。
APIはセキュリティのため、注文番号 + メールの確認を使用します。APIキーは不要で、統合がシンプルでありながら、注文の所有者だけがキャンセルできるようにします。
公開キャンセルAPIは、Revizeポータルを超えてセルフサービスキャンセルを拡張します。メール、サポートページ、チャットボットなど、お客様がいる場所で対応するために使用しましょう。

関連機能