WechatPay.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. <?php namespace App\Http\Controllers\Api;
  2. use App\Http\Controllers\Api\Api;
  3. use App\Models\Custom;
  4. use App\Models\Orders;
  5. use App\Facades\Servers\Logs\Log;
  6. use EasyWeChat\Factory;
  7. use Illuminate\Http\Request;
  8. use App\Servers\WechatPay\Payment;
  9. use WeChatPay\Formatter;
  10. use WeChatPay\Crypto\AesGcm;
  11. use WeChatPay\Crypto\Rsa;
  12. /**
  13. * 微信支付接口
  14. *
  15. * @author JUN
  16. *
  17. * */
  18. class WechatPay extends Api{
  19. /**
  20. * 小程序微信支付下单 /api/wechat_pay/unifiedorder
  21. *
  22. * */
  23. public function unifiedorder()
  24. {
  25. // 检查登录
  26. $uid = $this->checkLogin();
  27. $openid = request('openid','');
  28. $orderId = request('order_id','');
  29. $snowflakeId = request('snowflake_id','');
  30. $orderInfo = Orders::query()->where('id',$orderId)->get();
  31. if (empty($orderInfo))
  32. return json_send(['code'=>'error','msg'=>'订单不存在','data'=>['id'=>null]]);
  33. if ($orderInfo['custom_uid'] != $uid)
  34. return json_send(['code'=>'error','msg'=>'订单已支付或取消','data'=>['id'=>null]]);
  35. if ($orderInfo['status'] != 1)
  36. return json_send(['code'=>'error','msg'=>'订单已支付或取消','data'=>['id'=>null]]);
  37. $payment = new Payment();
  38. return $payment->pay(['out_trade_no' => $orderInfo['snowflake_id'],'openid' => $openid,'description' => '开邻智教','total_price' => $orderInfo['pay_total']]);
  39. }
  40. /**
  41. * 小程序微信支付回调 /api/wechat_pay/notify
  42. *
  43. * */
  44. public function notify()
  45. {
  46. $post_data = request();
  47. Log::log('notify_wechat_pay', 'post_data:' . $post_data);
  48. //获取headers参数
  49. $headers = request()->header();
  50. Log::log('notify_wechat_pay', '微信支付回调返回headers参数:' . json_encode($headers));
  51. $inWechatpaySignature = $headers['wechatpay-signature'];
  52. $inWechatpayTimestamp = $headers['wechatpay-timestamp'];
  53. $inWechatpaySerial = $headers['wechatpay-serial'];
  54. $inWechatpayNonce = $headers['wechatpay-nonce'];
  55. $inBody = $post_data;
  56. $apiv3Key = Config('wechat.APIV3');// 在商户平台上设置的APIv3密钥
  57. // 根据通知的平台证书序列号,查询本地平台证书文件,
  58. $platformCertificateFilePath = Config('wechat.platformCertificate');
  59. $platformPublicKeyInstance = Rsa::from($platformCertificateFilePath, Rsa::KEY_TYPE_PUBLIC);
  60. // 检查通知时间偏移量,允许5分钟之内的偏移
  61. $timeOffsetStatus = 300 >= abs(Formatter::timestamp() - (int)$inWechatpayTimestamp);
  62. Log::log('notify_wechat_pay', '时间偏移量:' . $timeOffsetStatus);
  63. $verifiedStatus = Rsa::verify(
  64. // 构造验签名串
  65. Formatter::joinedByLineFeed($inWechatpayTimestamp, $inWechatpayNonce, $inBody),
  66. $inWechatpaySignature,
  67. $platformPublicKeyInstance
  68. );
  69. Log::log('notify_wechat_pay', '验签:' . $verifiedStatus);
  70. $orderService = new OrderService();
  71. if ($timeOffsetStatus && $verifiedStatus) {
  72. // 转换通知的JSON文本消息为PHP Array数组
  73. $inBodyArray = (array)json_decode($inBody, true);
  74. // 使用PHP7的数据解构语法,从Array中解构并赋值变量
  75. ['resource' => [
  76. 'ciphertext' => $ciphertext,
  77. 'nonce' => $nonce,
  78. 'associated_data' => $aad
  79. ]] = $inBodyArray;
  80. // 加密文本消息解密
  81. $inBodyResource = AesGcm::decrypt($ciphertext, $apiv3Key, $nonce, $aad);
  82. // 把解密后的文本转换为PHP Array数组
  83. $inBodyResourceArray = (array)json_decode($inBodyResource, true);
  84. Log::log('notify_wechat_pay', '打印解密后的结果:' . json_encode($inBodyResourceArray));
  85. Log::log('notify_wechat_pay', '参数:' . $inBodyResourceArray['trade_state'] . '订单号' . $inBodyResourceArray['out_trade_no'] . '微信支付号' . $inBodyResourceArray['transaction_id']);
  86. if ($inBodyResourceArray['trade_state'] == "SUCCESS") {
  87. Log::log('notify_wechat_pay', '通知订单');
  88. $res = $orderService->payCallback($inBodyResourceArray['out_trade_no'], $inBodyResourceArray['transaction_id']);
  89. Log::log('notify_wechat_pay', '通知返回' . json_encode($res));
  90. }
  91. }
  92. }
  93. }