hospital-applets-api/app/Controller/CallBackController.php
2023-03-07 17:59:55 +08:00

191 lines
7.5 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Controller;
use App\Amqp\Producer\AssignDoctorProducer;
use App\Constants\HttpEnumCode;
use App\Exception\BusinessException;
use App\Model\OrderInquiry;
use App\Services\BaseService;
use App\Utils\Log;
use Extend\Wechat\WechatPay;
use Hyperf\Amqp\Producer;
use Hyperf\DbConnection\Db;
use Hyperf\HttpMessage\Stream\SwooleFileStream;
use Hyperf\HttpMessage\Stream\SwooleStream;
use Hyperf\Utils\ApplicationContext;
use Psr\Http\Message\ResponseInterface;
class CallBackController extends AbstractController
{
/**
* 患者端微信支付回调
* @return ResponseInterface
* @throws \Throwable
*/
public function wxPaySuccessCallBack(): ResponseInterface
{
Db::beginTransaction();
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));
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));
}
}