スポンサーリンク/Sponsored Link

当店サイトのSquareオンライン決済をアップデート(2022/11)

受験料お支払いページサンプル
ニュースホームページ作成
スポンサーリンク/Sponsored Link

当店では、毎週土曜・日曜に資格試験を実施しています。

オンラインで申し込みが完結するシステムを、多くの方にご利用いただいております。当店としても、ほとんど手間がかからないこのシステムにずいぶん助けられています。

スポンサーリンク/Sponsored Link

手数料が安くて、入金が速い「Square」

当店が「Square」の決済を採用している理由はいくつかあります。

入金が速い

当日の決済分が、翌日には入金されます。「最短翌日」ですが、だいたい翌日には口座に入ってます。

このことにより、迅速な試験申し込みができ、皆様の試験申し込みも柔軟なスケジュールで受付できています。もちろん、店頭での決済も翌日に入金されますので、すぐに売上を手にすることができ、店舗の運営も楽です。

手数料が安く、固定費がかからない

店頭決済 3.25%、オンライン(API)決済3.6%の手数料は安いです。

いまは、多くの決済手段でこの手数料の水準になっていますが、導入当時は本当にSquareぐらいでした。

多様な請求方法に簡単に対応できる

店頭レジ決済、請求メールによる決済、LINEなど任意の手段でのでの請求書リンク送付、対面ブラウザ決済、そしてオンラインのAPI決済と、ひとつのマーチャントアカウントで多彩な支払方法に簡単に対応できます。追加料金もかかりません。

特に、本記事ではAPI決済を扱うわけですが、これが大きな理由でした。自分で実装しないといけませんが、クレジットカード決済を自動化でき、利便性は大幅に上がりました。

当店からの紹介リンクを掲載します

もしも、Squareを新規に利用しようと思われましたら、こちらのリンクからお申込みいただくと、当店からの紹介扱いとなり、手数料が10万円分無料になります。

スポンサーリンク/Sponsored Link

当初実装したSqPaymentFormが廃止されたため、アップデートが必要に

当店の試験受付システムは、完全オリジナルのシステムになっています。PHPで作成しています。

429 Too Many Requests

当初は支払い機能は無かったのですが、2019年に思い切って支払い自動化を導入しました。

その際の導入記事がこちらになります。

このときは、「SqPaymentForm」という仕組みを使って決済を行っていました。

こんな感じのフォームを作れるAPIです。カード情報入力欄は、Squareからのiframeになっており、当店サーバを通さず直接Squareに情報が渡るようになっていました。

受験料お支払いページ
(クレジットカード)

下記の内容で、受験料の決済を行います。 ご確認の上、カード情報を入力し、一番下の支払いボタンを押して決済してください。

お支払いの詳細

受験希望日
2019/08/31 18:00~
受験科目1
MOS2016 Word スペシャリスト(¥100)
受験科目2
MOS2016 Excel スペシャリスト(¥100)
決済合計金額 ¥200
※カード情報は、決済サービス「Square」のサーバーに直接送信されます。
当教室にはSquareより、決済の確認のためカード番号の下4桁、カード種別、有効期限、郵便番号のみが提供されます。

クレジットカード番号
有効期限
セキュリティコード
郵便番号
ボタン ¥200を支払う
(金額はテスト用のため少額になっています。実際の受験料とは異なります)

ところが、この方法が2022年10月末をもって廃止されてしまったのです。

Web Payments SDK
Learn about the Square Web Payments SDK for taking payments in a web client.

「Web Payments SDKに移行してください」とあり、サンプルを見ると、SqPaymentFormとほぼ同様の動作ができるようだ、と思って見ていたのですが

クイックスタートサンプルは、どうも、Node.jsを使ってサーバを立てるようになっている模様で、Node.js公式非対応の当店サーバでは、うまく実装できないのではないか、という危惧が。

じっくりやればできるのかもしれませんけど、すみやかに新しい実装を済ませないと、試験のお申込みに支障があります。

結局、ちがう方法を採用することにしました。

スポンサーリンク/Sponsored Link

「CheckOut API-Create Payment Link」を使った決済を実装することに

「Create Payment Link」は、APIで支払い用のURLの払い出しを受け、そのURLに飛ぶことでSquareがホストする支払いページを表示し、支払いを受け取る方法です。

Square Order Checkout
Learn how to create a checkout for a Square order.

URLの払い出しを受けることができれば、あとはSquareにおまかせできるので、比較的実装は楽ではないかと思われました。

こんな感じの支払い画面になります。

受験料の支払い画面サンプル Square Order Checkout API Create Payment Link
受験料200円はテスト用です。実際の金額とは異なります。

試験申し込みを続けながらの実装なので、スピードが求められましたが、はて、どうしたものか…

と、考えていると、Squareが「API Explorer」とっても気の利いたツールを用意してくれていることが分かりました。

Square PHP SDKをインストール

当店の場合は、もともとSDKは入っているのですが、初めて実装される場合はインストールが必要です。

