NotifyController.php 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <?php
  2. namespace App\Http\Controllers\Api\v1;
  3. use App\Http\Controllers\Api\webApp;
  4. use App\Services\PaymentService;
  5. use App\Services\RedisService;
  6. /**
  7. * 回调处理
  8. * Class NotifyController
  9. * @package App\Http\Controllers\Api
  10. */
  11. class NotifyController extends webApp
  12. {
  13. /**
  14. * 支付回调
  15. * @param string $scene 场景,deposit-保证金,depositRefund-保证金退款,withdraw-收入提现
  16. * @param int $payType 支付方式:10-微信,20-支付宝
  17. * @return array|false|\Psr\Http\Message\ResponseInterface
  18. */
  19. public function callback($scene, $payType = 10)
  20. {
  21. $date = date('Y-m-d H:i:s');
  22. $result = request()->post();
  23. $key = date('YmdHis') . '_' . rand(1000, 9999);
  24. $channel = $payType == 10? 'wechat':'alipay';
  25. if (empty($result)) {
  26. $result = file_get_contents('php://input');
  27. $result = $result ? json_decode($result, true) : [];
  28. }
  29. try {
  30. RedisService::set("caches:payments:notify_{$scene}:result_".date('YmdHis').rand(10,99), ['all' => request()->all(), 'scene' => $scene, 'payType' => $payType, 'result' => $result], 7200);
  31. $pay = PaymentService::make()->createPay($scene, $payType);
  32. if (empty($pay) || empty($scene) || empty($payType)) {
  33. if (env('APP_DEBUG')) {
  34. logger()->channel($channel)->error("【{$date} 支付回调】参数错误:" . json_encode(['scene' => $scene, 'payType' => $payType, 'data' => $result], 256));
  35. }
  36. RedisService::set("caches:payments:notify_{$scene}:error_" . $key, ['all' => request()->all(), 'scene' => $scene, 'payType' => $payType, 'result' => $result], 7200);
  37. return response('failed');
  38. }
  39. // 验签和重组参数
  40. $data = $pay->callback();
  41. RedisService::set("caches:payments:notify_{$scene}:data_" . $key, ['all' => request()->all(), 'scene' => $scene,'data'=>$data, 'payType' => $payType, 'result' => $result], 7200);
  42. if (env('APP_DEBUG')) {
  43. logger()->channel($channel)->info("【{$date} 支付回调】验证结果:" . json_encode(['data' => $data,'scene'=>$scene,'payType'=>$payType],256));
  44. }
  45. // 回调处理
  46. if (PaymentService::make()->catchNotify($scene, $payType, $data)) {
  47. RedisService::set("caches:payments:notify_{$scene}:success_" . $key, ['all' => request()->all(), 'scene' => $scene,'data'=>$data, 'payType' => $payType, 'result' => $result], 7200);
  48. logger()->channel('alipay')->info("【{$date} 支付回调】回调成功:" . json_encode(['data' => $data,'scene'=>$scene,'payType'=>$payType],256));
  49. return response('success');
  50. } else {
  51. $msg = PaymentService::make()->getError();
  52. logger()->channel($channel)->info("【{$date} 支付回调】回调失败:" . json_encode(['data' => $data,'scene'=>$scene,'payType'=>$payType, 'error' => lang($msg)], 256));
  53. return message($msg ? $msg : 2635, false);
  54. }
  55. } catch (\Exception $exception) {
  56. RedisService::set("caches:payments:notify_{$scene}:error_" . $key, ['all' => request()->all(), 'scene' => $scene,'payType' => $payType,'error' => $exception->getMessage(), 'data' => $result], 7200);
  57. logger()->channel($channel)->error("【{$date} 支付回调】回调错误:" . json_encode(['data' => $result,'scene'=>$scene,'payType'=>$payType, 'error' => $exception->getMessage()], 256));
  58. return message(2635, false, ['error' => $exception->getMessage()]);
  59. }
  60. }
  61. /**
  62. * 退款回调
  63. * @param string $scene 场景,refund-退款
  64. * @param int $payType 支付方式:10-微信,20-支付宝
  65. * @return array|false
  66. * @throws \Yansongda\Pay\Exception\ContainerException
  67. * @throws \Yansongda\Pay\Exception\InvalidParamsException
  68. */
  69. public function refund($payType = 10)
  70. {
  71. $scene = 'depositRefund';
  72. $date = date('Y-m-d H:i:s');
  73. $result = request()->post();
  74. $pay = PaymentService::make()->createPay('refund', $payType);
  75. $channel = $payType == 10? 'wechat':'alipay';
  76. if (empty($pay) || empty($scene) || empty($payType)) {
  77. if (env('APP_DEBUG')) {
  78. logger()->channel($channel)->error("【{$date} 退款回调】验证错误:" . json_encode(['scene' => $scene, 'payType' => $payType, 'data' => $result], 256));
  79. }
  80. RedisService::set("caches:refunds:notify_error_" . date('YmdH'), ['all' => request()->all(), 'scene' => $scene, 'payType' => $payType, 'data' => $result], 7200);
  81. return false;
  82. }
  83. // 验签和重组参数
  84. $data = $pay->callback();
  85. RedisService::set("caches:refunds:notify_data_" . date('YmdH'), ['all' => request()->all(), 'scene' => $scene, 'payType' => $payType, 'data' => $result], 7200);
  86. if (env('APP_DEBUG')) {
  87. logger()->channel($channel)->info("【{$date} 退款回调】验证结果:" . json_encode($data, 256));
  88. }
  89. // 回调处理
  90. if (PaymentService::make()->catchNotify($scene, $payType, $data)) {
  91. logger()->channel($channel)->info("【{$date} 退款回调】回调成功:" . json_encode(['data' => $data,'scene'=>$scene,'payType'=>$payType],256));
  92. return response('success');
  93. } else {
  94. $msg = PaymentService::make()->getError();
  95. logger()->channel($channel)->info("【{$date} 退款回调】回调失败:" . json_encode(['data' => $data,'scene'=>$scene,'payType'=>$payType, 'error' => lang($msg)], 256));
  96. return message($msg ? $msg : 2635, false);
  97. }
  98. }
  99. }