createApp(); $server = $app->getServer(); $message = $server->getRequestMessage(); if (empty($message)){ Db::rollBack(); return $this->response->withStatus(500)->withBody(new SwooleStream(strval(json_encode(['code' => 'ERROR', 'message' => "回调数据为空"], JSON_UNESCAPED_UNICODE)))); } // 验证推送消息签名 $app->getValidator()->validate($app->getRequest()); Log::getInstance()->info("微信支付回调数据:" . json_encode($message,JSON_UNESCAPED_UNICODE)); if (empty($message['out_trade_no'])){ Db::rollBack(); Log::getInstance()->info("微信支付回调数据错误"); return $server->serve(); } // 查询订单 $params = array(); $params['inquiry_no'] = $message['out_trade_no']; $order_inquiry = OrderInquiry::getOne($params); if (empty($order_inquiry)){ Db::rollBack(); Log::getInstance()->info("非法订单"); return $server->serve(); } // 验证订单状态 if ($order_inquiry['inquiry_status'] != 1){ // 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消) Db::rollBack(); Log::getInstance()->info("订单状态错误:当前为" . $order_inquiry['inquiry_status']); return $server->serve(); } // 支付状态无需验证,如第一次支付失败,会修改支付状态,再次支付时,会出现验证不通过的情况 // 修改支付状态 $data = array(); if ($message['trade_state'] == "SUCCESS"){ // 支付成功 $data['inquiry_pay_status'] = 2; $data['pay_time'] = date('Y-m-d H:i:s',strtotime($message['success_time']));// 支付时间 if ($order_inquiry['inquiry_type'] == 1 || $order_inquiry['inquiry_type'] == 3){ // 专家-公益 $data['inquiry_status'] = 3;// 3:待接诊 }elseif ($order_inquiry['inquiry_type'] == 2 || $order_inquiry['inquiry_type'] == 4){ // 快速-购药 $data['inquiry_status'] = 2;// 2:待分配 } }elseif($message['trade_state'] == "CLOSED"){ // 已关闭 $data['inquiry_pay_status'] = 6; }elseif($message['trade_state'] == "REVOKED"){ // 已撤销(付款码支付) $data['inquiry_pay_status'] = 7; }elseif($message['trade_state'] == "USERPAYING"){ // 用户支付中(付款码支付) $data['inquiry_pay_status'] = 3; }elseif($message['trade_state'] == "PAYERROR"){ // 支付失败(其他原因,如银行返回失败) $data['inquiry_pay_status'] = 4; } $data['escrow_trade_no'] = $message['transaction_id']; $data['updated_at'] = date('Y-m-d H:i:s',time()); $params = array(); $params['order_inquiry_id'] = $order_inquiry['order_inquiry_id']; OrderInquiry::edit($params,$data); // 处理分配医生问题 if ($message['trade_state'] == "SUCCESS"){ if ($order_inquiry['inquiry_type'] == 2 || $order_inquiry['inquiry_type'] == 4){ // 快速-购药 // 加入分配医生队列 $data = array(); $data['order_inquiry_id'] = $order_inquiry['order_inquiry_id']; $message = new AssignDoctorProducer($data); $producer = ApplicationContext::getContainer()->get(Producer::class); $result = $producer->produce($message); if (!$result) { Db::rollBack(); Log::getInstance()->info("加入分配医生队列失败"); return $this->wxPayErrorReturn("加入分配医生队列失败"); } }elseif ($order_inquiry['inquiry_type'] == 1 || $order_inquiry['inquiry_type'] == 3){ // 专家-公益 // 创建患者im账号 // 检测医生im账号 // 患者给医生发送im问诊消息 // 消息订阅通知队列 } } Db::commit(); return $server->serve(); }catch (\Exception $e) { // 验证失败 Db::rollBack(); Log::getInstance()->error("微信支付回调数据验证失败:" . $e->getMessage()); return $this->wxPayErrorReturn($e->getMessage()); } } public function wxPayRefundCallBack(): ResponseInterface { try { // 处理支付结果事件 $WechatPay = new WechatPay(1); $app = $WechatPay->createApp(); $server = $app->getServer(); $message = $server->getRequestMessage(); if (empty($message)){ Db::rollBack(); return $this->response->withStatus(500)->withBody(new SwooleStream(strval(json_encode(['code' => 'ERROR', 'message' => "回调数据为空"], JSON_UNESCAPED_UNICODE)))); } // 验证推送消息签名 $app->getValidator()->validate($app->getRequest()); Log::getInstance()->info("微信支付回调数据:" . json_encode($message,JSON_UNESCAPED_UNICODE)); return $server->serve(); }catch (\Exception $e) { // 验证失败 Db::rollBack(); Log::getInstance()->error("微信支付回调数据验证失败:" . $e->getMessage()); return $this->wxPayErrorReturn($e->getMessage()); } } /** * 微信支付返回错误响应 * @param string $message * @return ResponseInterface */ protected function wxPayErrorReturn(string $message): ResponseInterface { return $this->response ->withStatus(500) ->withBody( new SwooleStream( strval( json_encode(['code' => 'ERROR', 'message' => $message], JSON_UNESCAPED_UNICODE) ) ) ); } // im回调 public function imCallBack(){ $request_params = $this->request->all(); Log::getInstance()->info(json_encode($request_params,JSON_UNESCAPED_UNICODE)); } }