GMOペイメントのAPIで3Dセキュア2.0を導入

2025年3月末までにECサイトへ3Dセキュア2.0の導入が義務付けられるらしいです。
カード決済の導入方式によっては、そこそこ工数のかかるシステム改修が必要です。
未対応のサイトがたくさん出てそうですね。

私のところにも3Dセキュア導入の見積依頼がいくつか来ました。
決済代行業者や導入方式によって実装方法は大きく変わってきますが、
ユーザー・ECサイト・決済代行業者・3DSサーバーの4者間の情報の流れはだいたい同じです。
なので、一度実装すると、二度目からは必要な作業を把握するのは早くなります。

直近で実装したのは、
GMOペイメントのAPIで実装されていたサブスクのシステムで、
新規申込み時に3Dセキュアを導入したいというものでした。

サブスクなので新規申込み時には決済はありません。
ユーザー登録とクレジットカード登録があるだけでした。

具体的には、

SaveMember.idPass(ユーザー登録)

SaveCard.idPass(カード登録)

で終わりです。

ここに3Dセキュア2.0を導入するためには、
決済処理の一種である「有効性チェック」を実行する必要があります。
有効性チェックは、実際に決済されるわけではなくカードの有効性チェックで使われます。
3Dセキュア認証では決済処理を伴わせる必要があるため、
カード登録時に3Dセキュア認証をさせるためにはこの有効性チェックを使用します。
(GMOペイメントの担当者もこの方法を指示してきました)

有効性チェック実行後、レスポンスとして3Dセキュアの認証URLが返ってくるのでリダイレクトします。
3Dセキュア認証後、コールバックで帰ってきたら「3Dセキュア2.0認証後決済実行」「ユーザー登録」「決済後カード登録」
という流れになります。

具体的には、

EntryTran.idPass(取引登録(有効性チェック))

ExecTran.idPass(決済実行(有効性チェック))

3Dセキュアのサーバへリダイレクト(3Dセキュア認証)

コールバックURLに戻ってくる

SecureTran2.idPass(3Dセキュア2.0認証後決済実行)

SaveMenber.idPass(ユーザー登録)

TradedCard.idPass(決済後カード登録)

【GoogleマップAPI】fitBounds実行時に特定の方向だけパディングする

GoogleマップのJavaScript APIを使ったマップツールの修正依頼が来ました。

Googleマップで複数のマーカーを設置した際に、
すべてのマーカーが表示されるように自動で表示領域や縮尺をいい感じに調整してくれる

というメソッドがあります。

第一引数にマーカーの座標を入れてやるだけ(説明は割愛)なので
とても簡単で重宝するメソッドなのですが、

とあるシステムで、マップに重なる形で左側にスライド式の開閉メニューがあり、
普通にfitBoundsを実行すると一部のマーカーがメニューで隠れてしまうという問題がありました。

マーカーがメニューに隠れないようにしてほしいというのが今回の依頼なのですが、これは簡単に対応できます。
fitBoundsの第2引数でパディングを指定するだけです。

たとえば左メニューの幅が400pxだった場合は

とするだけで左に400pxパディングした形でfitBoundsが実行されるので
マーカーがメニューに隠れることがなくなります。

今回のシステムではメニュー幅は固定で、メニューの開閉状態だけ考慮すればよかったのでさらに簡単でした。

TinyMCEをカスタマイズ

久しぶりにTinyMCEをカスタマイズする案件があり、以下のカスタマイズを行いました。

bタグがstrongに変換されないようにする

見出しの選択肢をカスタマイズする

※見出しをツールバーに出すのは「formatselect」

下線をstyleではなくuで追加する

Bとは別でstrongボタンを作る

(ツールバーに「strong」を追加)

設定はすべて

の中に書きます。

【phpSpreadsheet】PHPでExcelを読み込んだらグラフが消える

phpSpreadsheetを長らく使っていますが、
あるとき「読み込んだExcelのグラフをそのまま出力したい」
という要望がありました。

何も考えずにグラフも読み込めるだろうと
過去のシステムからphpSpreadsheet使用部分をコピペして持ってきたところ、
出力したExcelはグラフだけ消えてしまいました。

知っている人にとってはなんということはないのですが、
グラフ付きのExcelを読み込むときは、Readerに対して

という設定が必要だとわかりました。

また、出力時も同様に、Writerに対して

が必要でした。

この歳になってまたひとつ勉強になりました。

例)

【JavaScript】TinyMCEを組み込んだフォームの値の取得と設定

TinyMCEを組み込んだフォームの値をJavaScriptで取得したり設定したりするには
TinyMCEのメソッドを使用する必要があります。

フォームの値を取得する

フォームに値をセットする