1
0

YFTPayCallBackController.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. <?php
  2. /**
  3. * Created by 傲慢与偏见.
  4. * User: Administrator
  5. * Date: 2017/11/21
  6. * Time: 8:57
  7. *
  8. * 虽然代码开源,但是请别直接照搬好吗?直接照搬也别改的面目全非好吗?改的面目全非也别删除注释好吗?
  9. *
  10. * 抄代码之前想想为什么这样写,这样才能有提高。建议你去学学面向对象编程方式。
  11. *
  12. * 另外,我看了你的代码,真的写的很烂,乱。
  13. *
  14. */
  15. namespace App\Controllers;
  16. use App\Models\Payback;
  17. use App\Models\User;
  18. use App\Models\YftOrder;
  19. use App\Services\Config;
  20. use App\Utils\Telegram;
  21. class YFTPayCallBackController
  22. {
  23. public function yft_notify($request)
  24. {
  25. //价格
  26. $total_fee = $request->getQueryParams()["total_fee"];//必填
  27. //易付通返回的订单号
  28. $yft_order_no = $request->getQueryParams()["trade_no"];
  29. //面板生成的订单号
  30. $ss_order_no = $request->getQueryParams()["out_trade_no"];//必填
  31. //订单说明
  32. $subject = $request->getQueryParams()["subject"];//必填
  33. //付款状态
  34. $trade_status = $request->getQueryParams()["trade_status"];//必填
  35. //加密验证字符串
  36. $sign = $request->getQueryParams()["sign"];//必填
  37. $verifyNotify = YFTPayCallBackController::md5Verify(floatval($total_fee), $ss_order_no, $yft_order_no, $trade_status, $sign);
  38. if ($verifyNotify) {//验证成功
  39. if ($trade_status == 'TRADE_SUCCESS') {
  40. /*
  41. 加入您的入库及判断代码;
  42. >>>>>>>!!!为了保证数据传达到回调地址,会请求4次。所以必须要先判断订单状态,然后再插入到数据库,这样后面即使请求3次,也不会造成订单重复!!!!<<<<<<<
  43. 判断返回金额与实金额是否想同;
  44. 判断订单当前状态;
  45. 完成以上才视为支付成功
  46. */
  47. $orderInfo = new YftOrder();
  48. $orderInfo = $orderInfo->where("ss_order", "=", $ss_order_no)->first();
  49. if ($orderInfo == "" || $orderInfo == null) {
  50. return "订单不存在!";
  51. }
  52. if ($orderInfo->price != $total_fee) {
  53. return "订单信息异常!";
  54. }
  55. $userInfo = new User();
  56. $userInfo = $userInfo->where("id", "=", $orderInfo->user_id)->first();
  57. if (sizeof($orderInfo) != 0 && $orderInfo->state == 0) {
  58. $oldMoney = $userInfo->money;
  59. $userInfo->money = $total_fee + $oldMoney;
  60. //更新用户余额信息
  61. $userInfo->save();
  62. //更新订单信息
  63. $orderInfo->yft_order = $yft_order_no;
  64. $orderInfo->state = 1;
  65. $orderInfo->save();
  66. //充值返利处理 start
  67. if ($userInfo->ref_by != "" && $userInfo->ref_by != 0 && $userInfo->ref_by != null && Config::get('code_payback') != 0 && Config::get('code_payback') != null) {
  68. $gift_user = User::where("id", "=", $userInfo->ref_by)->first();
  69. $gift_user->money = ($gift_user->money + ($total_fee * (Config::get('code_payback') / 100)));
  70. $gift_user->save();
  71. $Payback = new Payback();
  72. $Payback->total = $total_fee;
  73. $Payback->userid = $userInfo->id;
  74. $Payback->ref_by = $userInfo->ref_by;
  75. $Payback->ref_get = $total_fee * (Config::get('code_payback') / 100);
  76. $Payback->datetime = time();
  77. $Payback->save();
  78. }
  79. //充值返利处理 end
  80. //telegram提醒
  81. if (Config::get('enable_donate') == 'true' && Config::get("enable_telegram") == 'true') {
  82. if ($userInfo->is_hide == 1) {
  83. Telegram::Send("感谢!一位不愿透露姓名的大老爷给我们捐了 " . $total_fee . " 元呢~");
  84. } else {
  85. Telegram::Send("感谢!" . $userInfo->user_name . " 大老爷给我们捐了 " . $total_fee . " 元呢~");
  86. }
  87. }
  88. } else {
  89. return "订单号异常或交易已完成!";
  90. }
  91. header("location:" . $request->getUri()->getScheme() . "://" . $request->getUri()->getHost() . "/user/code");
  92. return "支付成功";
  93. } else {
  94. return "支付失败";
  95. }
  96. } else {
  97. //验证失败
  98. return "订单信息异常!请联系管理员";
  99. }
  100. }
  101. /**
  102. * @param $p1
  103. * @param $p2
  104. * @param $p3
  105. * @param $p4
  106. * @param $sign 传入要比对的sign
  107. * @return boolean 返回比对结果
  108. */
  109. private static function md5Verify($p1, $p2, $p3, $p4, $sign)
  110. {
  111. $preStr = $p1 . $p2 . $p3 . $p4 . "yft";
  112. $mySign = md5($preStr);
  113. if ($mySign == $sign) {
  114. return true;
  115. } else {
  116. return false;
  117. }
  118. }
  119. }