From 563e5ca7ba239c070669e3c9136f09a14564b25a Mon Sep 17 00:00:00 2001 From: wucongxing <815046773@qq.com> Date: Tue, 21 Mar 2023 20:35:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=80=E5=8F=91ca=EF=BC=8C=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E6=89=8B=E6=9C=BA=E5=8F=B7=E8=8E=B7=E5=8F=96=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E7=A0=81log=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Amqp/Consumer/SendSmsMessageConsumer.php | 8 ++ app/Controller/TestController.php | 118 +++++++++++++++++- ...{LogPushMessage.php => LogMessagePush.php} | 4 +- app/Model/{LogCode.php => LogSms.php} | 10 +- app/Model/MessageNotice.php | 86 +++++++++++++ app/Services/CodeService.php | 2 +- extend/Alibaba/Dysms.php | 12 +- extend/Ca/Ca.php | 41 +++++- 8 files changed, 261 insertions(+), 20 deletions(-) rename app/Model/{LogPushMessage.php => LogMessagePush.php} (95%) rename app/Model/{LogCode.php => LogSms.php} (83%) create mode 100644 app/Model/MessageNotice.php diff --git a/app/Amqp/Consumer/SendSmsMessageConsumer.php b/app/Amqp/Consumer/SendSmsMessageConsumer.php index 0086b95..f999109 100644 --- a/app/Amqp/Consumer/SendSmsMessageConsumer.php +++ b/app/Amqp/Consumer/SendSmsMessageConsumer.php @@ -17,6 +17,14 @@ class SendSmsMessageConsumer extends ConsumerMessage { public function consumeMessage($data, AMQPMessage $message): string { + /** + * data = [ + * "code" => "SMS_123", + * "data" => [ + * // data内参数不确定,主要看短信模版 + * ], + * ] + */ return Result::ACK; } } diff --git a/app/Controller/TestController.php b/app/Controller/TestController.php index 27822ea..bcadecd 100644 --- a/app/Controller/TestController.php +++ b/app/Controller/TestController.php @@ -2,17 +2,20 @@ namespace App\Controller; +use App\Amqp\Producer\CancelUnpayOrdersDelayDirectProducer; use App\Constants\HttpEnumCode; use App\Model\DoctorPharmacistCert; use Extend\Alibaba\Oss; use Extend\Ca\Ca; +use Hyperf\Amqp\Producer; +use Hyperf\DbConnection\Db; use Intervention\Image\ImageManager; use TCPDF; class TestController extends AbstractController { public function test(){ - $this->test_5(); + $this->test_7(); } // 获取云证书-首次 @@ -49,7 +52,7 @@ class TestController extends AbstractController // 获取云证书签名 $data = array(); - $data['created_at'] = date('Y-m-d H:i:s',time()); + $data['created_at'] = "2023-03-01 12:44:10"; $data['department_custom_name'] = "外科"; $data['user_name'] = "测试用户1"; $data['sex'] = "男"; @@ -71,7 +74,28 @@ class TestController extends AbstractController "frequency_use" => "1天3次", "single_use" => "口服", "prescription_product_num" => "X1盒", - ] + ], + [ + "product_name" => "感冒药3(50ml*10)", + "single_unit" => "一次一包", + "frequency_use" => "1天3次", + "single_use" => "口服", + "prescription_product_num" => "X1盒", + ], + [ + "product_name" => "感冒药4(50ml*10)", + "single_unit" => "一次一包", + "frequency_use" => "1天3次", + "single_use" => "口服", + "prescription_product_num" => "X1盒", + ], + [ + "product_name" => "感冒药5(50ml*10)", + "single_unit" => "一次一包", + "frequency_use" => "1天3次", + "single_use" => "口服", + "prescription_product_num" => "X1盒", + ], ]; $result = $ca->getCertSign("491925054435950592","491925054435950592",$data); @@ -271,8 +295,94 @@ class TestController extends AbstractController } // 将处理后的图片重新保存到其他路径 - $image->save('./runtime/2.jpg'); +// $image->save('./runtime/2.jpg'); + $result = (string) $image->encode('png', 75); + // 图片生成pdf + $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false); + + $pdf->AddPage(); + $pdf->Image('@' . $result, 10, 10, 0, 0, '', '', '', false, 300, '', false, false, 0, false, false, false); + return $pdf->Output("","S"); + } + + // pdf进行签章 + public function test_6(){ + $pdf_file = $this->test_5(); + + $pdf_file = base64_encode($pdf_file); + if (!$pdf_file){ + return fail(HttpEnumCode::SERVER_ERROR); + } + + $pdf_file = urlencode($pdf_file); + + $oss = new Oss(); + + $filename = "applet/doctor/cert/67d7396d-0fc3-464d-9582-3501229ed188.png"; + + $style = "image/resize,m_lfit,w_350,h_100/rotate"; + + $sign_image = $oss->getCusTomObjectToRAM($filename,$style); + $sign_image = base64_encode($sign_image); + if (!$sign_image){ + return fail(HttpEnumCode::SERVER_ERROR); + } + + $sign_image = urlencode($sign_image); + + $sign_param = [ + [ + "llx"=> 700, // 左边底部X坐标 + "lly"=>2985, // 左边底部Y坐标 + "urx"=>1101, // 右边上部x坐标 + "ury"=>2896, // 右边上部y坐标 + "pageList"=>[1], + "sealImg"=>$sign_image + ] + ]; + + $data = array(); + $data['sign_param'] = json_encode($sign_param,JSON_UNESCAPED_UNICODE); + $data['pdf_file'] = $pdf_file; + + $ca = new Ca(); + $result = $ca->addSignPdf("491925054435950592",$data); + dump($result); + } + + // 延迟队列测试 + public function test_7(){ + $out_trade_no = $this->request->input('out_trade_no'); + if ($out_trade_no == 1){ + // 增加至取消订单延迟队列 + $data = array(); + $data['order_no'] = 111; + $data['order_type'] = 1; + + $message = new CancelUnpayOrdersDelayDirectProducer($data); + $message->setDelayMs(1000 * 5 * 1); + $producer = $this->container->get(Producer::class); + $res = $producer->produce($message); + if (!$res) { + Db::rollBack(); + return fail(HttpEnumCode::SERVER_ERROR, "订单创建失败"); + } + }else{ + // 增加至取消订单延迟队列 + $data = array(); + $data['order_no'] = 2222; + $data['order_type'] = 1; + + $message = new CancelUnpayOrdersDelayDirectProducer($data); + $message->setDelayMs(1000 * 15 * 1); + $producer = $this->container->get(Producer::class); + $res = $producer->produce($message); + if (!$res) { + Db::rollBack(); + return fail(HttpEnumCode::SERVER_ERROR, "订单创建失败"); + } + } } } \ No newline at end of file diff --git a/app/Model/LogPushMessage.php b/app/Model/LogMessagePush.php similarity index 95% rename from app/Model/LogPushMessage.php rename to app/Model/LogMessagePush.php index 0248c74..2ac581d 100644 --- a/app/Model/LogPushMessage.php +++ b/app/Model/LogMessagePush.php @@ -21,14 +21,14 @@ use Hyperf\Snowflake\Concern\Snowflake; * @property \Carbon\Carbon $created_at 创建时间 * @property \Carbon\Carbon $updated_at 修改时间 */ -class LogPushMessage extends Model +class LogMessagePush extends Model { use Snowflake; /** * The table associated with the model. */ - protected ?string $table = 'log_push_message'; + protected ?string $table = 'log_message_push'; /** * The attributes that are mass assignable. diff --git a/app/Model/LogCode.php b/app/Model/LogSms.php similarity index 83% rename from app/Model/LogCode.php rename to app/Model/LogSms.php index 3951caf..636babf 100644 --- a/app/Model/LogCode.php +++ b/app/Model/LogSms.php @@ -20,19 +20,19 @@ use Hyperf\Snowflake\Concern\Snowflake; * @property \Carbon\Carbon $created_at 创建时间 * @property \Carbon\Carbon $updated_at 修改时间 */ -class LogCode extends Model +class LogSms extends Model { use Snowflake; /** * The table associated with the model. */ - protected ?string $table = 'log_code'; + protected ?string $table = 'log_sms'; /** * The attributes that are mass assignable. */ - protected array $fillable = ['log_id', 'type', 'status', 'scene', 'phone', 'code', 'third_code', 'remarks', 'created_at', 'updated_at']; + protected array $fillable = ['log_id', 'type', 'status', 'phone', 'template_code', 'third_code', 'scene_desc', 'remarks', 'created_at', 'updated_at']; protected string $primaryKey = "log_id"; @@ -63,9 +63,9 @@ class LogCode extends Model /** * 新增-批量 * @param array $data - * @return \Hyperf\Database\Model\Model|LogCode + * @return \Hyperf\Database\Model\Model|LogSms */ - public static function addCodeLog(array $data): \Hyperf\Database\Model\Model|LogCode + public static function addCodeLog(array $data): \Hyperf\Database\Model\Model|LogSms { return self::create($data); } diff --git a/app/Model/MessageNotice.php b/app/Model/MessageNotice.php new file mode 100644 index 0000000..511c541 --- /dev/null +++ b/app/Model/MessageNotice.php @@ -0,0 +1,86 @@ +exists(); + } + + /** + * 获取信息-单条 + * @param array $params + * @param array $fields + * @return object|null + */ + public static function getOne(array $params, array $fields = ['*']): object|null + { + return self::where($params)->first($fields); + } + + /** + * 获取数据-多 + * @param array $params + * @param array $fields + * @return Collection|array + */ + public static function getList(array $params = [], array $fields = ['*']): Collection|array + { + return self::where($params)->get($fields); + } + + /** + * 新增 + * @param array $data + * @return MessageNotice|\Hyperf\Database\Model\Model + */ + public static function addMessageNotice(array $data): MessageNotice|\Hyperf\Database\Model\Model + { + return self::create($data); + } +} diff --git a/app/Services/CodeService.php b/app/Services/CodeService.php index 72ca923..8a646d6 100644 --- a/app/Services/CodeService.php +++ b/app/Services/CodeService.php @@ -44,7 +44,7 @@ class CodeService extends BaseService $template_param['code'] = mt_rand(1,9) . (int)substr($generator->generate(),-3); // 发送短信 - Dysms::sendSms($phone,$template_param,$template_code,1); + Dysms::sendSms($phone,$template_param,$template_code,"获取验证码"); if (empty($result)){ $redis_value = 1; diff --git a/extend/Alibaba/Dysms.php b/extend/Alibaba/Dysms.php index 053b0eb..c5f3007 100644 --- a/extend/Alibaba/Dysms.php +++ b/extend/Alibaba/Dysms.php @@ -3,7 +3,7 @@ namespace Extend\Alibaba; use App\Constants\HttpEnumCode; use App\Exception\BusinessException; -use App\Model\LogCode; +use App\Model\LogSms; use Darabonba\OpenApi\OpenApiClient; use AlibabaCloud\OpenApiUtil\OpenApiUtilClient; @@ -68,9 +68,9 @@ class Dysms * @param string $phone_numbers 手机号 * @param array $template_param 参数 * @param string $template_code 短信模版编码 - * @param int $scene 场景 + * @param int $scene_desc 场景 */ - public static function sendSms(string $phone_numbers,array $template_param,string $template_code,int $scene): void + public static function sendSms(string $phone_numbers,array $template_param,string $template_code,int $scene_desc): void { $config = config("alibaba.dysms"); @@ -113,12 +113,12 @@ class Dysms $data = array(); $data['type'] = 1; $data['status'] = 1; - $data['scene'] = $scene; $data['phone'] = $phone_numbers; - $data['code'] = $template_code; + $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 = LogCode::addCodeLog($data); + $res = LogSms::addCodeLog($data); if (empty($res)){ // 发送成功,记录失败 throw new BusinessException(HttpEnumCode::getMessage(HttpEnumCode::CODE_FAIL)); diff --git a/extend/Ca/Ca.php b/extend/Ca/Ca.php index 6a1a60b..24d89c5 100644 --- a/extend/Ca/Ca.php +++ b/extend/Ca/Ca.php @@ -4,6 +4,7 @@ namespace Extend\Ca; use App\Constants\HttpEnumCode; use App\Exception\BusinessException; +use App\Utils\Log; use GuzzleHttp\Client; use GuzzleHttp\Exception\GuzzleException; use Hyperf\Di\Annotation\Inject; @@ -182,6 +183,36 @@ class Ca } } + /** + * PDF添加电子签章 + */ + public function addSignPdf(string $user_id,array $data){ + $option = [ + 'form_params' => [ + 'userId' => $user_id,// 用户标识信息 + 'configKey' => $user_id,// 签章配置唯一标识 + 'signParams' => $data['sign_param'],// 签章参数,JSON格式数据,如果不指定,那么以签章配置接口配置为准 + 'pdfFile' => $data['pdf_file'],// 待签章PDF文件(字节流) + 'cloudCertPass' => $user_id,// 云证书PIN码,云证书签章时使用 + ] + ]; + + try { + $response = $this->httpRequest( + config("ca.api_url") . '/signature-server/api/open/signature/signPdf', + $option + ); + + if (empty($response)){ + // 返回值为空 + throw new BusinessException(HttpEnumCode::getMessage(HttpEnumCode::SERVER_ERROR)); + } + return $response; + } catch (GuzzleException $e) { + throw new BusinessException($e->getMessage()); + } + } + /** * 获取请求签名 * @param array $data @@ -190,6 +221,12 @@ class Ca protected function getRequestSign(array $data): string { ksort($data['form_params']); + foreach ($data['form_params'] as $key => $item){ + if ($key == "pdfFile"){ + // pdf进行签章时,此参数为文件流,不参与签名 + unset($data['form_params'][$key]); + } + } $data = implode('&',$data['form_params']); return hash_hmac("sha1",$data,config("ca.secret")); @@ -204,7 +241,6 @@ class Ca */ protected function httpRequest(string $path,array $arg = []): mixed { - $option = [ "headers" => [ "app_id" => config("ca.app_id"), @@ -214,9 +250,10 @@ class Ca $arg = array_merge($arg,$option); - // dump(json_encode($arg,JSON_UNESCAPED_UNICODE)); +// dump(json_encode($arg,JSON_UNESCAPED_UNICODE)); $response = $this->client->post($path, $arg); + if ($response->getStatusCode() != '200'){ // 请求失败 throw new BusinessException($response->getBody()->getContents());