Webpayでは定期課金のオブジェクト作成のタイミングで初回の課金が実行されます。
https://webpay.jp/docs/recursions
Recursionオブジェクトが作成されたタイミングで、初回の課金が試行されます。 成功、失敗にかかわらず、作成されたRecursionオブジェクトがレスポンスされます。 状態が「一時停止中(“suspended”)」になっているかで成功したかどうかを判断できます。 失敗した場合は次回以降の課金が行われませんので、定期課金の再開を参考に情報を修正してください。
とありますが失敗するケースとして
Chargeが作成されるケース(もちろん captured:false になります) 「このカードでは取引をする事が出来ません。利用出来ない理由をご契約中のカード会社へお問い合わせるか、他のカードをご利用ください。」
Chargeが作成されないケース 「このカードブランドのカードは利用できません。他のカードをご利用いただくか、サービス運営者にお問い合わせください」
の2パターンがあるようです。
定期課金作成時に実行される初回の課金失敗時のエラーはExceptionを吐くこともなく、Recursionオブジェクトのstatusの情報しかなく、Chargeが作成されないケースではfailure_messageも取れないため、何らかの方法が必要です。
クレジットカードが有効かどうかチェックするため、最初数百円などを課金するケースなどもあります。
他の方法としてはRecursionのstatusがsuspendedになったら、定期課金の再開をして意図的にExceptionを取得する、という方法もありますが、Chargeが作成されるケースでは失敗したChargeが複数できてしまいます。
タイミングに関してそこまで厳密さを求めないで良い場合には、定期課金作成時に、初回の課金開始のタイミングをX分後とかにすればよさそうです。
import jp.webpay.webpay.WebPay; WebPay webpay = new WebPay("your_key"); Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.MINUTE, 5); long paymentDate = calendar.getTime() / 1000L; webpay.recursion .createRequest() .customer("customerId") .amount(400) .currency("jpy") .period("month") .description("hoge") .firstScheduled(paymentDate).execute();
と思いましたが、Chargeが作成されないケースのカード番号では、Webpay側で定期課金が実行されてもChargeオブジェクトが生成されないみたいです・・・。
Charge一覧だけを取得して状況を確認すれば大丈夫かと思いましたがそうもいかないようです。。。
Recursionのsuspended一覧を取得してチェックする必要がありそうです・・・。Recursion、更新日時指定して取得できないのが辛いぞ・・・。