WechatTransferCrontabController.php 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. <?php
  2. /**
  3. * 微信商家转账到零钱-定时任务,修改对应状态
  4. */
  5. namespace console\controllers;
  6. use common\models\user\UserWithdrawLog;
  7. use yii\console\Controller;
  8. use yii\console\ExitCode;
  9. use common\models\wechat\WechatTransferLog;
  10. class WechatTransferCrontabController extends Controller
  11. {
  12. /**
  13. * 微信批次单号查询批次单
  14. * @desc 可设置10分钟查询一次
  15. * @return int
  16. */
  17. public function actionCheckTimer()
  18. {
  19. try {
  20. $list = WechatTransferLog::find()->where(['batch_status' => ['WAIT_PAY','ACCEPTED','PROCESSING','']])->limit(10)->all();
  21. $fail_reason = WechatTransferLog::FAIL_REASON;
  22. foreach($list as $val) {
  23. /** @var WechatTransferLog $val */
  24. $config = \Yii::$app->services->pay->getConfig($val->mall_id,'wechat');
  25. if(!$config){
  26. continue;
  27. }
  28. $config['app_id'] = '';
  29. $config['mini_program_app_id'] = $config['miniprogram_appid']??'';
  30. $batch_info = \Yii::$app->payment->wechat($config)->queryBatches($val);
  31. if($batch_info && !empty($batch_info['transfer_detail_list']) && $val->cash_id > 0){
  32. //如果批次状态等于 FINISHED , 且明细状态等于FAIL , 需要将提现设置为失败
  33. if($batch_info['transfer_batch']['batch_status'] == 'FINISHED' && $batch_info['transfer_detail_list'][0]['detail_status'] == 'FAIL'){
  34. $cash_id = $val->cash_id;
  35. $cash_info = UserWithdrawLog::findOne(['id' => $cash_id,'status'=> UserWithdrawLog::STATUS_ALREADY_TRANS]);
  36. if($cash_info){
  37. $transfer_detail = $val->transfer_detail;
  38. $transfer_detail = json_decode($transfer_detail,true);
  39. $cash_info->status = UserWithdrawLog::STATUS_AGREE;
  40. $cash_info->transfer = $fail_reason[$transfer_detail['fail_reason']] ?? $transfer_detail['fail_reason'];
  41. $content = $cash_info->content ? json_decode($cash_info->content,true) : [];
  42. $content['remit_content'] = $cash_info->transfer ;
  43. $cash_info->content = json_encode($content);
  44. if(!$cash_info->save()){
  45. \Yii::error('UserWithdrawLog status save'.$cash_info->getErrorMessage());
  46. }
  47. }
  48. }
  49. }
  50. }
  51. echo 'success';
  52. return ExitCode::OK;
  53. } catch (\Exception $e) {
  54. echo $e->getMessage();
  55. $this->stderr('Error: ' . ExitCode::getReason(ExitCode::UNSPECIFIED_ERROR));
  56. return ExitCode::UNSPECIFIED_ERROR;
  57. }
  58. }
  59. }