Notify.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <?php
  2. namespace app\api\controller;
  3. use app\common\controller\Api;
  4. use think\Db;
  5. use think\Log;
  6. use addons\epay\library\Service;
  7. /**
  8. * 支付回调
  9. */
  10. class Notify extends Api
  11. {
  12. protected $noNeedLogin = ['*'];
  13. protected $noNeedRight = ['*'];
  14. /**
  15. * 支付回调
  16. */
  17. public function notify() {
  18. $paytype = $this->request->param('paytype');
  19. $pay = Service::checkNotify($paytype);
  20. // Log::record("=======================", 'info');
  21. // Log::record("pay:", 'info');
  22. // Log::record($pay, 'info');
  23. // Log::record("=======================", 'info');
  24. if (!$pay) {
  25. echo '签名错误';
  26. return;
  27. }
  28. $data = $pay->verify();
  29. $time = time();
  30. try {
  31. $payamount = $paytype == 'alipay' ? $data['total_amount'] : $data['total_fee'] / 100;
  32. $out_trade_no = $data['out_trade_no'];
  33. Db::startTrans();
  34. try{
  35. $orderModel = new \app\common\model\RecharOrder();
  36. $userModel = new \app\common\model\User();
  37. $orderInfo = $orderModel->where(["order_no"=>$out_trade_no])->find();
  38. $userInfo = $userModel->where(["id"=>$orderInfo["user_id"]])->find();
  39. $res1 = false;
  40. $res2 = false;
  41. $res3 = false;
  42. if($orderInfo['status'] == 0) {
  43. // 修改订单状态
  44. $res1 = $orderModel->update(["status"=>1,"updatetime"=>$time],["order_no"=>$out_trade_no, 'status' => 0]);
  45. // 充值后
  46. switch($orderInfo['purpose']) {
  47. case 1:
  48. // 修改用户为已缴纳认证费
  49. $userInfo->recharge_auth = 1;
  50. $res2 = $userInfo->save();
  51. $res3 = true;
  52. break;
  53. case 2:
  54. // 添加有眼缘记录--单次付费
  55. $data = [];
  56. $data['user_id'] = $userInfo->id;
  57. $data['fate_user_id'] = $orderInfo->fate_user_id;
  58. if(!\app\common\model\UserFate::where($data)->find()) {
  59. $data['createtime'] = $time;
  60. $res2 = \app\common\model\UserFate::insert($data);
  61. } else {
  62. $res2 = true;
  63. }
  64. // 返利
  65. $preuser_id = $userInfo->pre_user_id;
  66. if($userInfo->vip_duetime < $time) {
  67. $memo = '用户充值获得收益!';
  68. $profit = $payamount * config('site.userProfitRate') * 0.01;
  69. } else {
  70. $memo = '会员充值获得收益!';
  71. $profit = $payamount * config('site.vipProfitRate') * 0.01;
  72. }
  73. if($profit>=0.01 && $preuser_id > 0) {
  74. $res3 = \app\common\model\User::profit($profit,$preuser_id,$memo);
  75. } else {
  76. $res3 = true;
  77. }
  78. break;
  79. case 3:
  80. // 获取vip配置信息
  81. $vip_config_id = $orderInfo['vip_config_id'];
  82. $vipConfigInfo = \app\admin\model\vip\Config::where(['id'=>$vip_config_id])->find();
  83. // 计算vip到期时间
  84. if($userInfo->vip_duetime < $time) {
  85. $duetime = strtotime ( '+'.intval($vipConfigInfo['time']).' month' );
  86. } else {
  87. $duetime = strtotime ( '+'.intval($vipConfigInfo['time']).' month',$userInfo->vip_duetime);
  88. }
  89. // 修改用户为vip
  90. if($userInfo->vip_duetime <= time()) {
  91. $userInfo->view_count = $vipConfigInfo->give_times; // 今日剩余次数
  92. $userInfo->view_date = date('Y-m-d'); // 次数最后更新日期
  93. }
  94. $userInfo->vip_duetime = $duetime;
  95. $res2 = $userInfo->save();
  96. // 添加查看次数
  97. $data = [];
  98. $data['user_id'] = $userInfo->id;
  99. $data['end_date'] = date("Y-m-d",$duetime);
  100. $data['times'] = $vipConfigInfo->give_times;
  101. $data['createtime'] = time();
  102. $res3 = \app\common\model\GiveFateLog::insert($data);
  103. break;
  104. case 4:
  105. // 获取钻石配置信息
  106. $vip_config_id = $orderInfo['vip_config_id'];
  107. $vipConfigInfo = Db::name('diamond')->where(['id'=>$vip_config_id])->find();
  108. //修改用户钻石余额
  109. $diamond = $userInfo['diamond'] + $vipConfigInfo['number'];
  110. $res2 = Db::name('user')->where(['id' => $userInfo['id'], 'diamond' => $userInfo['diamond']])->setField('diamond', $diamond);
  111. // 添加钻石明细
  112. $diamond_log = Db::name('user_diamond_log')->where(['user_id' => $userInfo['id']])->order('id', 'desc')->find();
  113. if (!$diamond_log && $userInfo['diamond'] > 0) {
  114. $res3 = false;
  115. break;
  116. }
  117. if ($diamond_log && $diamond_log['after'] != $userInfo['diamond']) {
  118. $res3 = false;
  119. break;
  120. }
  121. $data = [];
  122. $data['user_id'] = $userInfo['id'];
  123. $data['diamond'] = $vipConfigInfo['number'];
  124. $data['before'] = $userInfo['diamond'];
  125. $data['after'] = $diamond;
  126. $data['memo'] = '充值';
  127. $data['createtime'] = time();
  128. $res3 = Db::name('user_diamond_log')->insertGetId($data);
  129. break;
  130. }
  131. }
  132. if($res1 && $res2 !== false && $res3) {
  133. Db::commit();
  134. } else {
  135. Db::rollback();
  136. }
  137. }catch (ValidateException $e) {
  138. Db::rollback();
  139. $this->error($e->getMessage());
  140. } catch (PDOException $e) {
  141. Db::rollback();
  142. $this->error($e->getMessage());
  143. } catch (Exception $e) {
  144. Db::rollback();
  145. $this->error($e->getMessage());
  146. }
  147. //你可以在此编写订单逻辑
  148. } catch (Exception $e) {
  149. }
  150. echo $pay->success();
  151. }
  152. }