Set up your SDK for a PHP Project
An introduction to setting up a Square PHP SDK project.

サーバにSSH接続し、

composer require square/square

としてインストールします。

「API Explorer」を使って簡単にコードを生成

Square Developer Portalに、「API Explorer」というツールがあることがわかりました。

API Explorer Overview
Learn about API Explorer features and how to use API Explorer to test Square APIs.

実際のツール画面はこちらです。

Square API Explorer
  • API名とエンドポイントを選択すると、コードを自動生成
  • サンドボックス/本番環境を簡単に切替え
  • ツール内でログインすると、自店舗のアクセストークンやロケーションIDを自動取得
  • 使用する項目をツール内で入力していくと、コードが自動的に生成され、コピペで実装できる
  • ツール内でコードを実行でき、レスポンスを確認できる

という便利なもので、今回はこれで8割がた解決しました。

CheckOut API- Create Payment linkを指定し、仮の商品名などを入力していくと、コードが生成されました。これを、古いsqPaymentFormがあったモジュールに入れ込んでいきました。

決済クライアント初期化部分は、SDKのページから

自動生成されるコードは、先頭に必要なクライアント初期化部分が省略されています。

PHP SDKの次のページにあるサンプルを使用しました。

Using the Square PHP SDK
An introduction to using the Square PHP SDK features.
use Square\SquareClient;
use Square\Environment;

$client = new SquareClient([
  'accessToken' => getenv('SQUARE_ACCESS_TOKEN'),
  'environment' => Environment::SANDBOX,  
    ※本番環境の場合は Environment::PRODUCTION
]);

レスポンスから決済URLを抽出する部分は何とか自作

Create Payment Linkエンドポイントからは、レスポンスの形で決済URLが払い出されるわけですが、これを抽出して実際にそのURLに遷移する部分のサンプルコードがどうしても見つかりません。

まあなんとかなるよね…と、これはしょうがないので自作しました。たいしたコードではないんですが、レスポンスオブジェクトの要素名がなんかちょっと載ってるのが違ってて、数時間悩みました。

スポンサーリンク/Sponsored Link

完成したコード

というわけで、現在はぶじ実運用を行っております。

実際に作ったコードはこのようなものになりました。同様の実装を検討される方のご参考となれば幸いです。

 <?php

[当店試験受付システムの、予約コードを取得する部分]

// Autoload SDK package for composer based installations
require_once('vendor/autoload.php');

[予約済みの試験情報DBから、各種情報を読み出す部分]

# setup authorization

use Square\SquareClient;
use Square\Environment;
use Square\Exceptions\ApiException;

$client = new SquareClient([
    'accessToken' => getenv('SQUARE_ACCESS_TOKEN'),
[環境変数 SQUARE_ACCESS_TOKENにアクセストークンを設定済]
    'environment' => Environment::PRODUCTION,
]);


/* Square Create Payment Link API*/
$base_price_money = new \Square\Models\Money();
$base_price_money->setAmount([申し込み試験(1)の受験料]);
$base_price_money->setCurrency('JPY');

$order_line_item = new \Square\Models\OrderLineItem('1');
$order_line_item->setName([申し込み試験(1)の試験名]);
$order_line_item->setItemType('ITEM');
$order_line_item->setBasePriceMoney($base_price_money);

if([申し込み試験(2)の試験名]):
  $base_price_money1 = new \Square\Models\Money();
  $base_price_money1->setAmount([申し込み試験(2)の受験料]);
  $base_price_money1->setCurrency('JPY');

  $order_line_item1 = new \Square\Models\OrderLineItem('1');
  $order_line_item1->setName([申し込み試験(2)の試験名]);
  $order_line_item1->setBasePriceMoney($base_price_money1);
  $line_items = [$order_line_item, $order_line_item1];
else:
  $line_items = [$order_line_item];
endif;
$order = new \Square\Models\Order([当店Location ID]);
$order->setLineItems($line_items);

$accepted_payment_methods = new \Square\Models\AcceptedPaymentMethods();
$accepted_payment_methods->setApplePay(true);
$accepted_payment_methods->setGooglePay(true);

$checkout_options = new \Square\Models\CheckoutOptions();
$checkout_options->setRedirectUrl([当該試験の支払い完了処理を行うURL]);
$checkout_options->setMerchantSupportEmail('info@curio-shiki.com');
$checkout_options->setAskForShippingAddress(false);

$body = new \Square\Models\CreatePaymentLinkRequest();
$body->setIdempotencyKey(uniqid());
    ※ここでは、IdempotencyKeyは、一意でさえあれば何でも良いので、uniqid()で、ランダムなユニークIDを生成しています。必要があれば、任意のKeyを他の方法で生成しても良い)
$body->setDescription('受験料のお支払い');
$body->setOrder($order);
$body->setCheckoutOptions($checkout_options);
$body->setPaymentNote([当該試験を管理画面で特定できるコード]);

$api_response = $client->getCheckoutApi()->createPaymentLink($body);

