この前、タイにあるPaysbuyと言うペイメントゲートウェイ(クレジットカードなどの決済システム)をECサイトに導入したのですが決済後、購入された分の在庫数が減らないと言う現象がありましたので対処方法をご紹介します。
ECサイトの構築にはワードプレスのプラグインでWoocommerceと言う物を使用しました。ワードプレスを使用した理由としては、色んなサイトで使用され、それを触れるエンジニアが増えていて、安いコストで短期間の実装でお買い物サイトの構築が可能な為です。色んな機能を追加したい場合はプラグインと言う物のインストールが必要ですが、それに対して掛かる費用は気になる物ではございません。
今回のECサイトは販売先がタイ国内のみとの事でしたので、タイ産であるPaysbuyを決済に使用する事にしました。通常では銀行振込み、小切手、Paypal等々の決済が導入できるのですが、どの決済方法でも顧客がサイトより商品を注文した後、その注文は「On-Hold」と言う状態になり、その時に注文分の在庫数が減るようになっております。具体的には、、、
On-Holdで注文内容を確認し、Processingで商品配送手配をし、Completedが商品配送後で他何も無い場合の状態になります。ステータスの使い方は業者さんによって異なると思いますが大体こんな形です。
さて通常の動作であれば「On-Hold」時に在庫数が減るのですが、Paysbuyではそれがされなかったのでその原因を調査しました。一つ考えられたのはペイメントゲートウェイ(決済システム)を使用した場合、通常ECサイトとは別の決済専用サイトに移動します。決済後は元のECサイトに戻るのですが、可能性としてはこの元のECサイトに戻るタイミングで決済内容のデータ通信が上手く行われていないと想定しましたが、通信内容を解析しても特に気になるような点は見つかりませんでした。次に考えられるのはプログラム上の具体的な処理で何かが起きている事でした。他の決済方法のプログラムとPaysbuyを比較した時に面白い事に気が付きました。他の決済方法には在庫数を減らすコードがありますが、Paysbuyのコードにはそれが含まれていませんでした。
ここでPaysbuyの導入方法につきまして簡単に説明しますと、ワードプレスではプラグイン(拡張機能)のインストールができましてPaysbuy等の決済システムにもワードプレス用のプラグインがあります。そのプラグインをシステム会社のサイトからダウンロードしインストールする形になります。(現在はgithubで管理されている見たいです。https://github.com/paysbuy)著者の予想では「On-Hold」の仕様を理解されなく開発されたのかも知れません。
下記が三つのコードを比較した結果になります。
決済方法:小切手
ファイル:wp-content/plugins/woocommerce/includes/gateways/cheque/class-wc-gateway-cheque.php
1 2 3 4 5 6 7 8 9 10 11 |
public function process_payment( $order_id ) { $order = wc_get_order( $order_id ); // Mark as on-hold (we're awaiting the cheque) $order->update_status( 'on-hold', _x( 'Awaiting check payment', 'Check payment method', 'woocommerce' ) ); // Reduce stock levels $order->reduce_order_stock(); .... |
決済方法:Paypal
ファイル:wp-content/plugins/woocommerce/includes/gateways/paypal/includes/class-wc-gateway-paypal-response.php
1 2 3 4 5 |
protected function payment_on_hold( $order, $reason = '' ) { $order->update_status( 'on-hold', $reason ); $order->reduce_order_stock(); WC()->cart->empty_cart(); } |
上記二つはWoocommerceに通常導入されている決済方法ですが、両方ともコード内に「$order->reduce_order_stock();」と言うコードが実装されています。関数名を見るだけで在庫数を減らす処理だと解ります。それでは、Paysbuyを確認しましょう。
決済方法:Paysbuy
ファイル:wp-content/plugins/woocommerce-paysbuy-payment-gateway/wc_paysbuy_payment_gateway.php
1 2 3 4 5 6 7 8 9 10 11 12 13 |
if($result == '00'){ $order->payment_complete(); $woocommerce->cart->empty_cart(); } else if ($result == '99'){ $order->update_status('failed', __('Payment Failed', 'woothemes')); $woocommerce->cart->empty_cart(); } else if ($result == '02'){ $order->update_status('on-hold', __('Awaiting Counter Service payment', 'woothemes')); $woocommerce->cart->empty_cart(); } .... |
コードを見ると他の二つに比べて「$order->reduce_order_stock();」と言う処理が見当たりません。ですので単純に注文が「On-Hold」状態にされる時に在庫を減らす処理を入れれば良い事です。
1 2 3 4 5 6 |
else if ($result == '02'){ $order->update_status('on-hold', __('Awaiting Counter Service payment', 'woothemes')); // Reduce stock levels $order->reduce_order_stock(); $woocommerce->cart->empty_cart(); } |
これでPaysbuyで決済すると注文分の在庫が減るようになりました。
めでたしなのですが、Paysbuyのプラグインはgithubで公開されている為、現状の事は開発者に伝えておこうと思います。
**追記**
開発者に問い合わせた所、前任者がそこの仕様に築いていなかったとの事です。逆に修正を頼まれました。詳細はこちらです。