WooCommerceで悩んだお話
最近は誰でもECサイトを運用することができて様々なサイトがあふれかえっています。
専用のASPを使うのが手っ取り早いのですが、カスタマイズが難しい+手数料が厳しいということもあってWordPressで頑張る方も多いと思います。
WordPressでECサイト制作の代表的なプラグインが「WooCommerce」です。
日本語のドキュメントが少ないと感じるのですが世界的に使われているようです。
数年前にWooCommerceでECサイトを作成した人が退職してしまったということで保守を頼まれたのですがバグだらけでなかなか大変でした。
決済のバグ
決済種別は銀行振込、代引き、クレジットカードの3つでした。
クレジットカードはGMO PGと契約しており下記のプラグインで連携されていました。
初回購入時に入力されたカード情報がGMOに登録されてユーザIDと紐づけされます。
サイト側ではカード情報を全ては持っておらずカードNoをGMOに送信します。
ここで問題が。。。
カード決済エラーになる事象が頻繁に発生しました。
プラグインのアップデート等が影響していそうな感じですが調べてみると下記のような状態になっていました。
ユーザAさん
GMO側
カードNo1 カード下4桁0001 VISA
カードNo2 カード下4桁0002 JCB
サイト側
カードNo1 カード下4桁0002 JCB
GMO側で保持している0001のカードは解約されているため決済エラーが発生していました。
さらに調べてみるとユーザ側でカードの登録・削除ができるためサイト側で保持するカードNoにズレが発生しているようでした。
本来であれば下記のようになるべき。
サイト側
カードNo1 カード下4桁0001 VISA
カードNo2 カード下4桁0002 JCB
No2をGMOに送信
しかしカード情報を削除することができるため、No1を消したあとに新規登録すると同じNo1で登録されてしまうため不可思議な状況になってしまいました。
GMO側でNo1を削除することは可能なんですがNo2をNo1にすることはできないそうで。。。
このままでは永遠に決済できないのでプラグインをいじることにしました。
下記ファイルですがバージョン違いがあるかもです。
plugins/wc4jp-gmo-pg/includes/gateways/gmopg/class-wc-gateway-addon-gmopg-cc.php
ソース166行目ぐらい
$send_data['SeqMode'] = 1; $send_data['Method'] = 1; foreach($card_list['CardSeq'] as $key => $value){ if ($value === end($card_list['CardSeq'])) { $end_card_seq = $value; } if($card_list['DefaultFlag'][$key] == 1)$send_data['CardSeq'] = $value; } if(empty($send_data['CardSeq']) && isset($end_card_seq)){ $send_data['CardSeq'] = $end_card_seq; } //下記追加 if($user_id==1){ $send_data['CardSeq'] = 2; }
非常に不細工&力技ですがこれでなんとかなりそうでした。
果たしてこの仕様が修正される日はくるのでしょうか。。。
コメント