🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

1037閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2019/09/20 03:23

前提・実現したいこと

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.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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

投稿2019/09/20 06:00

nojimage

総合スコア959

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問