前提・実現したいこと
Payjp APIを使った決済システムの変更をしています
やりたいことは、今まで周期処理で全ユーザーを対象にして実施していた「未納金の回収」と「定期決済の復活処理」を、各ユーザーがカード変更したタイミングで一緒にできるようにしたいです
ローカルの動作確認では、カード変更したら未納金の回収処理と定期決済の再開処理の部分までちゃんと処理が流れたのですが、ステージ環境へUPしたとき下記のエラーがでてロールバックが起こり、カード変更もできませんでした
発生している問題・エラーメッセージ
2019-09-19 17:10:14 Error: error 01: No such subscription: sub_xxxxxxx 2019-09-19 17:10:14 Warning: Headers already sent in /var/www/app/vendor/cakephp/cakephp/src/Error/Debugger.php:850 2019-09-19 17:10:14 Error: [TypeError] Argument 1 passed to Cake\Utility\Hash::combine() must be of the type array, null given, called in /var/www/app/src/Template/Payments/test-group/change_card.ctp on line 22 in /var/www/app/vendor/cakephp/cakephp/src/Utility/Hash.php on line 453 Request URL: /payments/change_card/test-group Referer URL: https://example.jp/payments/change_card/test-group Client IP: 172.31.6.165 Stack Trace: #0 /var/www/app/src/Template/Payments/test-group/change_card.ctp(22): Cake\Utility\Hash::combine(NULL, '{n}.payjp_plan_...', '{n}.payjp_plan_...') #1 /var/www/app/vendor/cakephp/cakephp/src/View/View.php(1196): include('/var/www/app...') #2 /var/www/app/vendor/cakephp/cakephp/src/View/View.php(1157): Cake\View\View->_evaluate('/var/www/app...', Array) #3 /var/www/app/vendor/cakephp/cakephp/src/View/View.php(765): Cake\View\View->_render('/var/www/app...') #4 /var/www/app/vendor/cakephp/cakephp/src/Controller/Controller.php(623): Cake\View\View->render('test-group...', NULL)
該当のソースコード
$subscriptions = $this->Subscriptions->find() ->where([ 'user_id' => $user_id ]) ->all(); $resume_status = []; foreach ($subscriptions as $subscription) { //テストグループ取得 $gloup = $this->gloups->find() ->where(['id' => $subscription->gloup_id]) ->first(); $sub = \Payjp\Subscription::retrieve($subscription->payjp_subscription_id); $sub = json_decode($sub, true); if(isset($sub['error'])){ $resume_status[] = $gloup->title . 'はエラーが発生したため、定期決済の再開に失敗しました。'; continue; }else{ //状況が一時停止なら、定期購入を再開 if ($sub['status'] === 'paused') { $resume = $sub->resume(); //定期購入が再開できなかったものがあれば、警告を返す $resume_array = json_decode( $resume ) ; if(!empty($resume_array['error'])){ $resume_status[] = $gloup->title . 'はエラーが発生したため、定期決済の再開に失敗しました。'; continue; }elseif($resume_array->status == 'active'){ $resume_status[] = $gloup->title . 'の定期決済は再開しました。'; }/*resume_array->error*/ }/*$sub['status'] === 'paused'*/ }/*$sub->error*/ }/*foreach*/
試したこと
以下のコードを挿入しました
もともとここでエラーコードが返って来た場合の処理を入れていなかったので、追加しました
ですが、ローカルのテストでうまくいったもののステージ環境にあげると同じエラーがでて、動作も変わりませんでした
$sub = \Payjp\Subscription::retrieve($subscription->payjp_subscription_id); $sub = json_decode($sub, true); if(isset($sub['error'])){
このほかには、ステージで止められているバッチ処理を手動で動かしてみました
こちらに関しても変化なしです
ここで処理が止まっているというのは
$sub = \Payjp\Subscription::retrieve($subscription->payjp_subscription_id);
テキストをログに書き込むコードを挿入し、これより前は出力されていたけど、これ以降のコードは出力できていなかったからという理由で判断しました
また、ステージのコントローラーで変更を反映できていないのかとも考えたのですが差分を比較してもローカルと同じでした
ちょっと問題の切り分けすらうまくできていない状態なので、ここでこうなれば〜〜はNGというような調査法だけでもいただけたらありがたいです
補足情報(FW/ツールのバージョンなど)
リモート
$ bin/cake version
3.5.5php -v
PHP 7.2.11mysql
5.6.40-log
ローカル
bin/cake version
3.5.5php -v
PHP 7.2.22mysql
5.7.26
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。