Notify.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. <?php
  2. namespace app\api\controller;
  3. use app\common\controller\Api;
  4. use app\common\service\UserService;
  5. use kjpay\kjpay;
  6. use think\Request;
  7. use think\Db;
  8. use addons\epay\library\Service;
  9. /**
  10. * 支付回调
  11. */
  12. class Notify extends Api
  13. {
  14. protected $noNeedLogin = ['wechatnotify', 'alipaynotify', 'wechatkjnotify'];
  15. protected $noNeedRight = ['*'];
  16. /**
  17. * 支付回调
  18. */
  19. public function wechatnotify()
  20. {
  21. $paytype = "wechat";
  22. $pay = Service::checkNotify($paytype);
  23. if (!$pay) {
  24. echo '签名错误';
  25. return;
  26. }
  27. $data = $pay->verify();
  28. try {
  29. $payamount = $data['total_fee'] / 100;
  30. $out_trade_no = $data['out_trade_no'];
  31. Db::startTrans();
  32. try {
  33. $orderModel = new \app\common\model\RecharOrder();
  34. $userModel = new \app\common\model\User();
  35. $jewellogModel = new \app\common\model\UserJewelLog();
  36. $rechargelogModel = new \app\common\model\UserRechargeLog();
  37. $orderInfo = $orderModel->where(["order_no" => $out_trade_no])->find();
  38. $userInfo = $userModel->where(["id" => $orderInfo["user_id"]])->find();
  39. // 修改订单状态
  40. $res1 = $orderModel->update(["status" => 1], ["order_no" => $out_trade_no]);
  41. // 修改用户钻石余额
  42. $res2 = $userModel->where(["id" => $orderInfo["user_id"]])->setInc("jewel", $orderInfo["jewel"]);
  43. // 添加钻石流水记录
  44. $detail = "钻石充值";
  45. $res3 = $jewellogModel->addUserJewelLog($userInfo["id"], $orderInfo["jewel"], "+", $userInfo["jewel"], $detail, 1);
  46. // 添加充值记录
  47. $res4 = $rechargelogModel->addRecord($userInfo["id"], $orderInfo["jewel"], $payamount, bcadd($userInfo["jewel"], $orderInfo["jewel"], 2), $userInfo["money"], $orderInfo["platform"], 1);
  48. if ($res1 && $res2 && $res3 && $res4) {
  49. // 添加统计
  50. $userInfo->chargecount = $userInfo->chargecount + $payamount;
  51. $userInfo->chargetime = time();
  52. $userInfo->save();
  53. $userService = new UserService();
  54. $userService->inviteMoney(['user_id'=>$orderInfo["user_id"]]);
  55. Db::commit();
  56. }
  57. } catch (ValidateException $e) {
  58. Db::rollback();
  59. $this->error($e->getMessage());
  60. } catch (PDOException $e) {
  61. Db::rollback();
  62. $this->error($e->getMessage());
  63. } catch (Exception $e) {
  64. Db::rollback();
  65. $this->error($e->getMessage());
  66. }
  67. //你可以在此编写订单逻辑
  68. } catch (Exception $e) {
  69. }
  70. echo $pay->success();
  71. }
  72. /**
  73. * 支付回调
  74. */
  75. public function alipaynotify()
  76. {
  77. $paytype = "alipay";
  78. $pay = Service::checkNotify($paytype);
  79. if (!$pay) {
  80. echo '签名错误';
  81. return;
  82. }
  83. $data = $pay->verify();
  84. try {
  85. $payamount = $data['total_fee'] / 100;
  86. $out_trade_no = $data['out_trade_no'];
  87. Db::startTrans();
  88. try {
  89. $orderModel = new \app\common\model\RecharOrder();
  90. $userModel = new \app\common\model\User();
  91. $jewellogModel = new \app\common\model\UserJewelLog();
  92. $rechargelogModel = new \app\common\model\UserRechargeLog();
  93. $orderInfo = $orderModel->where(["order_no" => $out_trade_no])->find();
  94. $userInfo = $userModel->where(["id" => $orderInfo["user_id"]])->find();
  95. // 修改订单状态
  96. $res1 = $orderModel->update(["status" => 1], ["order_no" => $out_trade_no]);
  97. // 修改用户钻石余额
  98. $res2 = $userModel->where(["id" => $orderInfo["user_id"]])->setInc("jewel", $orderInfo["jewel"]);
  99. // 添加钻石流水记录
  100. $detail = "钻石充值";
  101. $res3 = $jewellogModel->addUserJewelLog($userInfo["id"], $orderInfo["jewel"], "+", $userInfo["jewel"], $detail, 1);
  102. // 添加充值记录
  103. $res4 = $rechargelogModel->addRecord($userInfo["id"], $orderInfo["jewel"], $payamount, bcadd($userInfo["jewel"], $orderInfo["jewel"], 2), $userInfo["money"], $orderInfo["platform"], 1);
  104. if ($res1 && $res2 && $res3 && $res4) {
  105. // 添加统计
  106. $userInfo->chargecount = $userInfo->chargecount + $payamount;
  107. $userInfo->chargetime = time();
  108. $userInfo->save();
  109. $userService = new UserService();
  110. $userService->inviteMoney(['user_id'=>$orderInfo["user_id"]]);
  111. Db::commit();
  112. }
  113. } catch (ValidateException $e) {
  114. Db::rollback();
  115. $this->error($e->getMessage());
  116. } catch (PDOException $e) {
  117. Db::rollback();
  118. $this->error($e->getMessage());
  119. } catch (Exception $e) {
  120. Db::rollback();
  121. $this->error($e->getMessage());
  122. }
  123. //你可以在此编写订单逻辑
  124. } catch (Exception $e) {
  125. }
  126. echo $pay->success();
  127. }
  128. /**
  129. * 支付回调
  130. */
  131. public function wechatkjnotify()
  132. {
  133. $input = file_get_contents("php://input"); // 主题信息
  134. $dataArr = explode("&", urldecode($input));
  135. $data = [];
  136. if ($dataArr) foreach ($dataArr as $k => $v) {
  137. $vv = explode("=", $v);
  138. $data[$vv[0]] = $vv[1];
  139. }
  140. // 实例化支付类
  141. $kjpay = new kjpay();
  142. // 获取公共参数
  143. $config = config("kjPay");
  144. //密钥
  145. $key = $config["key"];
  146. $sign = $data['sign'];
  147. unset($data['sign']);
  148. if ($kjpay->local_sign($data, $key) == $sign) {
  149. //验签成功后,开始业务逻辑
  150. try {
  151. $payamount = $data['amount'];
  152. $out_trade_no = $data['merchant_order_no'];
  153. $pay_channel = $data['pay_channel'];
  154. Db::startTrans();
  155. try {
  156. $orderModel = new \app\common\model\RecharOrder();
  157. $userModel = new \app\common\model\User();
  158. $jewellogModel = new \app\common\model\UserJewelLog();
  159. $rechargelogModel = new \app\common\model\UserRechargeLog();
  160. $orderInfo = $orderModel->where(["order_no" => $out_trade_no])->find();
  161. $userInfo = $userModel->where(["id" => $orderInfo["user_id"]])->find();
  162. // 修改订单状态
  163. $res1 = $orderModel->update(["status" => 1], ["order_no" => $out_trade_no]);
  164. // 修改用户钻石余额
  165. $res2 = $userModel->where(["id" => $orderInfo["user_id"]])->setInc("jewel", $orderInfo["jewel"]);
  166. // 添加钻石流水记录
  167. $detail = "砖石充值";
  168. $res3 = $jewellogModel->addUserJewelLog($userInfo["id"], $orderInfo["jewel"], "+", $userInfo["jewel"], $detail, 1);
  169. // 添加充值记录
  170. $rechargeCount = $rechargelogModel->where('user_id',$orderInfo["user_id"])->count();
  171. $isFirstRecharge = $rechargeCount > 0 ? 0 : 1;
  172. $platformArr = ["wx_app_pay" => 1, "ali_wap_pay" => 2, "wx_public_pay" => 3];
  173. $res4 = $rechargelogModel->addRecord($userInfo["id"], $orderInfo["jewel"], $payamount, bcadd($userInfo["jewel"], $orderInfo["jewel"], 2), $userInfo["money"], $orderInfo["platform"], $platformArr[$pay_channel], $isFirstRecharge, $userInfo["pre_userid"]);
  174. if ($res1 && $res2 && $res3 && $res4) {
  175. // 添加统计
  176. $time = time();
  177. (new \app\common\model\User)->execute("update hx_user set chargecount = chargecount + $payamount,chargetime = $time where id = " . $userInfo["id"]);
  178. // \app\common\model\Test::update(["content"=>"update hx_user set chargecount = chargecount + $payamount,chargetime = $time where id = ".$userInfo["id"]],["id"=>1]);
  179. // 首充赠送
  180. $userInfo = \app\common\model\User::get($orderInfo["user_id"]);
  181. if ($userInfo->is_recharge == 0) { // 首充
  182. Db::startTrans();
  183. try {
  184. // 赠送消息尾灯
  185. $res1 = \app\common\model\AttireBack::addToMyBack(15, $orderInfo["user_id"]);
  186. $userInfo->is_recharge = 1;
  187. $res2 = $userInfo->save();
  188. if ($res1 && $res2) Db::commit();
  189. } catch (ValidateException $e) {
  190. Db::rollback();
  191. $this->error($e->getMessage());
  192. }
  193. }
  194. $this->rebate($orderInfo["user_id"], $data['amount']);
  195. // +EXP
  196. \app\common\model\TaskLog::tofinish($orderInfo["user_id"], "5EMwg7la", 1);
  197. // 查询今日充值记录
  198. $today = strtotime(date("Y-m-d 00:00:00"));
  199. $rechargeMoney = \app\common\model\RecharOrder::where(["user_id" => $orderInfo["user_id"], "createtime" => ["gt", $today]])->sum("money");
  200. if ($rechargeMoney >= 100) {
  201. // +EXP
  202. \app\common\model\TaskLog::tofinish($orderInfo["user_id"], "DaCVgOLu", 1);
  203. }
  204. // 查询新人礼包
  205. $this->addBagGift($orderInfo["user_id"], $data['amount']);
  206. Db::commit();
  207. echo "success";
  208. exit;
  209. }
  210. } catch (ValidateException $e) {
  211. Db::rollback();
  212. $this->error($e->getMessage());
  213. } catch (PDOException $e) {
  214. Db::rollback();
  215. $this->error($e->getMessage());
  216. } catch (Exception $e) {
  217. Db::rollback();
  218. $this->error($e->getMessage());
  219. }
  220. //你可以在此编写订单逻辑
  221. } catch (Exception $e) {
  222. }
  223. }
  224. }
  225. /**
  226. * 银联提现回调
  227. */
  228. public function cashoutNotify()
  229. {
  230. }
  231. /**
  232. * 更新新人礼包
  233. */
  234. private function addBagGift($user_id, $amount)
  235. {
  236. if (!$user_id || !$amount) return false;
  237. // 先看该用户是否有新人礼包特权
  238. $have = \app\common\model\NewBagHave::where(["user_id" => $user_id])->find();
  239. // print_r($have);exit;
  240. if ($have && time() - $have->createtime <= 7 * 86400) {
  241. $where = [];
  242. $where["value"] = ["elt", $amount];
  243. $bagInfo = \app\common\model\NewBag::where($where)->order("value", "desc")->select();
  244. if (!$bagInfo) return false;
  245. $res1 = false;
  246. foreach ($bagInfo as $k => $v) {
  247. // 查询完成情况
  248. $bagfinish = \app\common\model\NewBagFinish::where(["user_id" => $user_id, "bag_id" => $v["id"]])->find();
  249. if (!$bagfinish || $bagfinish->status <= 0) {
  250. if ($bagfinish) {
  251. $bagfinish->status = 1;
  252. $bagfinish->updatetime = time();
  253. $res1 = $bagfinish->save();
  254. } else {
  255. $res1 = \app\common\model\NewBagFinish::insert(["user_id" => $user_id, "bag_id" => $v["id"], "status" => 1, "updatetime" => time()]);
  256. }
  257. break;
  258. }
  259. }
  260. return $res1;
  261. }
  262. }
  263. /**
  264. * 充值返利
  265. */
  266. private function rebate($user_id, $money)
  267. {
  268. // // 获取配置信息
  269. // $config = \app\common\model\RebateConfig::where(["recharge"=>$money])->find();
  270. // if(!$config) return true;
  271. // 找到当前用户的上级和上上级
  272. $userInfo = \app\common\model\User::get($user_id);
  273. if ($userInfo->pre_userid > 0) {
  274. $preUserInfo = \app\common\model\User::where(["id" => $userInfo->pre_userid])->find();// 上一级用户
  275. $this->addRebateMoney($preUserInfo->id, $user_id, $money, 1);
  276. if ($preUserInfo->pre_userid > 0) {
  277. $this->addRebateMoney($preUserInfo->pre_userid, $user_id, $money, 2);
  278. } else {
  279. return true;
  280. }
  281. } else {
  282. return true;
  283. }
  284. }
  285. /**
  286. * 添加返利金额
  287. */
  288. private function addRebateMoney($preUserId, $user_id, $money, $type)
  289. {
  290. Db::startTrans();
  291. try {
  292. // 添加返利记录表
  293. $data = [];
  294. $data["user_id"] = $preUserId;
  295. $data["by_user_id"] = $user_id;
  296. $data["money"] = $money;
  297. $data["rebate_money"] = 0.00;
  298. $data["rebate_type"] = $type;
  299. $data["createtime"] = time();
  300. $res1 = \app\common\model\RebateLog::insertGetId($data);
  301. // $res2 = (new \app\common\model\RebateLog)->execute("update hx_rebate_log set rebate_money = $rebatemoney where id = $res1");
  302. if ($res1) {
  303. Db::commit();
  304. }
  305. } catch (ValidateException $e) {
  306. Db::rollback();
  307. $this->error($e->getMessage());
  308. } catch (PDOException $e) {
  309. Db::rollback();
  310. $this->error($e->getMessage());
  311. } catch (Exception $e) {
  312. Db::rollback();
  313. $this->error($e->getMessage());
  314. }
  315. }
  316. }