| 
									
										
										
										
											2021-11-24 14:41:24 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace app\controller\api; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use app\exception\RepositoryException; | 
					
						
							|  |  |  | use app\repository\BusinessRepository; | 
					
						
							|  |  |  | use app\repository\RechargeRepository; | 
					
						
							|  |  |  | use app\service\wx\WechatPay; | 
					
						
							|  |  |  | use app\model\Recharge as RechargeModel; | 
					
						
							|  |  |  | use think\facade\Db; | 
					
						
							|  |  |  | use think\facade\Log; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * 充值 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Class Recharge | 
					
						
							|  |  |  |  * @package app\controller\api | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | class Recharge extends Base | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     protected $noNeedLogin = ['query']; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * 查询是否支付成功 | 
					
						
							|  |  |  |      * */ | 
					
						
							|  |  |  |     public function query() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $orderNum = input("order_num/s"); | 
					
						
							|  |  |  |         if (empty($orderNum)) { | 
					
						
							|  |  |  |             return $this->json("4001", "参数错误"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         $recharge = RechargeRepository::getInstance()->getModel()->where(["order_num" => $orderNum])->lock(true)->find(); | 
					
						
							|  |  |  |         if (empty($recharge)) { | 
					
						
							|  |  |  |             return $this->json("4001", "订单不存在"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if ($recharge['state'] == RechargeModel::state_on) { | 
					
						
							|  |  |  |             return $this->json(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         $business = BusinessRepository::getInstance()->getModel()->where(["code" => $recharge['business_code']])->lock(true)->find(); | 
					
						
							|  |  |  |         if (empty($business)) { | 
					
						
							|  |  |  |             return $this->json("4001", "商家不存在"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         //查询  交易成功判断条件: return_code、result_code和trade_state都为SUCCESS
 | 
					
						
							|  |  |  |         $res = WechatPay::getInstance()->order->queryByOutTradeNumber($orderNum); | 
					
						
							|  |  |  |         if ($res['return_code'] == 'SUCCESS') { // return_code 表示通信状态,不代表支付状态
 | 
					
						
							|  |  |  |             if (isset($res['result_code']) && $res['result_code'] == 'SUCCESS') { | 
					
						
							|  |  |  |                 if (isset($res['trade_state']) && $res['trade_state'] == 'SUCCESS') { | 
					
						
							|  |  |  |                     Db::startTrans(); | 
					
						
							|  |  |  |                     try { | 
					
						
							|  |  |  |                         //这里确定支付成功
 | 
					
						
							|  |  |  |                         $total_fee = $res['total_fee'] / 100; | 
					
						
							|  |  |  |                         //加余额
 | 
					
						
							| 
									
										
										
										
											2021-11-29 13:56:26 +08:00
										 |  |  |                         $business->save([ | 
					
						
							|  |  |  |                             "balance" => ($business["balance"] + $total_fee), | 
					
						
							|  |  |  |                             "total_recharge" => ($business["total_recharge"] + $total_fee) | 
					
						
							|  |  |  |                         ]); | 
					
						
							| 
									
										
										
										
											2021-11-24 14:41:24 +08:00
										 |  |  |                         //修改支付状态
 | 
					
						
							|  |  |  |                         $recharge->save([ | 
					
						
							|  |  |  |                             "money" => $total_fee, | 
					
						
							|  |  |  |                             "state" => RechargeModel::state_on, | 
					
						
							| 
									
										
										
										
											2021-11-29 13:56:26 +08:00
										 |  |  |                             "open_id" => $res['openid'], | 
					
						
							| 
									
										
										
										
											2021-11-24 14:41:24 +08:00
										 |  |  |                             "update_time" => date("Y-m-d H:i:s"), | 
					
						
							|  |  |  |                             "balance" => $business->balance | 
					
						
							|  |  |  |                         ]); | 
					
						
							|  |  |  |                         Db::commit(); | 
					
						
							|  |  |  |                         return $this->json(); | 
					
						
							|  |  |  |                     } catch (RepositoryException $e) { | 
					
						
							|  |  |  |                         Db::rollback(); | 
					
						
							|  |  |  |                         return $this->json("5001", $e->getMessage()); | 
					
						
							|  |  |  |                     } catch (\Exception $e) { | 
					
						
							|  |  |  |                         Db::rollback(); | 
					
						
							|  |  |  |                         return $this->json("5001", "充值失败"); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return $this->json("4001", "未支付成功"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * 微信的回调 | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @throws \EasyWeChat\Kernel\Exceptions\Exception | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function notify(){ | 
					
						
							|  |  |  |         if ($this->request->isPost()) { | 
					
						
							|  |  |  |             $app      = WechatPay::getInstance(); | 
					
						
							|  |  |  |             $response = $app->handlePaidNotify(function ($message, $fail) { | 
					
						
							|  |  |  |                 //                $aa = '{"appid":"wxa02e44170bc722cd","bank_type":"OTHERS","cash_fee":"1","fee_type":"CNY","is_subscribe":"N","mch_id":"1605090111","nonce_str":"60f7d8a1e4ac8","openid":"oKrEm0ehgsy2ZTWzEva4tbLuUgFw","out_trade_no":"16268555858753004863","result_code":"SUCCESS","return_code":"SUCCESS","sign":"DB3F6CDCB7FBB3B9DDF7C0CC8BBD5AAD","time_end":"20210721162000","total_fee":"1","trade_type":"JSAPI","transaction_id":"4200001200202107217942681078"}';
 | 
					
						
							|  |  |  |                 //                $message = json_decode($aa, true);
 | 
					
						
							|  |  |  |                 $m     = json_encode($message, JSON_UNESCAPED_UNICODE); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 $recharge = RechargeRepository::getInstance()->getModel()->where(["order_num" => $message['out_trade_no']])->lock(true)->find(); | 
					
						
							|  |  |  |                 if (empty($recharge)) { | 
					
						
							|  |  |  |                     $this->log(sprintf("[微信支付回调][%s][%s]订单支付成功,但系统查无此订单 info:%s", date('Y-m-d H:i:s'), $message['out_trade_no'], $m), 'error'); | 
					
						
							|  |  |  |                     return true;//订单不存在
 | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 if ($recharge['state'] == RechargeModel::state_on) { | 
					
						
							|  |  |  |                     return true;//订单已经支付
 | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 $business = BusinessRepository::getInstance()->getModel()->where(["code" => $recharge['business_code']])->lock(true)->find(); | 
					
						
							|  |  |  |                 if (empty($business)) { | 
					
						
							|  |  |  |                     $this->log(sprintf("[微信支付回调][%s][%s]订单支付成功,但商家不存在 info:%s", date('Y-m-d H:i:s'), $message['out_trade_no'], $m), 'error'); | 
					
						
							|  |  |  |                     return true; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if ($message['return_code'] == 'SUCCESS') { // return_code 表示通信状态,不代表支付状态
 | 
					
						
							|  |  |  |                     if (isset($message['result_code']) && $message['result_code'] == 'SUCCESS') { | 
					
						
							|  |  |  |                         if (isset($message['trade_state']) && $message['trade_state'] == 'SUCCESS') { | 
					
						
							|  |  |  |                             Db::startTrans(); | 
					
						
							|  |  |  |                             try { | 
					
						
							|  |  |  |                                 //这里确定支付成功
 | 
					
						
							|  |  |  |                                 $total_fee = $message['total_fee'] / 100; | 
					
						
							|  |  |  |                                 //加余额
 | 
					
						
							| 
									
										
										
										
											2021-11-29 13:56:26 +08:00
										 |  |  |                                 $business->inc()->save([ | 
					
						
							|  |  |  |                                     "balance" => ($business["balance"] + $total_fee), | 
					
						
							|  |  |  |                                     "total_recharge" => ($business["total_recharge"] + $total_fee)] | 
					
						
							|  |  |  |                                 ); | 
					
						
							| 
									
										
										
										
											2021-11-24 14:41:24 +08:00
										 |  |  |                                 //修改支付状态
 | 
					
						
							|  |  |  |                                 $recharge->save([ | 
					
						
							|  |  |  |                                     "money" => $total_fee, | 
					
						
							|  |  |  |                                     "state" => RechargeModel::state_on, | 
					
						
							| 
									
										
										
										
											2021-11-29 13:56:26 +08:00
										 |  |  |                                     "open_id" => $message['openid'], | 
					
						
							| 
									
										
										
										
											2021-11-24 14:41:24 +08:00
										 |  |  |                                     "update_time" => date("Y-m-d H:i:s"), | 
					
						
							|  |  |  |                                     "balance" => $business->balance | 
					
						
							|  |  |  |                                 ]); | 
					
						
							|  |  |  |                                 Db::commit(); | 
					
						
							|  |  |  |                                 //记录日志
 | 
					
						
							|  |  |  |                                 $this->log(sprintf("[微信支付回调][%s][%s]订单支付成功 info:%s", date('Y-m-d H:i:s'), $message['out_trade_no'], $m), 'info'); | 
					
						
							|  |  |  |                                 return true; | 
					
						
							|  |  |  |                             } catch (RepositoryException $e) { | 
					
						
							|  |  |  |                                 Db::rollback(); | 
					
						
							|  |  |  |                                 $this->log(sprintf("[微信支付回调][%s][%s]订单支付成功-修改订单状态失败-RepositoryException info:%s", date('Y-m-d H:i:s'), $message['out_trade_no'], $m), 'info'); | 
					
						
							|  |  |  |                                 return $fail('Order status edit failed.'); | 
					
						
							|  |  |  |                             } catch (\Exception $e) { | 
					
						
							|  |  |  |                                 Db::rollback(); | 
					
						
							|  |  |  |                                 $this->log(sprintf("[微信支付回调][%s][%s]订单支付成功-修改订单状态失败-Exception info:%s", date('Y-m-d H:i:s'), $message['out_trade_no'], $m), 'info'); | 
					
						
							|  |  |  |                                 return $fail('Order status edit failed.'); | 
					
						
							|  |  |  |                             } | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 return $fail('通信失败,请稍后再通知我'); | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $response->send(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * 记录订单日志 | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $message | 
					
						
							|  |  |  |      * @param string $type | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     private function log(string $message, string $type = 'info'): void | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         Log::channel('order')->write($message, $type); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |