Notify.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  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. $transaction_id = $data['transaction_id'];
  32. Db::startTrans();
  33. try {
  34. $orderModel = new \app\common\model\RecharOrder();
  35. $userModel = new \app\common\model\User();
  36. $jewellogModel = new \app\common\model\UserJewelLog();
  37. $rechargelogModel = new \app\common\model\UserRechargeLog();
  38. $orderInfo = $orderModel->where(["order_no" => $out_trade_no])->find();
  39. $userInfo = $userModel->where(["id" => $orderInfo["user_id"]])->find();
  40. // 修改订单状态
  41. $res1 = $orderModel->update(["status" => 1,'transaction_id'=>$transaction_id], ["order_no" => $out_trade_no]);
  42. // 修改用户钻石余额
  43. $res2 = $userModel->where(["id" => $orderInfo["user_id"]])->setInc("jewel", $orderInfo["jewel"]);
  44. //判断是否首充
  45. $jewellogWhere['user_id'] = $orderInfo["user_id"];
  46. $jewellogWhere['type'] = 1;
  47. $userJewelLog = $jewellogModel->where($jewellogWhere)->find();
  48. $isFirst = 1;
  49. if (!empty($userJewelLog)) {
  50. $isFirst = 0;
  51. }
  52. $preUserId = $userInfo['pre_userid'];
  53. // 添加钻石流水记录
  54. $detail = "钻石充值";
  55. $res3 = $jewellogModel->addUserJewelLog($userInfo["id"], $orderInfo["jewel"], "+", $userInfo["jewel"], $detail, 1);
  56. // 添加充值记录
  57. $res4 = $rechargelogModel->addRecord($userInfo["id"], $orderInfo["jewel"], 0, bcadd($userInfo["jewel"], $orderInfo["jewel"], 2), $userInfo["money"], $orderInfo["platform"], 1,$isFirst,$preUserId);
  58. if ($res1 && $res2 && $res3 && $res4) {
  59. // 添加统计
  60. $userInfo->chargecount = $userInfo->chargecount + $payamount;
  61. $userInfo->chargetime = time();
  62. $userInfo->save();
  63. $userService = new UserService();
  64. $userService->inviteMoney(['user_id'=>$orderInfo["user_id"]]);
  65. // +EXP 充值任意金额
  66. \app\common\model\TaskLog::tofinish($orderInfo["user_id"], "5EMwg7la", 1);
  67. // 查询今日充值记录
  68. $today = strtotime(date("Y-m-d 00:00:00"));
  69. $rechargeMoney = \app\common\model\RecharOrder::where(["user_id" => $orderInfo["user_id"], "createtime" => ["gt", $today]])->sum("money");
  70. if ($rechargeMoney >= 100) {
  71. // +EXP 充值超过100
  72. \app\common\model\TaskLog::tofinish($orderInfo["user_id"], "DaCVgOLu", 1);
  73. }
  74. Db::commit();
  75. }
  76. } catch (ValidateException $e) {
  77. Db::rollback();
  78. $this->error($e->getMessage());
  79. } catch (PDOException $e) {
  80. Db::rollback();
  81. $this->error($e->getMessage());
  82. } catch (Exception $e) {
  83. Db::rollback();
  84. $this->error($e->getMessage());
  85. }
  86. //你可以在此编写订单逻辑
  87. } catch (Exception $e) {
  88. }
  89. echo $pay->success();
  90. }
  91. /**
  92. * 支付回调
  93. */
  94. public function alipaynotify()
  95. {
  96. $paytype = "alipay";
  97. $pay = Service::checkNotify($paytype);
  98. if (!$pay) {
  99. echo '签名错误';
  100. return;
  101. }
  102. $data = $pay->verify();
  103. /*$dataStr = '{
  104. "s": "\/api\/notify\/alipaynotify",
  105. "gmt_create": "2023-07-12 09:37:14",
  106. "charset": "utf-8",
  107. "seller_email": "ixiaoqiuqiu@qq.com",
  108. "subject": "充值钻石",
  109. "sign": "SzP5OgA9Z+qD8mSzMbAbKFsYOyB6fiH\/8itILn6YqX0Aloa5FnOxUHXEKCFlv5k3ya+OORjZPDq5mt7eZ3FvwJUasSWnMgDlSa6zWLGhlkKE3HXVAe777tkM5UgnVw53uJEr\/Ur2UsLpI+qEcrZAXhNAhA2nNNWhwkvrA1Fyc3iZERnbtJ3XNT\/8nnxGMBjhS3TWlr3VDZ\/bb26fvC1qHQ9Y6GGz8gvj3z30Fo7\/DlLFvH2HFSi6wky+33vWEtgug+klsqh6ziOWaVJhJKvnt2H+ltINiKLCshYVhu8ZBc856sV8noEwMmxPoFTW4CoG7ut\/3PKLjglygSOZblyf4Q==",
  110. "buyer_id": "2088702050034935",
  111. "invoice_amount": "0.01",
  112. "notify_id": "2023071201222093714034931493558779",
  113. "fund_bill_list": "[{&quot;amount&quot;:&quot;0.01&quot;,&quot;fundChannel&quot;:&quot;ALIPAYACCOUNT&quot;}]",
  114. "notify_type": "trade_status_sync",
  115. "trade_status": "TRADE_SUCCESS",
  116. "receipt_amount": "0.01",
  117. "app_id": "2021004103620776",
  118. "buyer_pay_amount": "0.01",
  119. "sign_type": "RSA2",
  120. "seller_id": "2088641467220712",
  121. "gmt_payment": "2023-07-12 09:37:14",
  122. "notify_time": "2023-07-12 09:37:14",
  123. "version": "1.0",
  124. "out_trade_no": "20230712093707239053",
  125. "total_amount": "0.01",
  126. "trade_no": "2023071222001434931415906799",
  127. "auth_app_id": "2021004103620776",
  128. "buyer_logon_id": "136****5934",
  129. "point_amount": "0.00"
  130. }';
  131. $data = json_decode($dataStr,true);*/
  132. try {
  133. $payamount = $data['total_amount'];
  134. $out_trade_no = $data['out_trade_no'];
  135. $trade_no = $data['trade_no'];
  136. Db::startTrans();
  137. try {
  138. $orderModel = new \app\common\model\RecharOrder();
  139. $userModel = new \app\common\model\User();
  140. $jewellogModel = new \app\common\model\UserJewelLog();
  141. $rechargelogModel = new \app\common\model\UserRechargeLog();
  142. $orderInfo = $orderModel->where(["order_no" => $out_trade_no])->find();
  143. $userInfo = $userModel->where(["id" => $orderInfo["user_id"]])->find();
  144. // 修改订单状态
  145. $res1 = $orderModel->update(["status" => 1,'transaction_id' => $trade_no], ["order_no" => $out_trade_no]);
  146. // 修改用户钻石余额
  147. $res2 = $userModel->where(["id" => $orderInfo["user_id"]])->setInc("jewel", $orderInfo["jewel"]);
  148. //判断是否首充
  149. $jewellogWhere['user_id'] = $orderInfo["user_id"];
  150. $jewellogWhere['type'] = 1;
  151. $userJewelLog = $jewellogModel->where($jewellogWhere)->find();
  152. $isFirst = 1;
  153. if (!empty($userJewelLog)) {
  154. $isFirst = 0;
  155. }
  156. $preUserId = $userInfo['pre_userid'];
  157. // 添加钻石流水记录
  158. $detail = "钻石充值";
  159. $res3 = $jewellogModel->addUserJewelLog($userInfo["id"], $orderInfo["jewel"], "+", $userInfo["jewel"], $detail, 1);
  160. // 添加充值记录
  161. $res4 = $rechargelogModel->addRecord($userInfo["id"], $orderInfo["jewel"], $payamount, bcadd($userInfo["jewel"], $orderInfo["jewel"], 2), $userInfo["money"], $orderInfo["platform"], 2,$isFirst,$preUserId);
  162. if ($res1 && $res2 && $res3 && $res4) {
  163. // 添加统计
  164. $userInfo->chargecount = $userInfo->chargecount + $payamount;
  165. $userInfo->chargetime = time();
  166. $userInfo->save();
  167. $userService = new UserService();
  168. $userService->inviteMoney(['user_id'=>$orderInfo["user_id"]]);
  169. // +EXP 充值任意金额
  170. \app\common\model\TaskLog::tofinish($orderInfo["user_id"], "5EMwg7la", 1);
  171. // 查询今日充值记录
  172. $today = strtotime(date("Y-m-d 00:00:00"));
  173. $rechargeMoney = \app\common\model\RecharOrder::where(["user_id" => $orderInfo["user_id"], "createtime" => ["gt", $today]])->sum("money");
  174. if ($rechargeMoney >= 100) {
  175. // +EXP 充值超过100
  176. \app\common\model\TaskLog::tofinish($orderInfo["user_id"], "DaCVgOLu", 1);
  177. }
  178. Db::commit();
  179. }
  180. } catch (ValidateException $e) {
  181. Db::rollback();
  182. $this->error($e->getMessage());
  183. } catch (PDOException $e) {
  184. Db::rollback();
  185. $this->error($e->getMessage());
  186. } catch (Exception $e) {
  187. Db::rollback();
  188. $this->error($e->getMessage());
  189. }
  190. //你可以在此编写订单逻辑
  191. } catch (Exception $e) {
  192. }
  193. echo $pay->success();
  194. }
  195. /**
  196. * 支付回调
  197. */
  198. public function wechatkjnotify()
  199. {
  200. $input = file_get_contents("php://input"); // 主题信息
  201. $dataArr = explode("&", urldecode($input));
  202. $data = [];
  203. if ($dataArr) foreach ($dataArr as $k => $v) {
  204. $vv = explode("=", $v);
  205. $data[$vv[0]] = $vv[1];
  206. }
  207. // 实例化支付类
  208. $kjpay = new kjpay();
  209. // 获取公共参数
  210. $config = config("kjPay");
  211. //密钥
  212. $key = $config["key"];
  213. $sign = $data['sign'];
  214. unset($data['sign']);
  215. if ($kjpay->local_sign($data, $key) == $sign) {
  216. //验签成功后,开始业务逻辑
  217. try {
  218. $payamount = $data['amount'];
  219. $out_trade_no = $data['merchant_order_no'];
  220. $pay_channel = $data['pay_channel'];
  221. Db::startTrans();
  222. try {
  223. $orderModel = new \app\common\model\RecharOrder();
  224. $userModel = new \app\common\model\User();
  225. $jewellogModel = new \app\common\model\UserJewelLog();
  226. $rechargelogModel = new \app\common\model\UserRechargeLog();
  227. $orderInfo = $orderModel->where(["order_no" => $out_trade_no])->find();
  228. $userInfo = $userModel->where(["id" => $orderInfo["user_id"]])->find();
  229. // 修改订单状态
  230. $res1 = $orderModel->update(["status" => 1], ["order_no" => $out_trade_no]);
  231. // 修改用户钻石余额
  232. $res2 = $userModel->where(["id" => $orderInfo["user_id"]])->setInc("jewel", $orderInfo["jewel"]);
  233. // 添加钻石流水记录
  234. $detail = "砖石充值";
  235. $res3 = $jewellogModel->addUserJewelLog($userInfo["id"], $orderInfo["jewel"], "+", $userInfo["jewel"], $detail, 1);
  236. // 添加充值记录
  237. $rechargeCount = $rechargelogModel->where('user_id',$orderInfo["user_id"])->count();
  238. $isFirstRecharge = $rechargeCount > 0 ? 0 : 1;
  239. $platformArr = ["wx_app_pay" => 1, "ali_wap_pay" => 2, "wx_public_pay" => 3];
  240. $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"]);
  241. if ($res1 && $res2 && $res3 && $res4) {
  242. // 添加统计
  243. $time = time();
  244. (new \app\common\model\User)->execute("update hx_user set chargecount = chargecount + $payamount,chargetime = $time where id = " . $userInfo["id"]);
  245. // \app\common\model\Test::update(["content"=>"update hx_user set chargecount = chargecount + $payamount,chargetime = $time where id = ".$userInfo["id"]],["id"=>1]);
  246. // 首充赠送
  247. $userInfo = \app\common\model\User::get($orderInfo["user_id"]);
  248. if ($userInfo->is_recharge == 0) { // 首充
  249. Db::startTrans();
  250. try {
  251. // 赠送消息尾灯
  252. $res1 = \app\common\model\AttireBack::addToMyBack(15, $orderInfo["user_id"]);
  253. $userInfo->is_recharge = 1;
  254. $res2 = $userInfo->save();
  255. if ($res1 && $res2) Db::commit();
  256. } catch (ValidateException $e) {
  257. Db::rollback();
  258. $this->error($e->getMessage());
  259. }
  260. }
  261. $this->rebate($orderInfo["user_id"], $data['amount']);
  262. // +EXP
  263. \app\common\model\TaskLog::tofinish($orderInfo["user_id"], "5EMwg7la", 1);
  264. // 查询今日充值记录
  265. $today = strtotime(date("Y-m-d 00:00:00"));
  266. $rechargeMoney = \app\common\model\RecharOrder::where(["user_id" => $orderInfo["user_id"], "createtime" => ["gt", $today]])->sum("money");
  267. if ($rechargeMoney >= 100) {
  268. // +EXP
  269. \app\common\model\TaskLog::tofinish($orderInfo["user_id"], "DaCVgOLu", 1);
  270. }
  271. // 查询新人礼包
  272. $this->addBagGift($orderInfo["user_id"], $data['amount']);
  273. Db::commit();
  274. echo "success";
  275. exit;
  276. }
  277. } catch (ValidateException $e) {
  278. Db::rollback();
  279. $this->error($e->getMessage());
  280. } catch (PDOException $e) {
  281. Db::rollback();
  282. $this->error($e->getMessage());
  283. } catch (Exception $e) {
  284. Db::rollback();
  285. $this->error($e->getMessage());
  286. }
  287. //你可以在此编写订单逻辑
  288. } catch (Exception $e) {
  289. }
  290. }
  291. }
  292. /**
  293. * 银联提现回调
  294. */
  295. public function cashoutNotify()
  296. {
  297. }
  298. /**
  299. * 更新新人礼包
  300. */
  301. private function addBagGift($user_id, $amount)
  302. {
  303. if (!$user_id || !$amount) return false;
  304. // 先看该用户是否有新人礼包特权
  305. $have = \app\common\model\NewBagHave::where(["user_id" => $user_id])->find();
  306. // print_r($have);exit;
  307. if ($have && time() - $have->createtime <= 7 * 86400) {
  308. $where = [];
  309. $where["value"] = ["elt", $amount];
  310. $bagInfo = \app\common\model\NewBag::where($where)->order("value", "desc")->select();
  311. if (!$bagInfo) return false;
  312. $res1 = false;
  313. foreach ($bagInfo as $k => $v) {
  314. // 查询完成情况
  315. $bagfinish = \app\common\model\NewBagFinish::where(["user_id" => $user_id, "bag_id" => $v["id"]])->find();
  316. if (!$bagfinish || $bagfinish->status <= 0) {
  317. if ($bagfinish) {
  318. $bagfinish->status = 1;
  319. $bagfinish->updatetime = time();
  320. $res1 = $bagfinish->save();
  321. } else {
  322. $res1 = \app\common\model\NewBagFinish::insert(["user_id" => $user_id, "bag_id" => $v["id"], "status" => 1, "updatetime" => time()]);
  323. }
  324. break;
  325. }
  326. }
  327. return $res1;
  328. }
  329. }
  330. /**
  331. * 充值返利
  332. */
  333. private function rebate($user_id, $money)
  334. {
  335. // // 获取配置信息
  336. // $config = \app\common\model\RebateConfig::where(["recharge"=>$money])->find();
  337. // if(!$config) return true;
  338. // 找到当前用户的上级和上上级
  339. $userInfo = \app\common\model\User::get($user_id);
  340. if ($userInfo->pre_userid > 0) {
  341. $preUserInfo = \app\common\model\User::where(["id" => $userInfo->pre_userid])->find();// 上一级用户
  342. $this->addRebateMoney($preUserInfo->id, $user_id, $money, 1);
  343. if ($preUserInfo->pre_userid > 0) {
  344. $this->addRebateMoney($preUserInfo->pre_userid, $user_id, $money, 2);
  345. } else {
  346. return true;
  347. }
  348. } else {
  349. return true;
  350. }
  351. }
  352. /**
  353. * 添加返利金额
  354. */
  355. private function addRebateMoney($preUserId, $user_id, $money, $type)
  356. {
  357. Db::startTrans();
  358. try {
  359. // 添加返利记录表
  360. $data = [];
  361. $data["user_id"] = $preUserId;
  362. $data["by_user_id"] = $user_id;
  363. $data["money"] = $money;
  364. $data["rebate_money"] = 0.00;
  365. $data["rebate_type"] = $type;
  366. $data["createtime"] = time();
  367. $res1 = \app\common\model\RebateLog::insertGetId($data);
  368. // $res2 = (new \app\common\model\RebateLog)->execute("update hx_rebate_log set rebate_money = $rebatemoney where id = $res1");
  369. if ($res1) {
  370. Db::commit();
  371. }
  372. } catch (ValidateException $e) {
  373. Db::rollback();
  374. $this->error($e->getMessage());
  375. } catch (PDOException $e) {
  376. Db::rollback();
  377. $this->error($e->getMessage());
  378. } catch (Exception $e) {
  379. Db::rollback();
  380. $this->error($e->getMessage());
  381. }
  382. }
  383. }