if ($api_response->isSuccess()) {
    $result = json_decode(json_encode($api_response->getResult()), true);
} else {
    $errors = $api_response->getErrors();
}

if ($errors):
  header("Location:[支払いエラーでキャンセルになりましたと通知するURL]");
else:
  sleep(1);
  ※即時に遷移すると、決済URLの生成が間に合わず404になることがあったため、1秒待機
  header("Location:{$result["payment_link"]["url"]}");
endif;
?>

まんなかの大事な部分は、API Explorerで生成されたものをコピペし、試験名・受験料などの要素を、当店システムの変数に置き換えただけです。非常に簡単で助かりました。

パソコン教室・キュリオステーション志木店からのお知らせ
レッスンはオンラインで受講できます

パソコン教室・キュリオステーション志木店では、オンラインでの在宅レッスンを実施しております。
教室の全コースがオンラインで受講可能。実際にインストラクターがご対応いたします。
1時間の無料体験レッスンはいつでも予約できます。詳しくは公式ページをご覧ください。

キュリオステーション志木店運営をフォローする
スポンサーリンク/Sponsored Link

コメント

  1. 西村三保 より:

    はじままして。
    レンタカーの予約サイトのクレジット決済にSquareを利用しようとしています。(SDK使用)
    お客様がサイトでクレジット決済⇒仮売上。
    その後実際にレンタカーを借りた段階で、お店側が操作して実売上にする。
    といったことがSquareのAPIで出来ますか?
    Squareにも問合せているのですが、なかなか返信がなく、
    藁をもすがる気持ちで質問させていただきました。
    よろしくお願いします。

    • コメントありがとうございます。うちは 実はその辺り 必要がないため 詳しく見てないので、回答お時間いただくかもしれません 申し訳ありません。
      一般的に言いますと、多くの 決済API に、支払いの予約、reserveの機能はあって、これはオーソリまでかかると思います。それを 本決済captureにするには、reserve時の取引idを使って別のapiを叩く事ができるはずと思います。ですから 、リザーブ時に取引 ID をデータベースにとっておいて、レンタル 成立時に店側の管理画面からキャプチャーを叩く イメージ かなと思います。以上はあくまで 一般的な推測で、うちも見てみますが、スクエアの API マニュアルでこんな機能 あったら使えるんじゃないかなと思ってます。

    • Square APIマニュアルを参照しまして、追加のご返信です。
      手順としては
      1.Web Payments SDKでカード入力受付、トークンを発行
      https://developer.squareup.com/docs/web-payments/take-card-payment
      2.そのトークンを使って支払いを作成、支払IDを発行
      https://developer.squareup.com/reference/square/payments-api/create-payment
      3.そのIDを使って支払いを完了
      https://developer.squareup.com/reference/square/payments-api/complete-payment

      2.~3.  全体の流れの説明
      https://developer.squareup.com/docs/payments-api/take-payments/card-payments/delayed-capture

      1.のトークン取得のところが、Node.jsを使うため、サーバを選びます。

    • 西村三保 より:

      ご返信ありがとうございます。
      Squareから回答がやってきました。
      『お客様が決済時にカード情報を入力しますが、実際に課金されるタイミングとしては、お客様がサービスを利用したタイミングとすることをご希望とのことでしょうか。
      その場合、現時点では、事前にクレジットカードの有効性の確認をおこなったり事前に承認枠を確保し、一時的に保留するプレオーソリゼーションの機能はございません。』
      だそうです。色々調べて頂いてすみません。
      他の決済APIを探します。
      本当にありがとうございました。

    • 情報ありがとうございます。そうなんですね!delayとあるので、時間差での決済可能と呼びましたが、注文から発送の間ぐらいの話なんでしょうかね。がっかりです…

  2. 辻本将仁 より:

    ご返信いただきありがとうございます。
    申し訳ございません、最新の情報じゃなかったのかもしれません。
    一度私の方でも試してみます。
    お手数おかけしましたありがとうございました。

  3. 辻本将仁 より:

    上記の件で質問させていただきたく、CheckOut API-Create Payment Linkについて
    吐き出されたURLリンクの先の画面は日本語表記なのでしょうか
    マニュアルには英語した対応してないt記載があり、こちらは特別なカスタマイズをされているのでしょうか

    • コメントありがとうございます。ちゃんと日本語になっていました。特に変わった設定はしていません。当店スクエアアカウントの設定なのか、開いた方のブラウザの言語設定なのかわかりませんが、今のところトラブルは起きていません。

    • 辻本将仁 より:

      ご返信いただきありがとうございます。
      英語の件が最新の情報じゃなかったのかもしれません。
      一度私の方でも試させていただきます。
      お手数おかけしてしまい申し訳ございません
      ありがとうございました。

    • 確認遅れまして申し訳ありません。はい、お試しください。
      記憶によると、サンドボックスでテストした時は、英語表記の請求書が表示されたと思います。
      しかし、特にそれを変えられる設定があるようにも思えなかったので、そのまま本番環境に反映してテストしたら、日本語が出たように思います。

タイトルとURLをコピーしました