101 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			101 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | ||
|  | 
 | ||
|  | namespace app\controller; | ||
|  | 
 | ||
|  | use app\repository\OrderRepository; | ||
|  | use app\service\wx\WechatPay; | ||
|  | use Exception; | ||
|  | use think\facade\Log; | ||
|  | use think\response\Redirect; | ||
|  | 
 | ||
|  | class Index extends Base | ||
|  | { | ||
|  |     /** | ||
|  |      * @return Redirect | ||
|  |      * @throws Exception | ||
|  |      */ | ||
|  |     public function index(): Redirect | ||
|  |     { | ||
|  |         return $this->redirect('/manager'); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * 退出 | ||
|  |      * | ||
|  |      * @return Redirect | ||
|  |      */ | ||
|  |     public function logout(): Redirect | ||
|  |     { | ||
|  |         session('frontend_auth', null); | ||
|  |         $req = $this->request->header('referer'); | ||
|  |         return $this->redirect($req); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * 微信的回调 | ||
|  |      * | ||
|  |      * @throws \EasyWeChat\Kernel\Exceptions\Exception | ||
|  |      */ | ||
|  |     public function callback() | ||
|  |     { | ||
|  |         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); | ||
|  |                 if (!$order = OrderRepository::getInstance()->findOneByWhere(['coding' => $message['out_trade_no']])) { | ||
|  |                     $this->log(sprintf("[微信支付回调][%s][%s]订单支付成功,但系统查无此订单 info:%s", date('Y-m-d H:i:s'), $message['out_trade_no'], $m), 'error'); | ||
|  |                     return true;//订单不存在
 | ||
|  |                 } | ||
|  | 
 | ||
|  |                 //记录日志
 | ||
|  |                 $this->log(sprintf("[微信支付回调][%s][%s]订单支付成功 info:%s", date('Y-m-d H:i:s'), $message['out_trade_no'], $m), 'info'); | ||
|  | 
 | ||
|  |                 if ($message['return_code'] === 'SUCCESS') { // return_code 表示通信状态,不代表支付状态
 | ||
|  |                     //更改订单状态
 | ||
|  |                     try { | ||
|  |                         $res = false; | ||
|  |                         // 用户是否支付成功
 | ||
|  |                         if (isset($message['result_code']) && $message['result_code'] === 'SUCCESS') { | ||
|  |                             //记录日志
 | ||
|  |                             $res = OrderRepository::getInstance()->setPaid($order['coding']); | ||
|  | 
 | ||
|  |                             $this->log(sprintf("[微信支付回调][%s][%s]订单支付成功 修改订单状态为%s", date('Y-m-d H:i:s'), $message['out_trade_no'], $res), 'info'); | ||
|  | 
 | ||
|  |                             // 用户支付失败
 | ||
|  |                         } elseif (isset($message['result_code']) && $message['result_code'] === 'FAIL') { | ||
|  |                             //记录日志
 | ||
|  |                             $this->log(sprintf("[微信支付回调][%s][%s]订单支付失败 修改订单状态为%s", date('Y-m-d H:i:s'), $message['out_trade_no'], $res), 'info'); | ||
|  |                         } | ||
|  | 
 | ||
|  |                         if (!$res) { | ||
|  |                             return $fail('Order status edit failed.'); | ||
|  |                         } | ||
|  |                     } catch (Exception $e) { | ||
|  |                         $this->log(sprintf("[微信支付回调][%s][%s]订单支付失败 失败原因:%s", date('Y-m-d H:i:s'), $message['out_trade_no'], $e->getMessage()), 'info'); | ||
|  |                         //错误信息 触发
 | ||
|  |                         return $fail('Order error.'); | ||
|  |                     } | ||
|  |                 } else { | ||
|  |                     return $fail('通信失败,请稍后再通知我'); | ||
|  |                 } | ||
|  | 
 | ||
|  |                 return true; | ||
|  |             }); | ||
|  | 
 | ||
|  |             $response->send(); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * 记录订单日志 | ||
|  |      * | ||
|  |      * @param string $message | ||
|  |      * @param string $type | ||
|  |      */ | ||
|  |     private function log(string $message, string $type = 'info'): void | ||
|  |     { | ||
|  |         Log::channel('order')->write($message, $type); | ||
|  |     } | ||
|  | } |