diff --git a/app/Amqp/Consumer/SendSmsMessageConsumer.php b/app/Amqp/Consumer/SendSmsMessageConsumer.php index 8552bff..1078584 100644 --- a/app/Amqp/Consumer/SendSmsMessageConsumer.php +++ b/app/Amqp/Consumer/SendSmsMessageConsumer.php @@ -23,43 +23,47 @@ use Psr\Container\NotFoundExceptionInterface; #[Consumer(exchange: 'amqp.direct', routingKey: 'SendSmsMessage', queue: 'send.sms.message.queue', nums: 1)] class SendSmsMessageConsumer extends ConsumerMessage { + /** + * @param $data + * [ + * "template_code" => "SMS_123", + * "template_param" => [ + * // 参数不确定,主要看短信模版的不同 + * ], + * "scene_desc" => "场景描述", + * "phone" => "手机号", + * "user_id" => "用户id(被推送者)" + * ] + * @param AMQPMessage $message + * @return string + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface + */ public function consumeMessage($data, AMQPMessage $message): string { - /** - * data = [ - * "template_code" => "SMS_123", - * "template_param" => [ - * // 参数不确定,主要看短信模版的不同 - * ], - * "scene_desc" => "场景描述", - * "phone" => "手机号", - * "user_id" => "用户id(被推送者)" - * ] - */ - Log::getInstance()->error("开始执行 发送短信 队列:" . json_encode($data, JSON_UNESCAPED_UNICODE)); if (!isset($data['template_code']) || !isset($data['template_param'])){ - Log::getInstance()->error("发送短信失败:发送参数错误"); + Log::getInstance()->error("队列发送短信失败:发送参数错误"); return Result::DROP;// 销毁 } // 验证发送参数 $res = $this->checkTemplateParam($data['template_code'],$data['template_param']); if (!$res){ - Log::getInstance()->error("发送短信失败:发送参数错误"); + Log::getInstance()->error("队列发送短信失败:发送参数错误"); return Result::DROP;// 销毁 } - try { - $redis = $this->container->get(Redis::class); + $redis = $this->container->get(Redis::class); + $redis_key = "sms_" . $data['phone'] . $data['template_code']; - $redis_key = "sms_" . $data['phone'] . $data['template_code']; + try { $result = $redis->get($redis_key); if (!empty($result)){ - if ( $result > 3){ + if ( $result > 2){ // 超出规定时间内最大获取次数 - Log::getInstance()->error("发送短信失败:超出最大发送重试次数"); + Log::getInstance()->error("队列发送短信失败:超出最大发送重试次数"); return Result::DROP;// 销毁 } } @@ -67,15 +71,19 @@ class SendSmsMessageConsumer extends ConsumerMessage // 发送短信 Dysms::sendSms($data['phone'],$data['template_param'],$data['template_code'],$data['scene_desc']); + // 删除缓存 + if (!empty($result)){ + $redis->del($redis_key); + } } catch (\Exception $e) { - Log::getInstance()->error("发送短信失败:" . $e->getMessage()); + Log::getInstance()->error("队列发送短信失败:" . $e->getMessage()); + + // 增加发送次数 + $redis->incr($redis_key); return Result::REQUEUE; // 重回队列 - } catch (NotFoundExceptionInterface|ContainerExceptionInterface $e) { - Log::getInstance()->error("发送短信失败:" . $e->getMessage()); - return Result::DROP; // 销毁 } - Log::getInstance()->info("发送短信成功"); + Log::getInstance()->info("队列发送短信成功"); return Result::ACK; } @@ -184,16 +192,13 @@ class SendSmsMessageConsumer extends ConsumerMessage // 医生修改简介审核拒绝 break; default: - // code... + // 非法模版 + return false; break; } return true; } - // 记录发送失败log - private function addSendFailLog(array $data){ - $data = array(); -// $data['to_user_id'] - } -} + +} \ No newline at end of file diff --git a/app/Amqp/Consumer/SendSubMessageConsumer.php b/app/Amqp/Consumer/SendSubMessageConsumer.php index 78fa406..3a926f4 100644 --- a/app/Amqp/Consumer/SendSubMessageConsumer.php +++ b/app/Amqp/Consumer/SendSubMessageConsumer.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace App\Amqp\Consumer; +use App\Amqp\Producer\SendSmsMessageProducer; use App\Constants\HttpEnumCode; use App\Exception\BusinessException; use App\Model\LogMessagePush; @@ -14,9 +15,11 @@ use App\Model\UserPatient; use App\Services\UserService; use App\Utils\Log; use Extend\Wechat\Wechat; +use Hyperf\Amqp\Producer; use Hyperf\Amqp\Result; use Hyperf\Amqp\Annotation\Consumer; use Hyperf\Amqp\Message\ConsumerMessage; +use Hyperf\DbConnection\Db; use PhpAmqpLib\Message\AMQPMessage; use Psr\Container\ContainerExceptionInterface; use Psr\Container\NotFoundExceptionInterface; @@ -28,6 +31,7 @@ use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface; /** * 发送订阅消息 + * 每条消息都需携带发送短信参数,用户可能拒绝接受订阅消息 */ #[Consumer(exchange: 'amqp.direct', routingKey: 'SendSubMessage', queue: 'send.sub.message.queue', nums: 1)] class SendSubMessageConsumer extends ConsumerMessage @@ -35,18 +39,30 @@ class SendSubMessageConsumer extends ConsumerMessage /** * @param $data * [ - * "push_user_id" // 用户id(被推送者) - * "template_title" // 推送的模版名称 - * "params" => [ // 推送所需的参数 - * "page" // 跳转页面 - * "data" => [ - * "thing1" => [ - * "value" => [ - * "参数1" - * ] + * "sub_data" => [ + * "push_user_id" // 用户id(被推送者) + * "template_title" // 推送的模版名称 + * "send_reason" // 发送原因 + * "params" => [ // 推送所需的参数 + * "page" // 跳转页面 + * "data" => [ + * "key1" => "value1" // 入参数据结构 +// * "thing1" => [ // 发送时处理的数据结构 +// * "value" => [ +// * "参数1" +// * ] +// * ] * ] - * ] - * + * ], + * ] + * "sms_data" => [ // 短信所需的参数,如订阅发送失败需发送短信 + * "template_code" => "SMS_123", + * "template_param" => [ + * // 参数不确定,主要看短信模版的不同 + * ], + * "scene_desc" => "场景描述", + * "phone" => "手机号", + * "user_id" => "用户id(被推送者)" * ] * ] * @param AMQPMessage $message @@ -61,36 +77,69 @@ class SendSubMessageConsumer extends ConsumerMessage */ public function consumeMessage($data, AMQPMessage $message): string { + Log::getInstance()->info("开始执行 发送订阅消息 队列:" . json_encode($data, JSON_UNESCAPED_UNICODE)); + try { // 获取被推送用户信息 $params = array(); $params['user_id'] = $data['push_user_id']; $user = User::getOne($params); if (empty($user)){ - $this->addMessagePushLog($data,"未查询到被推送用户信息"); + Log::getInstance()->error("队列发送订阅消息执行失败:未查询到被推送用户信息"); return Result::ACK; } + // 验证发送参数 + if (empty($data['sub_data']['params']['data'])){ + Log::getInstance()->error("队列发送订阅消息执行失败:无推送数据"); + $this->saveErrorPushLog($user['user_type'],$data['sub_data'],"无推送数据"); + + return Result::DROP; + } + + // 处理发送参数 + $send_data = array(); + foreach ($data['sub_data']['params']['data'] as $key => $item){ + $send_data[$key] = [ + "value" => [ + $item + ] + ]; + } + + if (empty($send_data)){ + Log::getInstance()->error("队列发送订阅消息执行失败:发送参数处理失败"); + $this->saveErrorPushLog($user['user_type'],$data['sub_data'],"发送参数处理失败"); + + return Result::DROP; + } + + // 获取open_id $UserService = new UserService(); $open_id = $UserService->getOpenIdWithUserId($user['user_id'],$user['user_type']); if (empty($open_id)){ - $this->addMessagePushLog($data,"未获取到被推送用户open_id"); + Log::getInstance()->error("队列发送订阅消息执行失败:未获取到被推送用户open_id"); + $this->saveErrorPushLog($user['user_type'],$data['sub_data'],"未获取到被推送用户open_id"); + + // 执行发送短信步骤 + $this->addSendSmsMessageQueue($data['sms_data']); + return Result::ACK; } - // 获取订阅消息模版数据 - $params = array(); - $params['client_type'] = $user['user_type']; // 客户端类型(1:患者端 2:医师端 3:药师端) - $params['template_title'] = $data['template_title']; - $sub_template = SubTemplate::getOne($params); - if (empty($sub_template)){ - $this->addMessagePushLog($data,"未查询到推送模版id"); + // 获取消息模版 + $sub_template = $this->getSubTemplate($user['user_type'],$data['sub_data']['template_title']); + if (empty($template_title)){ + Log::getInstance()->error("队列发送订阅消息执行失败:未获取到需要发送的消息模版数据"); + $this->saveErrorPushLog($user['user_type'],$data['sub_data'],"未获取到需要发送的消息模版数据"); + + // 执行发送短信步骤 + $this->addSendSmsMessageQueue($data['sms_data']); + return Result::ACK; } - $sub_template = $sub_template->toArray(); - // 处理发送环境 $miniprogram_state = "developer"; if (env("APP_ENV") == "prod"){ @@ -99,9 +148,9 @@ class SendSubMessageConsumer extends ConsumerMessage $options = [ "template_id" => $sub_template['wx_template_id'], - "page" => $data['params']['page'], + "page" => $sub_template['page'] ?: "", "touser" => $open_id, - "data" => $data['params']['data'], + "data" => $send_data, "miniprogram_state" => $miniprogram_state, "lang" => "zh_CN", ]; @@ -109,48 +158,217 @@ class SendSubMessageConsumer extends ConsumerMessage // 发起推送 $Wechat = new Wechat($user['user_type']); $result = $Wechat->sendSubscribeMessage($options); - Log::getInstance()->info("订阅消息推送成功:" . $result); + if (empty($result)){ + Log::getInstance()->error("队列发送订阅消息执行失败:推送失败"); + $this->saveErrorPushLog($user['user_type'],$data['sub_data'],"推送失败"); + } - // 记录推送记录 - $this->addMessagePushLog($data,"",$sub_template['wx_template_id'],1,json_encode($options,JSON_UNESCAPED_UNICODE)); + if (!isset($result['errcode'])){ + Log::getInstance()->error("队列发送订阅消息执行失败:推送失败,返回值错误" . json_encode($result,JSON_UNESCAPED_UNICODE)); + $this->saveErrorPushLog($user['user_type'],$data['sub_data'],"推送失败,返回值错误"); + } + + if ($result['errcode'] == 43101){ + Log::getInstance()->error("队列发送订阅消息执行失败:用户拒绝接收消息"); + $this->saveErrorPushLog($user['user_type'],$data['sub_data'],"用户拒绝接收消息"); + + // 执行发送短信步骤 + $this->addSendSmsMessageQueue($data['sms_data']); + + return Result::ACK; + } + + Log::getInstance()->info("队列发送订阅消息执行成功"); + $this->saveSuccessPushLog($user['user_type'],$data['sub_data']); } catch (\Exception $e) { - $this->addMessagePushLog($data,$e->getMessage()); - return Result::ACK; + Log::getInstance()->error("队列发送订阅消息执行失败:" . $e->getMessage()); + $this->saveErrorPushLog($user['user_type'],$data['sub_data'],$e->getMessage()); } return Result::ACK; } /** - * 增加日志 - * @param array $params 推送参数 - * @param string $wx_template_id 微信推送模版id - * @param int $status 推送状态(1:成功 2:失败) - * @param string $fail_reason 推送失败原因 - * @param string $content 推送内容 + * 记录成功日志 + * @param string|int $user_type 用户类型 + * @param array $sub_data 需发送的订阅消息数据 + * @return void */ - public function addMessagePushLog(array $params,string $fail_reason = '',string $wx_template_id = "",int $status = 2,string $content = '') + private function saveSuccessPushLog(string|int $user_type,array $sub_data): void { $data = array(); - $data['push_user_id'] = $params['push_user_id']; - $data['template_title'] = $params['template_title']; - if (!empty($wx_template_id)){ - $data['wx_template_id'] = $wx_template_id; - } - - $data['params'] = json_encode($params,JSON_UNESCAPED_UNICODE); - $data['status'] = $status; - if (!empty($fail_reason)){ - $data['fail_reason'] = $fail_reason; - } - if (!empty($content)){ - $data['content'] = $content; - } - + $data['to_user_id'] = $sub_data['push_user_id']; + $data['user_type'] = $user_type; + $data['type'] = 2; + $data['status'] = 1; + $data['send_reason'] = $sub_data['send_reason']; + $data['content'] = json_encode($sub_data['params'],JSON_UNESCAPED_UNICODE); $log_message_push = LogMessagePush::addLogMessagePush($data); if (empty($log_message_push)){ - Log::getInstance()->error("增加推送日志失败:" . json_encode($data,JSON_UNESCAPED_UNICODE)); + Log::getInstance()->error("队列发送订阅消息成功,增加推送日志失败:" . json_encode($data,JSON_UNESCAPED_UNICODE)); } } + + /** + * 记录成功日志 + * @param string|int $user_type 用户类型 + * @param array $sub_data 需发送的订阅消息数据 + * @param string $fail_reason 失败原因 + * @return void + */ + private function saveErrorPushLog(string|int $user_type,array $sub_data,string $fail_reason): void + { + $data = array(); + $data['to_user_id'] = $sub_data['push_user_id']; + $data['user_type'] = $user_type; + $data['type'] = 2; + $data['status'] = 2; + $data['fail_reason'] = $fail_reason ?: ""; + $data['send_reason'] = $sub_data['send_reason']; + $data['content'] = json_encode($sub_data['params'],JSON_UNESCAPED_UNICODE); + $log_message_push = LogMessagePush::addLogMessagePush($data); + if (empty($log_message_push)){ + Log::getInstance()->error("队列发送订阅消息成功,增加推送日志失败:" . json_encode($data,JSON_UNESCAPED_UNICODE)); + } + } + + /** + * 添加短信队列 + * 接收所有异常 + * 只返回true,失败情况不处理 + * @param array $sms_data 短信发送参数 + * @return bool + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface + */ + private function addSendSmsMessageQueue(array $sms_data): bool + { + try { + if (empty($sms_data)){ + // 无需发送短信 + Log::getInstance()->info("无数据需添加短信队列"); + return true; + } + + Log::getInstance()->info("添加短信队列"); + + // 增加至发送短信队列 + $message = new SendSmsMessageProducer($sms_data); + $producer = $this->container->get(Producer::class); + $res = $producer->produce($message); + if (!$res) { + Log::getInstance()->error("添加短信队列失败" . json_encode($sms_data,JSON_UNESCAPED_UNICODE)); + } + + } catch (\Exception $e) { + Log::getInstance()->error("添加短信队列失败" . $e->getMessage()); + } + + Log::getInstance()->info("添加短信队列成功"); + + return true; + } + + /** + * 获取数据库订阅消息模版 + * 接收所有异常 + * 异常记录log,不进行处理 + * @param string|int $user_type 用户类型 + * @param string $template_title 模版名称 + * @return array + * @throws ClientExceptionInterface + * @throws ContainerExceptionInterface + * @throws DecodingExceptionInterface + * @throws NotFoundExceptionInterface + * @throws RedirectionExceptionInterface + * @throws ServerExceptionInterface + * @throws TransportExceptionInterface + */ + public function getSubTemplate(string|int $user_type, string $template_title): array + { + try { + Log::getInstance()->info("获取数据库消息订阅模版"); + + // 获取订阅消息模版数据 + $params = array(); + $params['client_type'] = $user_type; // 客户端类型(1:患者端 2:医师端 3:药师端) + $params['template_title'] = $template_title; + $sub_template = SubTemplate::getOne($params); + if (empty($sub_template)){ + // 下载消息模版数据 + Log::getInstance()->info("消息模版:" . $template_title . " 在数据库中为空"); + $this->downSubTemplate($user_type); + } + + // 重新获取订阅消息模版 + $params = array(); + $params['client_type'] = $user_type; // 客户端类型(1:患者端 2:医师端 3:药师端) + $params['template_title'] = $template_title; + $sub_template = SubTemplate::getOne($params); + } catch (\Exception $e) { + Log::getInstance()->error("获取数据库消息订阅模版失败:" . $e->getMessage()); + } + + if (empty($sub_template)){ + return []; + }else{ + return $sub_template->toArray(); + } + } + + /** + * 下载消息订阅模版 + * 接收所有异常 + * 只返回true,失败情况不处理 + * @param string|int $user_type + * @return bool + * @throws ClientExceptionInterface + * @throws ContainerExceptionInterface + * @throws DecodingExceptionInterface + * @throws NotFoundExceptionInterface + * @throws RedirectionExceptionInterface + * @throws ServerExceptionInterface + * @throws TransportExceptionInterface + */ + private function downSubTemplate(string|int $user_type): bool + { + try { + Log::getInstance()->info("下载微信消息订阅模版"); + + $weChat = new Wechat($user_type); + $result = $weChat->getTemplate(); + if (empty($result)){ + return true; + } + + $template = json_decode($result, true); + + foreach ($template['data'] as $item) { + $params = array(); + $params['wx_template_id'] = $item['priTmplId']; + $sub_template = SubTemplate::getOne($params); + if (empty($sub_template)) { + // 新增模版 + $data = array(); + $data['client_type'] = 1; + $data['wx_template_id'] = $item['priTmplId']; + $data['template_title'] = $item['title']; + $data['template_type'] = $item['type']; + $data['template_content'] = $item['content']; + $sub_template = SubTemplate::addSubTemplate($data); + if (empty($sub_template)) { + // 此处添加失败不做处理,记录log, + Log::getInstance()->error("下载微信消息订阅模版失败:" . json_encode($data,JSON_UNESCAPED_UNICODE)); + } + } + } + + } catch (\Exception $e) { + Log::getInstance()->error("下载微信消息订阅模版失败:" . $e->getMessage()); + } + + Log::getInstance()->info("下载微信消息订阅模版成功"); + return true; + } } diff --git a/app/Model/LogMessagePush.php b/app/Model/LogMessagePush.php index 2ac581d..25659ed 100644 --- a/app/Model/LogMessagePush.php +++ b/app/Model/LogMessagePush.php @@ -69,4 +69,15 @@ class LogMessagePush extends Model { return self::where($params)->update($data); } + + /** + * 新增 + * @param array $data + * @return LogMessagePush|\Hyperf\Database\Model\Model + */ + public static function addLogMessagePush(array $data): LogMessagePush|\Hyperf\Database\Model\Model + { + return self::create($data); + } + } diff --git a/app/Request/InquiryRequest.php b/app/Request/InquiryRequest.php index d6ddafb..43dbe54 100644 --- a/app/Request/InquiryRequest.php +++ b/app/Request/InquiryRequest.php @@ -89,38 +89,38 @@ class InquiryRequest extends FormRequest public function messages(): array { return [ -// 'inquiry_type.required' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), -// 'inquiry_type.integer' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), -// 'inquiry_type.min' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), -// 'inquiry_type.max' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), -// 'inquiry_mode.required' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), -// 'inquiry_mode.integer' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), -// 'inquiry_mode.min' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), -// 'inquiry_mode.max' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), -// -// 'patient_id.required' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), -// 'family_id.required' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), -// 'disease_class_id.required' => "请您选择疾病", -// 'diagnosis_date.date' => HttpEnumCode::getMessage(HttpEnumCode::DATE_FORMAT_ERROR), -// 'disease_desc.required' => "请您输入病情主诉", -// 'is_allergy_history.numeric' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), -// 'is_allergy_history.min' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), -// 'is_allergy_history.max' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), -// 'is_family_history.numeric' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), -// 'is_family_history.min' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), -// 'is_family_history.max' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), -// 'is_pregnant.numeric' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), -// 'is_pregnant.min' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), -// 'is_pregnant.max' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), -// 'client_type.required' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), -// 'client_type.integer' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), -// 'client_type.min' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), -// 'client_type.max' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), -// -// 'inquiry_status.required' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), -// 'inquiry_status.integer' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), -// 'inquiry_status.min' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), -// 'inquiry_status.max' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'inquiry_type.required' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'inquiry_type.integer' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'inquiry_type.min' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'inquiry_type.max' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'inquiry_mode.required' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'inquiry_mode.integer' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'inquiry_mode.min' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'inquiry_mode.max' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + + 'patient_id.required' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'family_id.required' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'disease_class_id.required' => "请您选择疾病", + 'diagnosis_date.date' => HttpEnumCode::getMessage(HttpEnumCode::DATE_FORMAT_ERROR), + 'disease_desc.required' => "请您输入病情主诉", + 'is_allergy_history.numeric' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'is_allergy_history.min' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'is_allergy_history.max' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'is_family_history.numeric' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'is_family_history.min' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'is_family_history.max' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'is_pregnant.numeric' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'is_pregnant.min' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'is_pregnant.max' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'client_type.required' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'client_type.integer' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'client_type.min' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'client_type.max' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + + 'inquiry_status.required' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'inquiry_status.integer' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'inquiry_status.min' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), + 'inquiry_status.max' => HttpEnumCode::getMessage(HttpEnumCode::CLIENT_HTTP_ERROR), ]; } } diff --git a/app/Services/InquiryService.php b/app/Services/InquiryService.php index 4d8a444..7de6d6d 100644 --- a/app/Services/InquiryService.php +++ b/app/Services/InquiryService.php @@ -417,8 +417,17 @@ class InquiryService extends BaseService return fail(HttpEnumCode::HTTP_ERROR, "订单已退款"); } + // 获取医生数据 + $params = array(); + $params['doctor_id'] = $order_inquiry['doctor_id']; + $user_doctor = UserDoctor::getOne($params); + if (empty($user_doctor)){ + return fail(HttpEnumCode::SERVER_ERROR); + } + $result = array(); $result['doctor_id'] = $order_inquiry['doctor_id']; + $result['user_id'] = $user_doctor['user_id']; return success($result); } diff --git a/extend/Alibaba/Dysms.php b/extend/Alibaba/Dysms.php index fd3c5f8..29cd577 100644 --- a/extend/Alibaba/Dysms.php +++ b/extend/Alibaba/Dysms.php @@ -73,64 +73,86 @@ class Dysms */ public static function sendSms(string $phone_numbers,array $template_param,string $template_code,string $scene_desc = ""): void { - $config = config("alibaba.dysms"); + try { + $config = config("alibaba.dysms"); - $client = self::createClient($config['accessKey'], $config['accessKeySecret']); - $params = self::createApiInfo(); + $client = self::createClient($config['accessKey'], $config['accessKeySecret']); + $params = self::createApiInfo(); - // query params - $queries = []; - $queries["PhoneNumbers"] = $phone_numbers; - $queries["SignName"] = "肝胆相照"; - $queries["TemplateCode"] = $template_code; - $queries["TemplateParam"] = json_encode($template_param,JSON_UNESCAPED_UNICODE); - // runtime options - $runtime = new RuntimeOptions([]); - $request = new OpenApiRequest([ - "query" => OpenApiUtilClient::query($queries) - ]); - // 复制代码运行请自行打印 API 的返回值 - // 返回值为 Map 类型,可从 Map 中获得三类数据:响应体 body、响应头 headers、HTTP 返回的状态码 statusCode - $result = $client->callApi($params, $request, $runtime); + // query params + $queries = []; + $queries["PhoneNumbers"] = $phone_numbers; + $queries["SignName"] = "肝胆相照"; + $queries["TemplateCode"] = $template_code; + $queries["TemplateParam"] = json_encode($template_param,JSON_UNESCAPED_UNICODE); + // runtime options + $runtime = new RuntimeOptions([]); + $request = new OpenApiRequest([ + "query" => OpenApiUtilClient::query($queries) + ]); + // 复制代码运行请自行打印 API 的返回值 + // 返回值为 Map 类型,可从 Map 中获得三类数据:响应体 body、响应头 headers、HTTP 返回的状态码 statusCode + $result = $client->callApi($params, $request, $runtime); - if (empty($result)){ - throw new BusinessException(HttpEnumCode::getMessage(HttpEnumCode::CODE_FAIL)); - } - - if (empty($result['body'])){ - throw new BusinessException(HttpEnumCode::getMessage(HttpEnumCode::CODE_FAIL)); - } - - Log::getInstance()->info("发送短信日志:" . json_encode($result['body'],JSON_UNESCAPED_UNICODE)); - - if ($result['body']['Code'] != "OK"){ - if (isset($result['body']['MessageIm'])){ - throw new BusinessException($result['body']['MessageIm'],HttpEnumCode::CODE_FAIL); + if (empty($result)){ + throw new BusinessException(HttpEnumCode::getMessage(HttpEnumCode::CODE_FAIL)); } - throw new BusinessException("短信发送失败",HttpEnumCode::CODE_FAIL); - } - if (empty($result['body']['RequestId'])){ - // 无唯一值 - if (isset($result['body']['MessageIm'])){ - throw new BusinessException($result['body']['MessageIm'],HttpEnumCode::CODE_FAIL); + if (empty($result['body'])){ + throw new BusinessException(HttpEnumCode::getMessage(HttpEnumCode::CODE_FAIL)); } - throw new BusinessException("短信发送失败",HttpEnumCode::CODE_FAIL); - } - // 记录log - $data = array(); - $data['type'] = 1; - $data['status'] = 1; - $data['phone'] = $phone_numbers; - $data['template_code'] = $template_code; - $data['third_code'] = $result['body']['RequestId']; - $data['scene_desc'] = $scene_desc ?: ""; - $data['remarks'] = json_encode($template_param,JSON_UNESCAPED_UNICODE); - $res = LogSms::LogSms($data); - if (empty($res)){ - // 发送成功,记录失败 - throw new BusinessException(HttpEnumCode::getMessage(HttpEnumCode::CODE_FAIL)); + Log::getInstance()->info("发送短信日志:" . json_encode($result['body'],JSON_UNESCAPED_UNICODE)); + + if ($result['body']['Code'] != "OK"){ + if (isset($result['body']['MessageIm'])){ + throw new BusinessException($result['body']['MessageIm'],HttpEnumCode::CODE_FAIL); + } + throw new BusinessException("短信发送失败",HttpEnumCode::CODE_FAIL); + } + + if (empty($result['body']['RequestId'])){ + // 无唯一值 + if (isset($result['body']['MessageIm'])){ + throw new BusinessException($result['body']['MessageIm'],HttpEnumCode::CODE_FAIL); + } + throw new BusinessException("短信发送失败",HttpEnumCode::CODE_FAIL); + } + + // 记录log + $data = array(); + $data['type'] = 1; + $data['status'] = 1; + $data['phone'] = $phone_numbers; + $data['template_code'] = $template_code; + $data['third_code'] = $result['body']['RequestId']; + $data['scene_desc'] = $scene_desc ?: ""; + $data['remarks'] = json_encode($template_param,JSON_UNESCAPED_UNICODE); + $res = LogSms::LogSms($data); + if (empty($res)){ + // 发送成功,记录失败 + Log::getInstance()->info("发送短信成功,记录log失败" . json_encode($data,JSON_UNESCAPED_UNICODE)); + } + + }catch (\Exception $e) { + Log::getInstance()->error("发送短信失败:" . $e->getMessage()); + + // 记录log + $data = array(); + $data['type'] = 1; + $data['status'] = 2; + $data['phone'] = $phone_numbers; + $data['template_code'] = $template_code; + $data['third_code'] = $result['body']['RequestId']; + $data['scene_desc'] = $scene_desc ?: ""; + $data['remarks'] = json_encode($template_param,JSON_UNESCAPED_UNICODE); + $res = LogSms::LogSms($data); + if (empty($res)){ + // 发送成功,记录失败 + Log::getInstance()->info("发送短信失败,记录log失败" . json_encode($data,JSON_UNESCAPED_UNICODE)); + } + + throw new BusinessException($e->getMessage(),HttpEnumCode::CODE_FAIL); } } } \ No newline at end of file diff --git a/extend/Wechat/Wechat.php b/extend/Wechat/Wechat.php index 2fad5c1..38e2e40 100644 --- a/extend/Wechat/Wechat.php +++ b/extend/Wechat/Wechat.php @@ -324,14 +324,16 @@ class Wechat } if (isset($result['errcode'])){ if ($result['errcode'] == 43101){ - throw new BusinessException("用户拒绝接收消息"); + // 用户拒绝接收消息 + return $result; + } throw new BusinessException($result['errmsg']); } throw new BusinessException(); } - return $response->getContent(false); + return $response->toArray(); } catch (\Exception $e) { throw new BusinessException($e->getMessage(), HttpEnumCode::SERVER_ERROR); }