NotifyController.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <?php
  2. namespace App\Http\Controllers\Api\v1;
  3. use App\Http\Controllers\Api\BaseController;
  4. use App\Services\GongdengOrderService;
  5. use App\Services\NotifyService;
  6. use App\Services\RedisService;
  7. use App\Services\WechatService;
  8. use Illuminate\Http\Request;
  9. /**
  10. * 回调控制器
  11. * @author wesmiler
  12. * @since 2020/11/10
  13. * Class NotifyController
  14. * @package App\Http\Controllers
  15. */
  16. class NotifyController extends BaseController
  17. {
  18. protected $response = null;
  19. /**
  20. * 构造函数
  21. * @author wesmiler
  22. * @since 2020/11/11
  23. * NotifyController constructor.
  24. */
  25. public function __construct()
  26. {
  27. parent::__construct();
  28. $this->service = new GongdengOrderService();
  29. }
  30. /**
  31. * 支付回调
  32. */
  33. public function pay($scene){
  34. $postData = request()->all();
  35. $sign = request()->headers->get('Wechatpay-Signature');
  36. $nonce = request()->headers->get('Wechatpay-Nonce');
  37. $timestamp = request()->headers->get('Wechatpay-Timestamp');
  38. /* $sign = 'JnLbXF3HLEeAVuyVoyedezPV8+mRZ93+rmlbHOIm1I0+YKboBTUmVNwlV9KKOVPXPBQENxjHqT6fR5Qx326uVZryb\/JM+lTdvl3j+XVD0F5NJWZKGu7Zykf69yYMY3wbe1++em\/iiouZLg8\/5KRp7nvNMLL383gemOMRbsYN3+dZ++62qrmVZxo00fHlK+AjxXmV38KRCLtfLWfIsUXw9Zi8hXqHbf+s\/pBthV+Ouasw0Eit4f4E3aDjp4baFD70s\/RsbcqTn8UqxCurRNgm7kCtLphzStPnEUC1dfvIWZQIuJ+BaAqstj9y7RW5CdF7aZPqhXnPETvB8ZynSTYl3Q==';
  39. $timestamp = '1626663968';
  40. $nonce = 'yWa6xnLUDyqfVYhjTnWcafDuNzgoXMNa';*/
  41. //$body = NotifyService::getBody($this->response);
  42. $body = file_get_contents('php://input');
  43. $signStr = "{$timestamp}\n{$nonce}\n{$body}\n";
  44. var_dump($signStr);
  45. $id = isset($postData['id'])? '_'.$postData['id'] : '';
  46. RedisService::set('caches:payments:'.$scene.':result'.$id.'_'.date('YmdHis'), ['result'=> $postData,'sign'=> $sign,'date'=> date('Y-m-d H:i:s')], 7200);
  47. $postData = isset($postData['resource'])? $postData['resource'] : [];
  48. if(empty($scene) || empty($postData)){
  49. return NotifyService::make()->rebackMsg('回调参数错误');
  50. }
  51. // 解密
  52. $ciphertext = isset($postData['ciphertext'])? $postData['ciphertext'] : '';
  53. RedisService::set('caches:payments:'.$scene.':result'.$id.'_ciphertext', ['result'=> $postData,'date'=> date('Y-m-d H:i:s')], 7200);
  54. if(empty($ciphertext)){
  55. return NotifyService::make()->rebackMsg('解密数据不存在');
  56. }
  57. $postData = WechatService::decryptNotifyData($postData);
  58. $postData = $postData? json_decode($postData, true) : [];
  59. var_dump($postData);
  60. $outTradeNo = isset($postData['out_trade_no']) ? $postData['out_trade_no'] : '';
  61. if(empty($postData) || empty($outTradeNo)){
  62. return NotifyService::make()->rebackMsg('获取解密数据失败');
  63. }
  64. RedisService::set('caches:payments:'.$scene.':result'.$id.'_'.$outTradeNo, ['result'=> $postData], 7200);
  65. RedisService::set('caches:payments:'.$scene.':check'.$id.'_'.$outTradeNo, ['data'=> $postData,'signStr'=> $signStr,'sign'=> $sign], 3600);
  66. if (WechatService::checkJsapiNotifyV3($signStr, $sign) === true) {
  67. switch($scene){
  68. case 'index': // 供灯订单
  69. return NotifyService::make()->notifyGongdeng($postData, $outTradeNo);
  70. case 'recharge': // 充值
  71. break;
  72. default:
  73. break;
  74. }
  75. }
  76. return NotifyService::make()->rebackMsg('回调失败');
  77. }
  78. }