PayCallbackController.php 4.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: zilongs
  5. * Date: 20-10-2
  6. * Time: 下午8:27
  7. */
  8. namespace App\Http\Controllers\Api\V1;
  9. use App\Http\Controllers\Controller;
  10. use App\Models\Docter;
  11. use App\Models\Order;
  12. use App\Models\Payment;
  13. use App\Models\User;
  14. use DB;
  15. use EasyWeChat\Factory;
  16. class PayCallbackController extends Controller
  17. {
  18. public function wechatPayNotify()
  19. {
  20. $app = Factory::payment(config('config.wechat_pay'));
  21. $response = $app->handlePaidNotify(function($message, $fail){
  22. // 使用通知里的 "交易单号" 去自己的数据库找到订单
  23. $payment = Payment::where('trade_sn', $message['out_trade_no'])->first();
  24. // 如果订单不存在 或者 订单已经支付过了
  25. if (empty($payment) || $payment['status'] != 1) {
  26. return true; // 告诉微信,我已经处理完了或者订单没找到,别再通知我了
  27. }
  28. //使用通知里的 "微信支付订单号" 去自己的数据库找是否已经存在
  29. if(Payment::where('online_sn', $message['transaction_id'])->exists()){
  30. return true; // 告诉微信,我已经处理过这单了,别再通知我了
  31. }
  32. //建议在这里调用微信的【订单查询】接口查一下该笔订单的情况,确认是已经支付
  33. // return_code 表示通信状态,不代表支付状态
  34. if ($message['return_code'] === 'SUCCESS') {
  35. // 用户是否支付成功
  36. if ($message['result_code'] === 'SUCCESS') {
  37. // 启动事务
  38. DB::beginTransaction();
  39. try {
  40. //更新payment
  41. Payment::where('id', $payment['id'])->update(['online_sn' => $message['transaction_id'], 'status' => 2, 'payment_time' => time()]);
  42. $order = Order::select(['id', 'user_id', 'docter_id', 'product_type', 'payment_amount', 'total_amount'])->where('id', $payment['order_id'])->first();
  43. $order_status = 2;
  44. if (in_array($order['product_type'], [3,4,5,6])) {
  45. $order_status = 3;
  46. }
  47. elseif ($order['product_type'] == 7) {
  48. $order_status = 4;
  49. //改变用户余额
  50. User::changeBalance($order['user_id'], $order['total_amount'], 2, $order['id'], '充值');
  51. }
  52. //更新订单
  53. Order::where('id', $payment['order_id'])->update([
  54. 'order_status' => $order_status,
  55. 'payment_status' => 2,
  56. 'payment_time' => time(),
  57. ]);
  58. if (!empty($order['docter_id'])) {
  59. //更新医生的服务人数
  60. Docter::where('id', $order['docter_id'])->increment('service_persons');
  61. }
  62. Order::payCompletedHandle($order['id']);
  63. // 提交事务
  64. DB::commit();
  65. } catch (\Exception $e) {
  66. // 回滚事务
  67. DB::rollback();
  68. trace(['微信支付回调错误' => $e->getMessage(), '错误数据' => $payment], 'error');
  69. return $fail('内部服务失败,请稍后再通知我');
  70. }
  71. }
  72. elseif ($message['result_code'] === 'FAIL') {
  73. $err_code = $message['err_code'] ?? '';
  74. $err_code_des = $message['err_code_des'] ?? '';
  75. $remark = $err_code.':'.$err_code_des;
  76. Payment::where('id', $payment['id'])->update(['remark' => $remark, 'status' => 3, 'payment_time' => time()]);
  77. }
  78. }
  79. else {
  80. trace(['微信支付回调通知数据错误,返回码return_code:' => $message['return_code'], '错误数据' => $payment], 'error');
  81. return $fail('通信失败,请稍后再通知我');
  82. }
  83. return true; // 返回处理完成
  84. });
  85. return $response;
  86. }
  87. }