質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.92%

payjpAPIを使った定期決済の再開でサブスクリプションが無いと言われ処理が終了してしまう(cakephp3)

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 554
退会済みユーザー

退会済みユーザー

前提・実現したいこと

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://st.salon.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.5

php -v
PHP 7.2.11

mysql 
5.6.40-log 

ローカル

 bin/cake version
3.5.5

php -v
PHP 7.2.22

mysql 
5.7.26

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

Subscription::retrieve() のエラーが No such subscription ということは、PAY.jp側にその定期IDがないということです。
なので、まずはライブラリに設定しているAPIキーを確認して、意図するPAY.jpアカウントのAPIキーとなっているか確認してみましょう。

また、PAY.jpのPHPライブラリはリクエスト失敗時に \Payjp\Error\Base を継承した各種例外を発生させます。
PAY.jpライブラリ使用時は、該当部分をtry-catchで囲み、適切なエラーハンドリングを行うようにすべきです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • トップ
  • CakePHPに関する質問
  • payjpAPIを使った定期決済の再開でサブスクリプションが無いと言われ処理が終了してしまう(cakephp3)