Notify.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. <?php
  2. /**
  3. * @copyright Copyright (c) 2017 https://www.sapixx.com All rights reserved.
  4. * @license Licensed (http://www.apache.org/licenses/LICENSE-2.0).
  5. * @author pillar<ltmn@qq.com>
  6. * 支付回调通知
  7. */
  8. namespace app\ais\controller\api\v1;
  9. use app\common\facade\WechatPay;
  10. use app\ais\controller\api\Base;
  11. use app\ais\model\AisBank;
  12. use app\ais\model\AisBill;
  13. use app\ais\model\AisCouponUser;
  14. use app\ais\model\AisOrder;
  15. use app\ais\model\AisShop;
  16. use app\ais\model\AisShopCoupon;
  17. use app\ais\model\AisShopOrder;
  18. use app\ais\model\AisStoreBill;
  19. use app\ais\model\AisVip;
  20. use app\ais\model\AisVipOrder;
  21. use app\ais\model\AisVipUser;
  22. use app\ais\model\AisInfo;
  23. use app\ais\model\AisInfoOrder;
  24. use app\ais\model\AisConfig;
  25. use think\facade\Log;
  26. use filter\Filter;
  27. use Exception;
  28. class Notify extends Base{
  29. /**
  30. * 微信付款买单
  31. * @return void
  32. */
  33. public function storePay(){
  34. try {
  35. $response = WechatPay::doPay($this->miniapp_id)->handlePaidNotify(function ($message,$fail) {
  36. $result = AisOrder::where(['state' => 0,'order_no' => Filter::filter_escape($message['out_trade_no'])])->find();
  37. if (empty($result)) {
  38. return true;
  39. }
  40. if ($message['return_code'] === 'SUCCESS') {
  41. if ($message['result_code'] === 'SUCCESS') {
  42. $sub_mchid = $message['sub_mch_id'] ?? '';
  43. $ispay = WechatPay::doPay($this->miniapp_id,false,$sub_mchid)->order->queryByOutTradeNumber($result->order_no);
  44. if ($ispay['return_code'] === 'SUCCESS') {
  45. if ($ispay['result_code'] === 'SUCCESS') {
  46. if ($ispay['trade_state'] === 'SUCCESS'){
  47. //订单状态
  48. $result->state = 1;
  49. $result->paid_time = strtotime($ispay['time_end']);
  50. $result->paid_no = $ispay['transaction_id'];
  51. //收益计算
  52. $result = AisOrder::income($result,money($ispay['total_fee'] / 100),$ispay['attach']);
  53. //消费日志
  54. AisBill::add([
  55. 'member_miniapp_id' => $this->miniapp_id,
  56. 'store_id' => $result->store_id,
  57. 'money' => -$result->price,
  58. 'uid' => $result->uid
  59. ],'微信支付[消费]');
  60. AisStoreBill::add([
  61. 'member_miniapp_id' => $this->miniapp_id,
  62. 'store_id' => $result->store_id,
  63. 'store_chain_id' => $result->store_chain_id,
  64. 'money' => $result->real,
  65. 'pay_uid' => $result->uid
  66. ],'微信支付[收款]');
  67. if ($result->coupon_user_id > 0) {
  68. AisCouponUser::where(['id' => $result->coupon_user_id])->update(['is_end' => 1,'money' => money($result->amount - $result->price),'update_time' => time()]); //优惠券减少
  69. }
  70. $vip_user = AisVipUser::where(['member_miniapp_id' => $this->miniapp_id,'uid' => $result->uid])->find();
  71. if(empty($vip_user)){
  72. $vip = AisVip::where(['member_miniapp_id' => $this->miniapp_id,'is_lock' => 0])->order('sort desc')->find();
  73. if(!empty($vip)){
  74. AisVipUser::create([
  75. 'update_time' => time(),
  76. 'is_lock' => 0,
  77. 'vip_id' => $vip->id,
  78. 'uid' => $result->uid,
  79. 'member_miniapp_id' => $this->miniapp_id
  80. ]);
  81. AisVipOrder::create([
  82. 'create_time' => time(),
  83. 'amount' => 0,
  84. 'vip_id' => $vip->id,
  85. 'uid' => $result->uid,
  86. 'member_miniapp_id' => $this->miniapp_id,
  87. 'state' => $result->state,
  88. 'order_no' => $result->order_no,
  89. 'paid_time' => $result->paid_time,
  90. 'paid_no' => $result->paid_no
  91. ]);
  92. }
  93. }
  94. //积分增加
  95. $bank = AisBank::where(['uid' => $result->uid])->find();
  96. if(empty($bank)){
  97. $bank = new AisBank;
  98. $bank->uid = $result->uid;
  99. $bank->member_miniapp_id = $result->member_miniapp_id;
  100. $bank->point = 0;
  101. }
  102. $bank->point = $bank->point + intval($result->price);
  103. $bank->save();
  104. $result->allowField(true)->save();
  105. AisOrder::subsidy($result);
  106. return true;
  107. }
  108. }
  109. }
  110. }
  111. }
  112. return $fail('通信失败,请稍后再通知我');
  113. });
  114. $response->send();
  115. }catch (Exception $e) {
  116. $this->error('页面不存在');
  117. }
  118. }
  119. /**
  120. * 优选下单
  121. * @return void
  122. */
  123. public function shop(){
  124. try{
  125. $response = WechatPay::doPay($this->miniapp_id)->handlePaidNotify(function ($message,$fail) {
  126. $result = AisShopOrder::where(['status'=>0,'paid_at'=>0,'is_del'=>0,'order_no' => Filter::filter_escape($message['out_trade_no'])])->find();
  127. if (empty($result)) {
  128. return true;
  129. }
  130. if ($message['return_code'] === 'SUCCESS') {
  131. if ($message['result_code'] === 'SUCCESS') {
  132. $sub_mchid = $message['sub_mch_id'] ?? '';
  133. $ispay = WechatPay::doPay($this->miniapp_id,false,$sub_mchid)->order->queryByOutTradeNumber($result->order_no);
  134. if ($ispay['return_code'] === 'SUCCESS') {
  135. if ($ispay['result_code'] === 'SUCCESS') {
  136. if ($ispay['trade_state'] === 'SUCCESS') {
  137. //修改订单状态和减少库存
  138. $result->paid_at = 1;
  139. $result->paid_time = strtotime($ispay['time_end']);
  140. $result->paid_no = $ispay['transaction_id'];
  141. AisShop::where(['id' => $result->shop_id])->setDec('warehouse_num',1); //减库存
  142. //减去所用积分
  143. if($result['points']){
  144. $user = AisVipUser::where(['member_miniapp_id'=>$this->miniapp_id,'uid' => $result->user_id,'is_lock' => 0])->find();
  145. $user->point = $user->point - $result->points;
  146. $user->point = $user->point + intval($result->amount);
  147. $user->update_time = time();
  148. $user->save();
  149. }
  150. //增加日志
  151. AisBill::add([
  152. 'miniapp_id' => $this->miniapp_id,
  153. 'store_id' => $result->store_id,
  154. 'money' => -$result->amount,
  155. 'uid' => $result->user_id
  156. ],'微信支付[购买商品]');
  157. $result = AisShopOrder::income($result->toArray(),money($ispay['total_fee'] / 100),$ispay['attach']);
  158. AisStoreBill::add([
  159. 'miniapp_id' => $result->member_miniapp_id,
  160. 'uid' => $result->user_id,
  161. 'store_id' => $result->store_id,
  162. 'pay_uid' => $result->uid,
  163. 'money' => $result->real
  164. ],'优选下单结算到商户号');
  165. //赠送优惠券
  166. AisCouponUser::addUserCoupon(json_encode(AisShopCoupon::where(['member_miniapp_id'=>$this->miniapp_id,'shop_id' => $result->shop_id])->column('coupon_id')),$result->user_id);
  167. $result->allowField(true)->save();
  168. return true;
  169. }
  170. }
  171. }
  172. }
  173. }
  174. return $fail('通信失败,请稍后再通知我');
  175. });
  176. $response->send();
  177. }catch (Exception $e) {
  178. $this->error('页面不存在');
  179. }
  180. }
  181. /**
  182. * 发布付费城市号
  183. * @return void
  184. */
  185. public function infoSend(){
  186. try {
  187. $response = WechatPay::doPay($this->miniapp_id)->handlePaidNotify(function($message,$fail){
  188. $order = AisInfo::where(['paid_at'=>0,'order_no' => Filter::filter_escape($message['out_trade_no'])])->find();
  189. if (empty($order)) {
  190. return true;
  191. }
  192. if ($message['return_code'] === 'SUCCESS') {
  193. if($message['result_code'] === 'SUCCESS'){
  194. $sub_mchid = $message['sub_mch_id'] ?? '';
  195. $ispay = WechatPay::doPay($this->miniapp_id,false,$sub_mchid)->order->queryByOutTradeNumber($order->order_no);
  196. if ($ispay['return_code'] === 'SUCCESS') {
  197. if ($ispay['result_code'] === 'SUCCESS') {
  198. if ($ispay['trade_state'] === 'SUCCESS') {
  199. $order->is_top = 1;
  200. $order->paid_at = 1;
  201. $order->paid_no = $ispay['transaction_id'];
  202. $order->paid_time = strtotime($ispay['time_end']);
  203. $order->save();
  204. $vip_user = AisVipUser::where(['member_miniapp_id' => $this->miniapp_id,'uid' => $order->uid])->find();
  205. if($vip_user){
  206. //增加积分
  207. $vip_user->point = $vip_user->point + intval($order->price);
  208. $vip_user->update_time = time();
  209. $vip_user->save();
  210. }
  211. return true;
  212. }
  213. }
  214. }
  215. }
  216. }
  217. return $fail('通信失败,请稍后再通知我');
  218. });
  219. $response->send();
  220. }catch (Exception $e) {
  221. $this->error('页面不存在');
  222. }
  223. }
  224. /**
  225. * 城市号下单
  226. * @return void
  227. */
  228. public function infoOrder(){
  229. try {
  230. $response = WechatPay::doPay($this->miniapp_id)->handlePaidNotify(function($message,$fail){
  231. $order = AisInfoOrder::where(['paid_at'=>0,'order_no' => Filter::filter_escape($message['out_trade_no'])])->find();
  232. if (empty($order)) {
  233. return true;
  234. }
  235. if ($message['return_code'] === 'SUCCESS') {
  236. if($message['result_code'] === 'SUCCESS'){
  237. $sub_mchid = $message['sub_mch_id'] ?? '';
  238. $ispay = WechatPay::doPay($this->miniapp_id,false,$sub_mchid)->order->queryByOutTradeNumber($order->order_no);
  239. if ($ispay['return_code'] === 'SUCCESS') {
  240. if ($ispay['result_code'] === 'SUCCESS') {
  241. if ($ispay['trade_state'] === 'SUCCESS') {
  242. //修改订单状态
  243. $order->paid_at = 1;
  244. $order->paid_no = $ispay['transaction_id'];;
  245. $order->paid_time = strtotime($ispay['time_end']);
  246. $order->save();
  247. //扣除服务费到账
  248. $setting = AisConfig::getConfig($this->miniapp_id);
  249. $amount = money($order->amount-(money(abs($order->amount*$setting->charge/100))));
  250. AisBill::add(['member_miniapp_id' => $this->miniapp_id,'store_id' => 0,'money' => $amount,'uid' => $order->uid,'pay_uid' => $order->uid], '城市号下单');
  251. AisBill::add(['member_miniapp_id' => $this->miniapp_id,'store_id' => 0,'money' => $amount,'uid' => $order->info_uid,'pay_uid' => $order->uid], '城市号订单');
  252. $vip_user = AisVipUser::where(['member_miniapp_id' => $this->miniapp_id,'uid' => $order->uid])->find();
  253. if($vip_user){
  254. //增加积分
  255. $vip_user->point = $vip_user->point + intval($order->amount);
  256. $vip_user->update_time = time();
  257. $vip_user->save();
  258. }
  259. return true;
  260. }
  261. }
  262. }
  263. }
  264. }
  265. return $fail('通信失败,请稍后再通知我');
  266. });
  267. $response->send();
  268. }catch (Exception $e) {
  269. $this->error('页面不存在');
  270. }
  271. }
  272. /**
  273. * 开通会员支付回调
  274. */
  275. public function vipPay(){
  276. try {
  277. $response = WechatPay::doPay($this->miniapp_id)->handlePaidNotify(function ($message,$fail) {
  278. $result = AisVipOrder::where(['state' => 0,'order_no' => Filter::filter_escape($message['out_trade_no'])])->find();
  279. if (empty($result)) {
  280. return true;
  281. }
  282. if ($message['return_code'] === 'SUCCESS') {
  283. if ($message['result_code'] === 'SUCCESS') {
  284. $sub_mchid = $message['sub_mch_id'] ?? '';
  285. $ispay = WechatPay::doPay($this->member_miniapp_id,false,$sub_mchid)->order->queryByOutTradeNumber($result->order_no);
  286. if ($ispay['return_code'] === 'SUCCESS') {
  287. if ($ispay['result_code'] === 'SUCCESS') {
  288. if ($ispay['trade_state'] === 'SUCCESS'){
  289. //订单状态
  290. $result->state = 1;
  291. $result->paid_time = strtotime($ispay['time_end']);
  292. $result->paid_no = $ispay['transaction_id'];
  293. //收益计算
  294. AisVipOrder::income($result,money($ispay['total_fee']/100));
  295. //消费日志
  296. AisBill::add(['member_miniapp_id' => $this->member_miniapp_id,'store_id' => 0,'money' =>-$result->amount,'uid' => $result->uid],'微信支付[开通会员]');
  297. //重置并锁定其它级别会员
  298. AisVipUser::where(['uid' => $result->uid])->update(['is_lock' => 1]);
  299. //新增开通当前会员
  300. AisVipUser::create(['member_miniapp_id' => $this->member_miniapp_id,'uid' => $result->uid,'vip_id' => $result->vip_id,'is_lock' => 0,'update_time' => time()]);
  301. AisBank::points($this->member_miniapp_id,$result->uid,$result->amount);
  302. //领取的优惠券
  303. AisCouponUser::addUserCoupon($result->coupon_ids,$result->uid);
  304. $result->allowField(true)->save();
  305. return 'true';
  306. }
  307. }
  308. }
  309. }
  310. }
  311. return $fail('通信失败,请稍后再通知我');
  312. });
  313. $response->send();
  314. }catch (Exception $e) {
  315. $this->error('页面不存在');
  316. }
  317. }
  318. }