不积跬步无以至千里，不积小流无以至江河。
微信小程序对接php通过stream流式输出AI大模型结果
php端代码参考（调用豆包）<?php header('Content-Type: text/event-stream'); // 以事件流的形式告知浏览器进行显示 header('Cache-Control: no-cache'); // 告知浏览器不进行缓存 header('X-Accel-Buffering: no'); //关闭加速缓冲 header('Connection: keep-alive'); $keyword = '你是谁'; if ($_SERVER['REQUEST_METHOD'] === 'POST') { $input = json_decode(file_get_contents('php://input'), true); if (isset($input['message'])) { $message = $input['message']; } } $url="https://ark.cn-beijing.volces.com/api/v3/chat/completions"; $json='{ "model":"doubao-seed-2-0-pro-260215", "messages": [ { "role": "system", "content": "请回答用户提出的植物名称或其他相关问题，如果提问仅包含植物名称则结合百度百科返回植物相关信息信息，删除返回结果中的citation代码内容，需包含：植物中文名称、别名、外文名、分布区域、功能特征、形态特征、生长环境及习性、病虫防治事项、栽培技术、松针腐植土是否适合种植等信息。如果用户提出的非植物相关问题，则正常输出结果。返回结果为html模式，支持的标签包含 等，不要使用复杂的css样式。以下是用户提问：" }, { "content": "'.$message.'", "role": "user" } ], "thinking": {"type": "disabled"}, "stream":true }'; $arr=json_decode($json,true); $header=['Authorization: Bearer ark-xxx','Content-Type: application/json']; /** * 示例回调函数，用于处理接收到的数据并返回给客户端 * * @param string $data 接收到的数据片段 */ function handleResponseData($data) { // 在这里，你可以将数据写入输出缓冲区或直接发送给客户端-例如，使用 echo 或 SSE 发送数据 //sleep(3); echo $data; // 假设这里直接将数据发送给客户端 echo "\n"; //刷新输出缓冲区---把数据输出给浏览器 ob_flush(); flush(); } // 使用示例 $res=curlStreamRequest( $url, // 替换为实际的 API URL json_encode($arr), // 替换为实际的 POST 数据（如果需要） $header, // 替换为实际的请求头 //直接传递闭包函数 function($data) { handleResponseData($data); } //'handleResponseData' // 传递回调函数名作为字符串（如果回调函数在全局作用域中） ); /** * 流式请求--通过 cURL 发起流式请求并处理响应 * * @param string $url 请求的 URL * @param array $headers 请求头数组 * @param array|string|null $postData POST 数据 * @param callable $callback 处理响应数据的回调函数 * @throws Exception 如果回调函数不是有效的 Callable */ function curlStreamRequest(string $url,$postData = null, array $headers = [], callable $callback) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); // 不将响应保存为字符串，直接处理 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 注意：在生产环境中应启用 SSL 验证 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 注意：同上 curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); curl_setopt($ch, CURLOPT_POST, is_array($postData) || !empty($postData)); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); curl_setopt($ch, CURLOPT_WRITEFUNCTION, function ($ch, $data) use ($callback) { // 调用回调函数处理数据 $callback($data); return strlen($data); // 返回接收到的数据长度 }); // 执行请求并获取响应 curl_exec($ch); // 检查是否有错误发生 if (curl_errno($ch)) { throw new \Exception(curl_error($ch)); } // 关闭 cURL 句柄 curl_close($ch); }微信小程序端代码export default { data() { return { searchValue: '', searchResult: '', currentRequest: null, // 请求任务对象 }; }, methods: { //搜索 async searchBut() { let that = this; if (that.searchValue.length > 0) { //发起流式请求 uni.showLoading({ title: '检索中' }) await this.streamChat(that.searchValue) } else { return this.$util.Tips({ title: '请输入要搜索的内容', icon: 'none', duration: 1000, mask: true, }); } }, // 流式聊天 streamChat(message) { this.searchValue = ''; this.searchResult = ''; return new Promise((resolve, reject) => { const requestTask = wx.request({ url: "https://xxx/stream.php", method: 'POST', data: { message: message }, header: { 'Content-Type': 'application/json', 'Accept': 'text/event-stream' }, responseType: 'text', enableChunked: true, // 启用分块传输 success: (res) => { this.finishStreaming() }, fail: (err) => { console.error('SSE请求失败', err) this.handleStreamError('网络请求失败，请重试') } }) // 监听chunked数据（流式数据接收） let buffer = '' // 数据缓冲区 // 注意：小程序需要基础库2.20.1以上支持onChunkReceived requestTask.onChunkReceived((res) => { uni.hideLoading(); // res.data 是ArrayBuffer，需要转为字符串 const chunk = this.arrayBufferToString(res.data) buffer += chunk // 按行分割处理SSE格式数据 const lines = buffer.split('\n') // 保留最后一个不完整的行 buffer = lines.pop() || '' for (const line of lines) { if (line.startsWith('data: ')) { const dataStr = line.slice(6) if (dataStr === '[DONE]') { // 流结束标记 this.finishStreaming() return } try { const data = JSON.parse(dataStr) if (data.choices && data.choices[0] && data.choices[0].delta && data.choices[0].delta.content) { // 追加内容到当前AI消息 this.searchResult += data.choices[0].delta.content; } } catch (e) { // 如果不是JSON格式，直接作为纯文本追加 this.searchResult += dataStr } } else if (line.trim() === '') { // 空行忽略 continue } } }) // 存储requestTask以便可能的中断 this.currentRequest = requestTask }) }, // ArrayBuffer 转字符串 arrayBufferToString(buffer) { // 微信小程序环境下的转换方法 const dataView = new DataView(buffer) let result = '' for (let i = 0; i < dataView.byteLength; i++) { result += String.fromCharCode(dataView.getUint8(i)) } // 如果是UTF-8编码，需要使用decodeURIComponent(escape(result)) // 简单处理：如果乱码可尝试以下转换 try { return decodeURIComponent(escape(result)) } catch (e) { return result } }, // 完成流式接收 finishStreaming() { console.log('done') this.currentRequest = null }, // 错误处理 handleStreamError(errorMsg) { wx.showToast({ title: errorMsg, icon: 'none', duration: 2000 }) this.currentRequest = null }, abortStream() { if (this.currentRequest) { this.currentRequest.abort() this.currentRequest = null } }, }, onUnload() { this.abortStream() } }; 附：html页面处理流式输出 火山引擎AI模型流式输出演示 火山引擎AI模型流式输出演示 发送请求 就绪
phpword读取word中的内容，调用deepseek后生成word下载，代码如下： <?php /** * Desc: * User: SenSen Wechat:1050575278 * Date: 2025-8-27 * Time: 11:02 */ namespace app\index\controller\service; use app\index\controller\Auth; use PhpOffice\PhpWord\IOFactory; use PhpOffice\PhpWord\PhpWord; use PhpOffice\PhpWord\SimpleType\Jc; use sensen\services\HttpService; use sensen\services\JsonService; use sensen\services\upload\Upload; class QiSuZhuang extends Auth { /** * 诉状上传 */ public function upload() { $upload_type = $this->request->get('upload_type', sys_config('upload_type', 1)); try { $path = make_path('qisuzhuang', 2, true); $upload = new Upload((int)$upload_type, [ 'accessKey' => sys_config('accessKey'), 'secretKey' => sys_config('secretKey'), 'uploadUrl' => sys_config('uploadUrl'), 'storageName' => sys_config('storage_name'), 'storageRegion' => sys_config('storage_region'), ]); //验证类型 $res = $upload->to($path)->validate(['fileExt'=>'doc,docx', 'fileMime'=>['application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/msword']])->move('file'); if ($res === false) { return JsonService::fail('上传失败：' . $upload->getError()); } else { $fileInfo = $upload->getUploadInfo(); if ($fileInfo) { $file = '.'.$fileInfo['dir']; $phpWord = IOFactory::load($file); $sections = $phpWord->getSections(); $szContent = ''; foreach ($sections as $section) { $elements = $section->getElements(); // 获取当前section的所有元素 foreach ($elements as $element) { if ($element instanceof \PhpOffice\PhpWord\Element\TextRun) { // 文本段落 foreach ($element->getElements() as $ele) { $szContent .= self::getTextNode($ele) . "\n"; } }else if ($element instanceof \PhpOffice\PhpWord\Element\Table) { foreach ($element->getRows() as $ele) { $szContent .= self::getTableNode($ele) . "\n"; } } } } $deepSeekContent = $this->getDeepSeekContent($szContent); debug_file($deepSeekContent, 'qisuzhuang'); $fileName = date('YmdHis'); $this->generateQszWord($deepSeekContent, $fileName); return JsonService::successful('上传成功', ['path'=>'/uploads/qisuzhuang/'.$fileName.'.docx']); }else{ return JsonService::fail('上传失败：' . $upload->getError()); } } } catch (\Exception $e) { return JsonService::fail('上传失败：' . $e->getMessage()); } } /** * 获取文档节点内容 * @param $node * @return string */ public static function getTextNode($node) { $str = ''; //处理文本 if ($node instanceof \PhpOffice\PhpWord\Element\Text) { $str .= $node->getText(); } else if ($node instanceof \PhpOffice\PhpWord\Element\Image) { //处理图片 $str .= self::pic2text($node); } else if ($node instanceof \PhpOffice\PhpWord\Element\TextRun) { //处理文本元素 foreach ($node->getElements() as $ele) { $str .= self::getTextNode($ele); } } return $str; } /** * 获取表格节点内容 * @param $node * @return string */ public static function getTableNode($node) { $str = ''; if ($node instanceof \PhpOffice\PhpWord\Element\Row) { //处理行 foreach ($node->getCells() as $ele) { $str .= self::getTableNode($ele); } } else if ($node instanceof \PhpOffice\PhpWord\Element\Cell) { //处理列 foreach ($node->getElements() as $ele) { $str .= self::getTextNode($ele); } } return $str; } /** * 处理word文档中base64格式图片 * @param $node * @return string */ public static function pic2text($node) { //获取图片编码 $imageData = $node->getImageStringData(true); //添加图片html显示标头 $imageData = 'data:' . $node->getImageType() . ';base64,' . $imageData; return ' '; } /** * 处理word文档中base64格式图片 * @param $node * @return string */ public static function pic2file($node) { //图片地址(一般为word文档地址+在word中的锚点位置) $imageSrc = 'images/' . md5($node->getSource()) . '.' . $node->getImageExtension(); $imageData = $node->getImageStringData(true); //将图片保存在本地 file_put_contents($imageSrc, base64_decode($imageData)); return $imageSrc; } /** * 将word转化为html(转换存储html文件后展示) */ public static function word2html($path) { $phpWord = IOFactory::load($path); $htmlWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'HTML'); $path = pathinfo($path); $fileName = $path['dirname'] . '/' . $path['filename'] . '.html'; $htmlWriter->save($fileName); $html = file_get_contents($fileName); return $html; } /** * 获取deepseek结果 * @param string $content * @return mixed */ public function getDeepSeekContent($content='') { $response = HttpService::postRequest('https://api.deepseek.com/chat/completions', [ 'model' => "deepseek-chat", "stream" => false, 'messages' => [ [ 'role'=>"system", 'content'=>"您是法律专家，请根据提供的案件起诉状信息，生成案件诉讼的要素式起诉状信息。" ], [ 'role' => "user", 'content'=>$content ], [ 'role' => "user", 'content'=>'根据以上诉状内容，若原告、被告、委托诉讼代理人、第三人等存在多个数据，则返回二维数组，括号中的文字为对应数据处理说明。严格按照以下格式返回JSON数据，如无内容则留空： { "原告（自然人）":[ { 原告姓名： 原告性别： 原告证件类型： 原告证件号码： 原告出生日期： 原告年龄： 原告民族： 原告工作单位： 原告职务： 原告住所地： 原告联系电话： } ], "原告（法人、非法人组织）":[ { 单位名称： 单位所在地： 法定代表人/主要负责人： 法人代表人/主要负责人职务： 联系电话： 原告证件类型： 原告证件号码： 统一社会信用代码： 单位性质：（可选项包含：有限责任公司、股份有限公司、上市公司、其他企业法人、事业单位、社会团体、基金会、社会服务机构、机关法人、农村集体经济组织法人、城镇农村的合作经济组织法人、基层群众性自治组织法人、个人独资企业、合伙企业、不具有法人资格的专业服务机构） 所有制性质：（可选项包含：国有控股、国有参股、民营、其他） } ], "委托诉讼代理人":[ { 姓名： 单位： 职务：（可选项包含：律师、法律服务工作者、其他） 联系电话： 代理权限： } ], "被告（自然人）":[ { 被告姓名： 被告性别： 被告证件类型： 被告证件号码： 被告出生日期： 被告年龄： 被告民族： 被告工作单位： 被告职务： 被告住所地： 被告联系电话： } ], "被告（法人、非法人组织）":[ { 单位名称： 单位所在地： 法定代表人/主要负责人： 法人代表人/主要负责人职务： 联系电话： 被告证件类型： 被告证件号码： 统一社会信用代码： 单位性质：（可选项包含：有限责任公司、股份有限公司、上市公司、其他企业法人、事业单位、社会团体、基金会、社会服务机构、机关法人、农村集体经济组织法人、城镇农村的合作经济组织法人、基层群众性自治组织法人、个人独资企业、合伙企业、不具有法人资格的专业服务机构） 所有制性质：（可选项包含：国有控股、国有参股、民营、其他） } ], "第三人（自然人）":[ { 姓名： 性别： 证件类型： 证件号码： 出生日期： 年龄： 民族： 工作单位： 职务： 住所地： 联系电话： } ], "第三人（法人、非法人组织）":[ { 单位名称： 单位所在地： 法定代表人/主要负责人： 法人代表人/主要负责人职务： 联系电话： 原告证件类型： 原告证件号码： 统一社会信用代码： 单位性质：（可选项包含：有限责任公司、股份有限公司、上市公司、其他企业法人、事业单位、社会团体、基金会、社会服务机构、机关法人、农村集体经济组织法人、城镇农村的合作经济组织法人、基层群众性自治组织法人、个人独资企业、合伙企业、不具有法人资格的专业服务机构） 所有制性质：（可选项包含：国有控股、国有参股、民营、其他） } ], "原告身份"：（可选项包含：卖方、买方） "诉讼请求"：（返回完整诉讼请求） "给付价款"：（人民币，单位：元，下同：如外币需特别注明） "迟延给付价款的利息（违约金）"：（如原告身份为卖方时填写，返回详细描述内容） "是否请求支付至实际清偿之日"：（如原告身份为卖方时填写，可选项包含：是、否） "支付赔偿金"：（单位：元） "违约类型"：（如原告身份为买方时填写，可选项包含：迟延履行、不履行、其他） "具体情形"：（返回详细描述内容） "损失计算依据"：（返回详细描述内容） "是否对标的物的瑕疵承担责任"：（可选项包含：是、否） "对标的物的瑕疵责任承担方式"：（可选项包含：修理、重作、更换、退货、减少价款或者报酬、其他） "要求继续履行或是解除合同"：（可选项包含：继续履行、判令解除合同、已解除） "继续履行期限"：（返回XX日内履行完毕付款或供货义务） "解除日期"： "是否主张担保权利"：（如为是，同时返回主张内容） "是否主张实现债权的费用"：（如为是，同时返回主张内容） "是否主张诉讼费用"：（可选项包含：是、否） "其他请求"：（将其他请求填写到此处） "标的总额"： "有无仲裁、法院管辖规定"：（如为是，同时返回合同条款及内容） "是否已经诉前保全"：（如为是，返回保全法院、保全时间、保全案号） "事实与理由"：（返回完整表述纠纷涉及的事实与理由） "合同签订情况"：（返回名称、编号、签订时间、地点等；如无书面合同，请注明"无书面合同"） "出卖人（卖方）"： "买受人（买方）"： "买卖标的物情况"： "合同约定的单价"： "合同约定的总价"： "合同支付媒介"：（可选项包含：现金、转账、票据、其他方式） "合同支付方式"：（可选项包含：一次性支付、分期支付） "分期方式"： "合同约定信息"：（包含合同约定的交货时间、地点、方式、风险承担、安装、调试、验收等） "合同约定的质量标准及检验方式、质量异议期限"： "合同约定的违约金（定金）"：（返回：违约金金额及对应合同条款、定金金额及对应合同条款、迟延履行违约金利率及合同条款） "价款支付及标的物交付情况"：{ "按期支付价款"：（单位：元） "逾期付款"：（单位：元） "逾期未付款"：（单位：元） "按期交付标的物"：（单位：件） "逾期交付"：（单位：件） "逾期未交付"：（单位：件） } "是否存在延迟履行"：{ "延迟时间"： "延期履行方式"：（可选项包含：逾期付款、逾期交货） } "是否催促过履行"：{ "催促日期"： "催促方式"： } "买卖合同标的物有无质量争议"：（如有，同时返回具体情况） "标的物质量规格或履行方式是否存在不符合约定的情况"：（如有，同时返回具体情况） "是否曾就标的物质量问题进行协商"：（如有，同时返回具体情况） "是否通知解除合同"：（如有，同时返回具体情况） "被告应当支付的利息、违约金、赔偿金"：{ "利息"：（单位：元） "违约金"：（单位：元） "赔偿金"：（单位：元） "共计"：（单位：元） "计算方式"： } "是否签订物的担保（抵押、质押）合同"：（如签订，同时返回签订时间） "担保人"： "担保物"： "是否最高额担保（抵押、质押）"：{ "担保债权的确定时间"： "担保额度"： } "抵押、质押登记登记方式"：（可选项包含：正式登记、预告登记） "是否签订保证合同"：{ "签订时间"： "保证人"： "保证合同主要内容"： "保证方式"：（可选项包含：一般保证、连带责任保证） } "其他担保方式"：{ "担保形式"： "签订时间"： } "请求承担责任的合同约定"： "请求承担责任的法律规定"： "其他需要说明的内容"： "证据清单"： "对纠纷解决方式的意愿"：{ "是否了解调解作为非诉讼纠纷解决方式，能及时、高效、低成本、不伤和气地解决纠纷"：（可选项包含：了解、不了解） "立案后选择先行调解的，可以很快启动调解程序。如不同意调解，法院将依程序开庭审理案件，但可能需要经过较长一段时间的排期等待，且审理、执行周期相对较长"：（可选项包含：了解、不了解） "选择先行调解，调解成功且自动履行的免交诉讼费用，申请司法确认的不交纳诉讼费用，要求出具调解书的减半交纳诉讼费用"：（可选项包含：了解、不了解） "首次调解不成功，但仍有继续调解意愿的，可以选择更换调解组织和调解员再进行调解。调解无法达成一致意见的，法院将依程序排期开庭"：（可选项包含：了解、不了解） "依照法律规定，调解具有保密性要求，调解过程不公开，调解协议未经当事人同意不得公开"：（可选项包含：了解、不了解） "调解达成的协议具有法律效力，可以依照法律规定申请司法确认，具有强制执行效力"：（可选项包含：了解、不了解） "是否考虑先行调解"：（可选项包含：是、否、暂不确定） } }' ] ] ], [ "Content-Type: application/json", "Authorization: Bearer sk-67b56a4e297c466f8e8f153814393173" ], 500, 'json'); $response = json_decode($response); $content = $response->choices[0]->message->content; return $content; } /** * 生成起诉状word * todo 区分不同类型的起诉状 * @param string $content * @return string */ public function generateQszWord($content='', $fileName='test') { $content = str_replace('```json', '', $content); $content = str_replace('```', '', $content); $content = json_decode($content, true); $savePath = public_path().'/uploads/qisuzhuang/'.$fileName.'.docx'; $phpWord = new PhpWord(); $section = $phpWord->addSection(); $paragraphStyleName = 'pStyle'; $phpWord->addParagraphStyle($paragraphStyleName, array('size' => 16, 'bold' => true, 'alignment' => Jc::CENTER, 'spaceAfter' => 100)); $section->addText('民事起诉状', array('size' => 18, 'bold'=>true), $paragraphStyleName); $section->addText('（买卖合同纠纷）', array('size' => 18, 'bold'=>true), $paragraphStyleName); $cellRowSpan = array('vMerge' => 'restart', 'valign' => 'center'); $cellRowContinue = array('vMerge' => 'continue'); $cellColSpan = array('gridSpan' => 1, 'valign' => 'center'); $cellHCentered = array('alignment' => Jc::CENTER); $cellVCentered = array('valign' => 'center'); $fancyTableStyle = array('borderSize' => 6, 'borderColor' => '000'); $spanTableStyleName = 'Colspan Rowspan'; $phpWord->addTableStyle($spanTableStyleName, $fancyTableStyle); $table = $section->addTable($spanTableStyleName); $table->addRow(500); $cell0 = $table->addCell(9200, $cellRowSpan); $cell0->addText("说明：", array('size' => 12, 'bold'=>true)); $cell0->addText("为了方便您参加诉讼，保护您的合法权利，请填写本表。 1. 起诉时需向人民法院提交证明您身份的材料，如身份证复印件、营业执照复印件等。 2. 本表所列内容是您提起诉讼以及人民法院查明案件事实所需，请务必如实填写。 3. 本表有些内容可能与您的案件无关，您认为与案件无关的项目可以填“无”或不填；对于本表中勾选项可以在对应项打“√ ”;您认为另有重要内容需要列明的，可以另附页填写。 4. 本表word电子版填写时，相关栏目可复制粘贴或扩容，但不得改变要素内容、格式设置。例如，多原告、多被告或多委托诉讼代理人等情况，可根据实际情况复制粘贴；需填写文字较多时，可根据实际对栏目进行扩容等。 ★特别提示★ 诉讼参加人应遵守诚信原则如实认真填写表格。 如果诉讼参加人违反有关规定，虚假诉讼、恶意诉讼、滥用诉权，人民法院将视违法情形依法 追究责任。"); $cell0->getStyle()->setGridSpan(2); $table->addRow(500); $cell1 = $table->addCell(9200, $cellRowSpan); $cell1->addText("当事人信息", array('size' => 18, 'bold'=>true), $paragraphStyleName); $cell1->getStyle()->setGridSpan(2); //遍历循环原告 至少包含一个原告 $yuangao = isset($content["原告（自然人）"])?$content["原告（自然人）"]:[ [ "原告姓名"=>"", "原告性别"=>"", "原告证件类型"=>"", "原告证件号码"=>"", "原告出生日期"=>"", "原告年龄"=>"", "原告民族"=>"", "原告工作单位"=>"", "原告职务"=>"", "原告住所地"=>"", "原告联系电话"=>"" ] ]; foreach ($yuangao as $key=>$v){ $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("原告（自然人）"); $sexStr = $this->parseSex($v['原告性别']); $table->addCell(7200, $cellRowSpan)->addText("姓名：{$v['原告姓名']} 性别：{$sexStr} 证件类型：{$v['原告证件类型']} 证件号码：{$v['原告证件号码']} 出生日期：{$v['原告证件类型']} 年龄：{$v['原告年龄']} 民族：{$v['原告民族']} 工作单位：{$v['原告工作单位']} 职业：{$v['原告职务']} 住所地：{$v['原告住所地']} 联系电话：{$v['原告联系电话']}"); } //遍历循环原告法人 $yuangaoFaren = isset($content["原告（法人、非法人组织）"])?$content["原告（法人、非法人组织）"]:[ [ "单位名称"=>'', "单位所在地"=>'', "法定代表人/主要负责人"=>'', "法人代表人/主要负责人职务"=>'', "联系电话"=>'', "原告证件类型"=>'', "原告证件号码"=>'', "统一社会信用代码"=>'', "单位性质"=>'', "所有制性质"=>'', ] ]; foreach ($yuangaoFaren as $key=>$v){ $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("原告（法人、非法人组织）"); $companyType = $this->parseCompanyType($v['单位性质']); $companyNature = $this->parseCompanyNature($v['所有制性质']); $table->addCell(7200, $cellRowSpan)->addText("名称：{$v['单位名称']} 住所地（主要办事机构所在地）：{$v['单位所在地']} 法定代表人/主要负责人：{$v['法定代表人/主要负责人']} 职务：{$v['法人代表人/主要负责人职务']} 联系电话：{$v['联系电话']} 证件类型：{$v['原告证件类型']} 证件号码：{$v['原告证件号码']} 统一社会信用代码：{$v['统一社会信用代码']} 类型：{$companyType} 所有制性质：{$companyNature}"); } //委托诉讼人 $wtssr = (isset($content["委托诉讼代理人"]) && $content["委托诉讼代理人"])?$content["委托诉讼代理人"]:[ [ "姓名"=>"", "单位"=>"", "职务"=>"", "联系电话"=>"", "代理权限"=>"", ] ]; foreach ($wtssr as $key=>$v){ $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("委托诉讼代理人"); $lvshicell0 = $table->addCell(7200, $cellRowSpan); if($v['姓名']){ $lvshicell0->addText('有<w:r><w:sym w:font="Wingdings" w:char="00FE"/></w:r>'); }else{ $lvshicell0->addText('有<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>'); } $lvshicell0->addText("姓名：{$v['姓名']} 单位：{$v['单位']} 职务：{$v['职务']} 联系电话：{$v['联系电话']} "); $lvshicell0->addText('一般授权 <w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r> 特别授权 <w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>____________'); if(!$v['姓名']){ $lvshicell0->addText('无<w:r><w:sym w:font="Wingdings" w:char="00FE"/></w:r>'); }else{ $lvshicell0->addText('无<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>'); } } //遍历循环被告 至少包含一个被告 $beigao = isset($content["被告（自然人）"])?$content["被告（自然人）"]:[ [ "被告姓名"=>'', "被告性别"=>'', "被告证件类型"=>'', "被告证件号码"=>'', "被告出生日期"=>'', "被告年龄"=>'', "被告民族"=>'', "被告工作单位"=>'', "被告职务"=>'', "被告住所地"=>'', "被告联系电话"=>'', ] ]; foreach ($beigao as $key=>$v){ $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("被告（自然人）"); $sexStr = $this->parseSex($v['被告性别']); $table->addCell(7200, $cellRowSpan)->addText("姓名：{$v['被告姓名']} 性别：{$sexStr} 证件类型：{$v['被告证件类型']} 证件号码：{$v['被告证件号码']} 出生日期：{$v['被告出生日期']} 年龄：{$v['被告年龄']} 民族：{$v['被告民族']} 工作单位：{$v['被告工作单位']} 职业：{$v['被告职务']} 住所地：{$v['被告住所地']} 联系电话：{$v['被告联系电话']}"); } //遍历循环被告 至少包含一个原告 $beigaoFaren = isset($content["被告（法人、非法人组织）"])?$content["被告（法人、非法人组织）"]:[ [ "单位名称"=>'', "单位所在地"=>'', "法定代表人/主要负责人"=>'', "法人代表人/主要负责人职务"=>'', "联系电话"=>'', "被告证件类型"=>'', "被告证件号码"=>'', "统一社会信用代码"=>'', "单位性质"=>'', "所有制性质"=>'', ] ]; foreach ($beigaoFaren as $key=>$v){ $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("被告（法人、非法人组织）"); $companyType = $this->parseCompanyType($v['单位性质']); $companyNature = $this->parseCompanyNature($v['所有制性质']); $table->addCell(7200, $cellRowSpan)->addText("名称：{$v['单位名称']} 住所地（主要办事机构所在地）：{$v['单位所在地']} 法定代表人/主要负责人：{$v['法定代表人/主要负责人']} 职务：{$v['法人代表人/主要负责人职务']} 联系电话：{$v['联系电话']} 证件类型：{$v['被告证件类型']} 证件号码：{$v['被告证件号码']} 统一社会信用代码：{$v['统一社会信用代码']} 类型：{$companyType} 所有制性质：{$companyNature}"); } //遍历循环第三人 $disanren = isset($content["第三人（自然人）"])?$content["第三人（自然人）"]:[ [ "姓名"=>'', "性别"=>'', "证件类型"=>'', "证件号码"=>'', "出生日期"=>'', "年龄"=>'', "民族"=>'', "工作单位"=>'', "职务"=>'', "住所地"=>'', "联系电话"=>'', ] ]; foreach ($disanren as $key=>$v){ $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("第三人（自然人）"); $sexStr = $this->parseSex($v['性别']); $table->addCell(7200, $cellRowSpan)->addText("姓名：{$v['姓名']} 性别：{$sexStr} 证件类型：{$v['证件类型']} 证件号码：{$v['证件号码']} 出生日期：{$v['出生日期']} 年龄：{$v['年龄']} 民族：{$v['民族']} 工作单位：{$v['工作单位']} 职务：{$v['职务']} 住所地：{$v['住所地']} 联系电话：{$v['联系电话']}"); } //遍历循环 $beigaoFaren = isset($content["第三人（法人、非法人组织）"])?$content["第三人（法人、非法人组织）"]:[ [ "单位名称"=>'', "单位所在地"=>'', "法定代表人/主要负责人"=>'', "法人代表人/主要负责人职务"=>'', "联系电话"=>'', "被告证件类型"=>'', "被告证件号码"=>'', "统一社会信用代码"=>'', "单位性质"=>'', "所有制性质"=>'', ] ]; foreach ($beigaoFaren as $key=>$v){ $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("第三人（法人、非法人组织）"); $companyType = $this->parseCompanyType($v['单位性质']); $companyNature = $this->parseCompanyNature($v['所有制性质']); $table->addCell(7200, $cellRowSpan)->addText("名称：{$v['单位名称']} 住所地（主要办事机构所在地）：{$v['单位所在地']} 法定代表人/主要负责人：{$v['法定代表人/主要负责人']} 职务：{$v['法人代表人/主要负责人职务']} 联系电话：{$v['联系电话']} 证件类型：{$v['被告证件类型']} 证件号码：{$v['被告证件号码']} 统一社会信用代码：{$v['统一社会信用代码']} 类型：{$companyType} 所有制性质：{$companyNature}"); } $table->addRow(500); $cell1 = $table->addCell(9200, $cellRowSpan); $cell1->addText("诉讼请求和依据", array('size' => 18, 'bold'=>true), $paragraphStyleName); $cell1->addText("（原告为卖方时，填写第1项、第2项；原告为买方时，填写第3项、第4项；第5项至第10项为共同项）", array('size' => 12), $paragraphStyleName); $cell1->getStyle()->setGridSpan(2); $table->addRow(500); $cell1 = $table->addCell(9200, $cellRowSpan); if($content['诉讼请求']){ $cell1->addText($content['诉讼请求']); }else{ $cell1->addText("（可完整表述诉讼请求；为方便、准确梳理要点，相关内容请在下方要素式表格中填写）"); } $cell1->getStyle()->setGridSpan(2); //诉讼依据 $geifujiakuan = $yanchiweiyuejin = $qingqiuqingchang = ""; $peichangjin = $weiyueleixing = $jutiqingxing = $sunshijisuan = $xiacizeren = $xicizerenleixing = ''; if(isset($content['原告身份'])){ if($content['原告身份'] == '卖方'){ $geifujiakuan = $content['给付价款']; $yanchiweiyuejin = $content['迟延给付价款的利息（违约金）']; $qingqiuqingchang = $this->parseYesOrNo($content['是否请求支付至实际清偿之日']); }elseif($content['原告身份'] == '买方'){ $peichangjin = $content['支付赔偿金']; if($content['是否请求支付违约金'] == '迟延履行'){ $weiyueleixing = "<w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>迟延履行 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>不履行 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>其他"; }elseif($content['是否请求支付违约金'] == '不履行'){ $weiyueleixing = "<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>迟延履行 <w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>不履行 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>其他"; }elseif($content['是否请求支付违约金'] == '其他'){ $weiyueleixing = "<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>迟延履行 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>不履行 <w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>其他"; }else{ $weiyueleixing = "<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>迟延履行 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>不履行 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>其他"; } $jutiqingxing = $content['具体情形']; $sunshijisuan = $content['损失计算依据']; $xiacizeren = $this->parseYesOrNo($content['是否对标的物的瑕疵承担责任']); if($content['对标的物的瑕疵责任承担方式'] == '修理'){ $xicizerenleixing = "<w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>修理 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>重作 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>更换 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>退货 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>减少价款或者报酬 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>其他"; }elseif($content['是否请求支付违约金'] == '重作'){ $xicizerenleixing = "<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>修理 <w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>重作 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>更换 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>退货 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>减少价款或者报酬 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>其他"; }elseif($content['是否请求支付违约金'] == '更换'){ $xicizerenleixing = "<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>修理 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>重作 <w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>更换 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>退货 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>减少价款或者报酬 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>其他"; }elseif($content['是否请求支付违约金'] == '退货'){ $xicizerenleixing = "<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>修理 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>重作 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>更换 <w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>退货 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>减少价款或者报酬 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>其他"; }elseif($content['是否请求支付违约金'] == '减少价款或者报酬'){ $xicizerenleixing = "<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>修理 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>重作 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>更换 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>退货 <w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>减少价款或者报酬 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>其他"; }elseif($content['是否请求支付违约金'] == '其他'){ $xicizerenleixing = "<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>修理 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>重作 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>更换 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>退货 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>减少价款或者报酬 <w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>其他"; }else{ $xicizerenleixing = "<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>修理 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>重作 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>更换 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>退货 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>减少价款或者报酬 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>其他"; } } $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("1.给付价款（元）"); $table->addCell(7200, $cellRowSpan)->addText($geifujiakuan."元（人民币，下同：如外币需特别注明）；"); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("2.迟延给付价款的利息（违约金）"); $table->addCell(7200, $cellRowSpan)->addText("截至止，迟延给付价款的利息元、违约金{$yanchiweiyuejin}元；自之后的逾期利息、违约金，以 元为基数按照标准计算； 计算方式： 是否请求支付至实际清偿之日止：{$qingqiuqingchang}"); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("3.赔偿因卖方违约所受的损失"); $table->addCell(7200, $cellRowSpan)->addText("支付赔偿金{$peichangjin}元 违约类型：{$weiyueleixing} 具体情形：{$jutiqingxing} 损失计算依据：{$sunshijisuan}"); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("4.是否对标的物的瑕疵承担责任"); $table->addCell(7200, $cellRowSpan)->addText("{$xiacizeren} {$xicizerenleixing}"); } $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("5.要求继续履行或是解除合同"); $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>继续履行 日内履行完毕 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>付款 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>供货 义务 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>判令解除合同 确认买卖合同已于{$content['解除日期']}解除"); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("6.是否主张担保权利"); $zzdbql = $this->parseYesOrNo($content['是否主张担保权利']); if($content['是否主张担保权利'] == '是'){ $content['是否主张担保权利'] = ''; } $table->addCell(7200, $cellRowSpan)->addText("{$zzdbql} 内容：{$content['是否主张担保权利']}"); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("7.是否主张实现债权的费用"); $zzzqfy = $this->parseYesOrNo($content['是否主张实现债权的费用']); if($content['是否主张实现债权的费用'] == '是'){ $content['是否主张实现债权的费用'] = ''; } $table->addCell(7200, $cellRowSpan)->addText("{$zzzqfy} 费用明细：{$content['是否主张实现债权的费用']}"); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("8.是否主张诉讼费用"); $sfzzssf = $this->parseYesOrNo($content['是否主张诉讼费用']); $table->addCell(7200, $cellRowSpan)->addText("{$sfzzssf}"); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("9.其他请求"); $table->addCell(7200, $cellRowSpan)->addText($content['其他请求']); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("10.标的总额"); $table->addCell(7200, $cellRowSpan)->addText($content['标的总额']); $table->addRow(500); $cell1 = $table->addCell(9200, $cellRowSpan); $cell1->addText("约定管辖和诉前保全", array('size' => 18, 'bold'=>true), $paragraphStyleName); $cell1->getStyle()->setGridSpan(2); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("1.有无仲裁、法院管辖约定"); if($content['有无仲裁、法院管辖规定']){ $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>有 合同条款及内容：{$content['有无仲裁、法院管辖规定']} <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>无"); }else{ $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>有 合同条款及内容： <w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>无"); } $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("2.是否申请诉前保全"); if($content['是否已经诉前保全']){ $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>是 {$content['是否已经诉前保全']} <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>否 （如申请诉讼保全，请另行提交诉讼保全申请及相关材料）"); }else{ $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>是 保全法院： 保全时间： 保全案号： <w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>否 （如申请诉讼保全，请另行提交诉讼保全申请及相关材料）"); } $table->addRow(500); $cell1 = $table->addCell(9200, $cellRowSpan); $cell1->addText("事实和理由", array('size' => 18), $paragraphStyleName); $cell1->getStyle()->setGridSpan(2); $table->addRow(500); $cell1 = $table->addCell(9200, $cellRowSpan); if($content['事实与理由']){ $cell1->addText($content['事实与理由']); }else{ $cell1->addText("（可完整表述纠纷涉及的事实与理由；为方便、准确梳理要点，相关内容请在下方要素式表格中填写）"); } $cell1->getStyle()->setGridSpan(2); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("1.合同的签订情况(名称、编号、签订时间、地点等;如无书面合同,请注明“无书面合同”)"); $table->addCell(7200, $cellRowSpan)->addText($content['合同签订情况']); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("2.合同主体"); $table->addCell(7200, $cellRowSpan)->addText("出卖人（卖方）：{$content['出卖人（卖方）']} 买受人（买方）：{$content['买受人（买方）']}"); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("3.买卖标的物情况（标的物名称、规格、质量、数量等）"); $table->addCell(7200, $cellRowSpan)->addText($content['买卖标的物情况']); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("4.合同约定的价格及支付方式"); $table->addCell(7200, $cellRowSpan)->addText("单价{$content['合同约定的单价']}元；总价{$content['合同约定的总价']}元； 以<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>现金<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>转账<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>票据（写明票据类型）<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>其他 方式 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>一次性<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>分期支付 分期方式：{$content['分期方式']}"); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("5.合同约定的交货时间、地点、方式、风险承担、安装、调试、验收"); $table->addCell(7200, $cellRowSpan)->addText($content['合同约定信息']); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("6.合同约定的质量标准及检验方式、质量异议期限"); $table->addCell(7200, $cellRowSpan)->addText($content['合同约定的质量标准及检验方式、质量异议期限']); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("7.合同约定的违约金（定金）"); $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>违约金 元（合同条款：第 条） <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>定金 元（合同条款：第 条） <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>迟延履行违约金 %/日（合同条款：第 条） "); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("8.价款支付及标的物交付情况"); $table->addCell(7200, $cellRowSpan)->addText("按期支付价款 元，逾期付款 元，逾期未付款 元 按期交付标的物 件，逾期交付 件，逾期未交付 件"); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("9.是否存在延迟履行"); $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>是 延迟时间： <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>逾期付款<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>逾期交货 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>否"); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("10.是否催促过履行"); $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>是 催促情况： 年 月 日通过 方式进行了催促 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>否"); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("11.买卖合同标的物有无质量争议"); $bzwzlzy = $this->parseYesOrNo($content['买卖合同标的物有无质量争议']); if($content['买卖合同标的物有无质量争议'] == '是' || $content['买卖合同标的物有无质量争议'] == '有'){ $content['买卖合同标的物有无质量争议'] = ''; } $table->addCell(7200, $cellRowSpan)->addText("{$bzwzlzy} 具体情况：{$content['买卖合同标的物有无质量争议']}"); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("12.标的物质量规格或履行方式是否存在不符合约定的情况"); $lxfsbf = $this->parseYesOrNo($content['标的物质量规格或履行方式是否存在不符合约定的情况']); if($content['标的物质量规格或履行方式是否存在不符合约定的情况'] == '是' || $content['标的物质量规格或履行方式是否存在不符合约定的情况'] == '有'){ $content['标的物质量规格或履行方式是否存在不符合约定的情况'] = ''; } $table->addCell(7200, $cellRowSpan)->addText("{$lxfsbf} 具体情况：{$content['标的物质量规格或履行方式是否存在不符合约定的情况']}"); /*$table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>有 具体情况：{$content['标的物质量规格或履行方式是否存在不符合约定的情况']} <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>无");*/ $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("13.是否曾就标的物质量问题进行协商"); //$table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>有 具体情况：{$content['是否曾就标的物质量问题进行协商']} <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>无"); $zlwtxs = $this->parseYesOrNo($content['是否曾就标的物质量问题进行协商']); if($content['是否曾就标的物质量问题进行协商'] == '是' || $content['是否曾就标的物质量问题进行协商'] == '有'){ $content['是否曾就标的物质量问题进行协商'] = ''; } $table->addCell(7200, $cellRowSpan)->addText("{$zlwtxs} 具体情况：{$content['是否曾就标的物质量问题进行协商']}"); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("14.是否通知解除合同"); //$table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>有 具体情况：{$content['是否通知解除合同']} <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>无"); $sftzjcht = $this->parseYesOrNo($content['是否通知解除合同']); if($content['是否通知解除合同'] == '是' || $content['是否通知解除合同'] == '有'){ $content['是否通知解除合同'] = ''; } $table->addCell(7200, $cellRowSpan)->addText("{$sftzjcht} 具体情况：{$content['是否通知解除合同']}"); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("15.被告应当支付的利息、违约金、赔偿金"); $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>利息 {$content['被告应当支付的利息、违约金、赔偿金']['利息']} 元 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>违约金 {$content['被告应当支付的利息、违约金、赔偿金']['违约金']} 元 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>赔偿金 {$content['被告应当支付的利息、违约金、赔偿金']['赔偿金']} 元 共计{$content['被告应当支付的利息、违约金、赔偿金']['共计']}元 计算方式：{$content['被告应当支付的利息、违约金、赔偿金']['计算方式']}"); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("16.是否签订物的担保（抵押、质押）合同"); $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>是 签订时间：{$content['是否签订物的担保（抵押、质押）合同']} <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>否"); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("17.担保人、担保物"); $table->addCell(7200, $cellRowSpan)->addText("担保人：{$content['担保人']} 担保物：{$content['担保物']}"); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("18.是否最高额担保（抵押、质押）"); $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>是 担保债权的确定时间：{$content['是否最高额担保（抵押、质押）']['担保债权的确定时间']} 担保额度：{$content['是否最高额担保（抵押、质押）']['担保额度']} <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>否"); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("19.是否办理抵押、质押登记"); $sfbldy = "<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>是 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>正式登记 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>预告登记 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>否"; if($content['抵押、质押登记登记方式']){ if($content['抵押、质押登记登记方式'] == '正式登记'){ $sfbldy = "<w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>是 <w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>正式登记 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>预告登记 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>否"; }elseif($content['抵押、质押登记登记方式'] == '预告登记'){ $sfbldy = "<w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>是 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>正式登记 <w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>预告登记 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>否"; } } $table->addCell(7200, $cellRowSpan)->addText("{$sfbldy}"); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("20.是否签订保证合同"); if($content['是否签订保证合同']['保证人']){ $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>是 签订时间：{$content['是否签订保证合同']['签订时间']} 保证人： {$content['是否签订保证合同']['保证人']} 主要内容：{$content['是否签订保证合同']['保证合同主要内容']} <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>否"); }else{ $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>是 签订时间： 保证人： 主要内容： <w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>否"); } $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("21.保证方式"); if($content['是否签订保证合同']['保证方式'] == '一般保证'){ $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>一般保证 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>连带责任保证"); }else if($content['是否签订保证合同']['保证方式'] == '连带责任保证'){ $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>一般保证 <w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>连带责任保证"); }else{ $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>一般保证 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>连带责任保证"); } $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("22.其他担保方式"); if($content['其他担保方式']['担保形式']){ $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>是 形式：{$content['其他担保方式']['担保形式']} 签订时间：{$content['其他担保方式']['签订时间']} <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>连带责任保证"); }else{ $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>是 形式： 签订时间： <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>连带责任保证"); } $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("23.请求承担责任的依据"); $table->addCell(7200, $cellRowSpan)->addText("合同约定：{$content['请求承担责任的合同约定']} 法律规定：{$content['请求承担责任的法律规定']}"); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("24.其他需要说明的内容"); $table->addCell(7200, $cellRowSpan)->addText($content['其他需要说明的内容']); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("25.证据清单"); $table->addCell(7200, $cellRowSpan)->addText($content['证据清单']); $table->addRow(500); $cell1 = $table->addCell(9200, $cellRowSpan); $cell1->addText("对纠纷解决方式的意愿", array('size' => 18, 'bold'=>true), $paragraphStyleName); $cell1->getStyle()->setGridSpan(2); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("是否了解调解作为非诉讼纠纷解决方式，能及时、高效、低成本、不伤和气地解决纠纷"); $isKnow = $this->parseIsKnow($content['对纠纷解决方式的意愿']['是否了解调解作为非诉讼纠纷解决方式，能及时、高效、低成本、不伤和气地解决纠纷']); $table->addCell(7200, $cellRowSpan)->addText("{$isKnow}"); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("是否了解先行调解解决纠纷的好处"); $isKnow1 = $this->parseIsKnow($content['对纠纷解决方式的意愿']['立案后选择先行调解的，可以很快启动调解程序。如不同意调解，法院将依程序开庭审理案件，但可能需要经过较长一段时间的排期等待，且审理、执行周期相对较长']); $isKnow2 = $this->parseIsKnow($content['对纠纷解决方式的意愿']['选择先行调解，调解成功且自动履行的免交诉讼费用，申请司法确认的不交纳诉讼费用，要求出具调解书的减半交纳诉讼费用']); $isKnow3 = $this->parseIsKnow($content['对纠纷解决方式的意愿']['首次调解不成功，但仍有继续调解意愿的，可以选择更换调解组织和调解员再进行调解。调解无法达成一致意见的，法院将依程序排期开庭']); $isKnow4 = $this->parseIsKnow($content['对纠纷解决方式的意愿']['依照法律规定，调解具有保密性要求，调解过程不公开，调解协议未经当事人同意不得公开']); $isKnow5 = $this->parseIsKnow($content['对纠纷解决方式的意愿']['调解达成的协议具有法律效力，可以依照法律规定申请司法确认，具有强制执行效力']); $table->addCell(7200, $cellRowSpan)->addText("1. 立案后选择先行调解的，可以很快启动调解程序。如不同意调解，法院 将依程序开庭审理案件，但可能需要经过较长一段时间的排期等待，且审理、执行周期相对较长。 {$isKnow1} 2. 选择先行调解，调解成功且自动履行的免交诉讼费用，申请司法确认的不交纳诉讼费用，要求出具调解书的减半交纳诉讼费用。 {$isKnow2} 3. 首次调解不成功，但仍有继续调解意愿的，可以选择更换调解组织和调解员再进行调解。调解无法达成一致意见的，法院将依程序排期开庭。 {$isKnow3} 4. 依照法律规定，调解具有保密性要求，调解过程不公开，调解协议未经当事人同意不得公开。 {$isKnow4} 5. 调解达成的协议具有法律效力，可以依照法律规定申请司法确认，具有强制执行效力。 {$isKnow5}"); $table->addRow(500); $table->addCell(2000, $cellRowSpan)->addText("是否考虑先行调解"); if($content['对纠纷解决方式的意愿']['是否考虑先行调解'] == '是'){ $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>是 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>否 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>暂不确定，想要了解更多内容"); }elseif($content['对纠纷解决方式的意愿']['是否考虑先行调解'] == '否'){ $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>是 <w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>否 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>暂不确定，想要了解更多内容"); }elseif($content['对纠纷解决方式的意愿']['是否考虑先行调解'] == '暂不确定'){ $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>是 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>否 <w:r><w:sym w:font='Wingdings' w:char='00FE'/></w:r>暂不确定，想要了解更多内容"); }else{ $table->addCell(7200, $cellRowSpan)->addText("<w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>是 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>否 <w:r><w:sym w:font='Wingdings' w:char='00A8'/></w:r>暂不确定，想要了解更多内容"); } $section->addText(" 具状人 （签字、盖章）： ", [], ['alignment' => Jc::END]); $section->addText("日期：".date("Y-m-d").' ', [], ['alignment' => Jc::END]); //生成 $phpWord->save($savePath); return $savePath; } /** * 解析性别 * @param $value * @return string */ public function parseSex($value='') { $str = '男<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>女<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>'; if($value=='男'){ $str = '男<w:r><w:sym w:font="Wingdings" w:char="00FE"/></w:r>女<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>'; }elseif($value=='女'){ $str = '男<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>女<w:r><w:sym w:font="Wingdings" w:char="00FE"/></w:r>'; } return $str; } /** * 解析企业类型 * @param $value * @return string */ public function parseCompanyType($value='') { $typeArr = ["有限责任公司", "股份有限公司", "上市公司", "其他企业法人", "事业单位", "社会团体", "基金会", "社会服务机构", "机关法人", "农村集体经济组织法人", "城镇农村的合作经济组织法人", "基层群众性自治组织法人", "个人独资企业", "合伙企业", "不具有法人资格的专业服务机构"]; $str = ''; //如value包含在typeArr中，则对应标记为选中 foreach ($typeArr as $k=>$v){ if($value == $v){ $str .= '<w:r><w:sym w:font="Wingdings" w:char="00FE"/></w:r>'.$v; }else{ $str .= '<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>'.$v; } } return $str; } /** * 解析企业性质 * @param $value * @return string */ public function parseCompanyNature($value='') { $typeArr = ["国有控股", "国有参股", "民营"]; $str = ''; //如value包含在typeArr中，则对应标记为选中 foreach ($typeArr as $k=>$v){ if($value == $v){ $str .= '<w:r><w:sym w:font="Wingdings" w:char="00FE"/></w:r>'.$v; }else{ $str .= '<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>'.$v; } } $str .= "其他_______"; return $str; } /** * 解析是否复选框 * @param string $value * @return string */ public function parseYesOrNo($value='') { if($value == '是'){ $str = '是<w:r><w:sym w:font="Wingdings" w:char="00FE"/></w:r>否<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>'; }elseif($value == '否'){ $str = '是<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>否<w:r><w:sym w:font="Wingdings" w:char="00FE"/></w:r>'; }else{ $str = '是<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>否<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>'; } return $str; } /** * 解析是否了解复选框 * @param string $value * @return string */ public function parseIsKnow($value='') { if($value == '了解'){ $str = '了解<w:r><w:sym w:font="Wingdings" w:char="00FE"/></w:r>不了解<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>'; }elseif($value == '不了解'){ $str = '了解<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>不了解<w:r><w:sym w:font="Wingdings" w:char="00FE"/></w:r>'; }else{ $str = '了解<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>不了解<w:r><w:sym w:font="Wingdings" w:char="00A8"/></w:r>'; } return $str; } }
两步验证（Two-Factor Authentication，2FA）是一种增加账户安全性的方式，它要求用户提供两种不同类型的身份验证凭据才能访问服务或数据。这种核心思想建立在“知道”和“拥有”两种安全因素上：一种是用户知道的信息（如密码或PIN码），另一种是用户拥有的物理设备（如手机或安全令牌）。这样，即使攻击者窃取了用户的密码，没有物理设备也无法完成认证过程。多因素认证（MFA）的实现主要包含以下几个核心环节和技术要点，其流程设计兼顾安全性与用户体验：一、核心实现流程MFA 实现需平衡安全性与易用性，生物识别虽便捷但需考虑隐私合规（如 GDPR 生物数据特殊保护）。密钥初始化与绑定‌用户启用 MFA 时，系统生成唯一密钥（如 Base32 编码字符串），并通过加密 QR 码展示给用户扫描绑定认证器（如 Google Authenticator、Authy）。密钥安全存储于服务器端，并与用户账号关联。[...]
NanoID一个小巧、安全、URL友好、唯一的 JavaScript 字符串 ID 生成器。小巧：130 bytes (已压缩和 gzipped)， 没有依赖，Size Limit 控制大小；快速：它比 UUID 快 60%；安全：它使用加密的强随机 API，可在集群中使用；紧凑：它使用比 UUID（A-Za-z0-9_-）更大的字母表，因此，ID 大小从 36 个符号减少到 21 个符号；易用：Nano ID 已被移植到 20种编程语言。php版：https://github.com/hidehalo/nanoid-php[...]
nginx配置文件fastcgi.conf找到fastcgi_param PHP_ADMIN_VALUE这个参数，在这个参数的字符串中加入路径fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/:/mnt/hgfs/phpworkspace/:站点部署路径";
国密算法sm4对应的php加解密代码<?php Class SM4Util { const SM4_CK = [ 0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269, 0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9, 0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249, 0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9, 0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229, 0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299, 0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209, 0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279 ]; const SM4_Sbox = [ 0xd6, 0x90, 0xe9, 0xfe, 0xcc, 0xe1, 0x3d, 0xb7, 0x16, 0xb6, 0x14, 0xc2, 0x28, 0xfb, 0x2c, 0x05, 0x2b, 0x67, 0x9a, 0x76, 0x2a, 0xbe, 0x04, 0xc3, 0xaa, 0x44, 0x13, 0x26, 0x49, 0x86, 0x06, 0x99, 0x9c, 0x42, 0x50, 0xf4, 0x91, 0xef, 0x98, 0x7a, 0x33, 0x54, 0x0b, 0x43, 0xed, 0xcf, 0xac, 0x62, 0xe4, 0xb3, 0x1c, 0xa9, 0xc9, 0x08, 0xe8, 0x95, 0x80, 0xdf, 0x94, 0xfa, 0x75, 0x8f, 0x3f, 0xa6, 0x47, 0x07, 0xa7, 0xfc, 0xf3, 0x73, 0x17, 0xba, 0x83, 0x59, 0x3c, 0x19, 0xe6, 0x85, 0x4f, 0xa8, 0x68, 0x6b, 0x81, 0xb2, 0x71, 0x64, 0xda, 0x8b, 0xf8, 0xeb, 0x0f, 0x4b, 0x70, 0x56, 0x9d, 0x35, 0x1e, 0x24, 0x0e, 0x5e, 0x63, 0x58, 0xd1, 0xa2, 0x25, 0x22, 0x7c, 0x3b, 0x01, 0x21, 0x78, 0x87, 0xd4, 0x00, 0x46, 0x57, 0x9f, 0xd3, 0x27, 0x52, 0x4c, 0x36, 0x02, 0xe7, 0xa0, 0xc4, 0xc8, 0x9e, 0xea, 0xbf, 0x8a, 0xd2, 0x40, 0xc7, 0x38, 0xb5, 0xa3, 0xf7, 0xf2, 0xce, 0xf9, 0x61, 0x15, 0xa1, 0xe0, 0xae, 0x5d, 0xa4, 0x9b, 0x34, 0x1a, 0x55, 0xad, 0x93, 0x32, 0x30, 0xf5, 0x8c, 0xb1, 0xe3, 0x1d, 0xf6, 0xe2, 0x2e, 0x82, 0x66, 0xca, 0x60, 0xc0, 0x29, 0x23, 0xab, 0x0d, 0x53, 0x4e, 0x6f, 0xd5, 0xdb, 0x37, 0x45, 0xde, 0xfd, 0x8e, 0x2f, 0x03, 0xff, 0x6a, 0x72, 0x6d, 0x6c, 0x5b, 0x51, 0x8d, 0x1b, 0xaf, 0x92, 0xbb, 0xdd, 0xbc, 0x7f, 0x11, 0xd9, 0x5c, 0x41, 0x1f, 0x10, 0x5a, 0xd8, 0x0a, 0xc1, 0x31, 0x88, 0xa5, 0xcd, 0x7b, 0xbd, 0x2d, 0x74, 0xd0, 0x12, 0xb8, 0xe5, 0xb4, 0xb0, 0x89, 0x69, 0x97, 0x4a, 0x0c, 0x96, 0x77, 0x7e, 0x65, 0xb9, 0xf1, 0x09, 0xc5, 0x6e, 0xc6, 0x84, 0x18, 0xf0, 0x7d, 0xec, 0x3a, 0xdc, 0x4d, 0x20, 0x79, 0xee, 0x5f, 0x3e, 0xd7, 0xcb, 0x39, 0x48 ]; /** * 系统参数 */ const SM4_FK = [0xA3B1BAC6, 0x56AA3350, 0x677D9197, 0xB27022DC]; private $key = [];//16个 HEXHEX格式的数组 16字节 128bits 为了操作方便,直接存成十进制 private $skey = [];//记录每轮加密的秘钥 记录成十进制 private $block_size = 32; /** * 字符串转16进制 * @param $str * @return string */ public function strToHex($string){ $hex=""; for($i=0;$i<strlen($string);$i++) $hex.=dechex(ord($string[$i])); $hex=strtoupper($hex); if(strlen($hex)>32){ return substr($hex,0,32); }else{ return $hex; } } /**设置加密秘钥 * * @param $key 32个十六进制的字符 * * @return $this * @throws Exception */ public function setKey($key) { $key = $this->strToHex($key); $this->key = $this->preProcess($key); $this->setSkey(); return $this; } /** * 计算每轮加密需要的秘钥 */ private function setSkey() { $skey = []; for ($i = 0; $i < 4; $i++) { $skey[] = self::SM4_FK[$i] ^ ($this->key[4 * $i] << 24 | $this->key[4 * $i + 1] << 16 | $this->key[4 * $i + 2] << 8 | $this->key[4 * $i + 3]); } for ($k = 0; $k < 32; $k++) { $tmp = $skey[$k + 1] ^ $skey[$k + 2] ^ $skey[$k + 3] ^ self::SM4_CK[$k]; //非线性化操作 $buf = (self::SM4_Sbox[($tmp >> 24) & 0xff]) << 24 | (self::SM4_Sbox[($tmp >> 16) & 0xff]) << 16 | (self::SM4_Sbox[($tmp >> 8) & 0xff]) << 8 | (self::SM4_Sbox[$tmp & 0xff]); //线性化操作 $skey[] = $skey[$k] ^ ($buf ^ $this->sm4Rotl32($buf, 13) ^ $this->sm4Rotl32($buf, 23)); $this->skey[] = $skey[$k + 4]; } } /**32比特的buffer中循环左移n位 * * @param $buf int 可以传递进10进制 也可以是0b开头的二进制 * @param $n int 向左偏移n位 * * @return int * reference http://blog.csdn.net/w845695652/article/details/6522285 */ private function sm4Rotl32($buf, $n) { return (($buf << $n) & 0xffffffff) | ($buf >> (32 - $n)); } /** * 对字符串加密 * * @param $plainText * * @return string * @throws Exception */ public function encryptData($plainText) { $bytes = bin2hex($plainText); $need_pad_length = $this->block_size - strlen($bytes) % $this->block_size; $pad_bytes = str_pad( $bytes, strlen($bytes) + $need_pad_length, sprintf("%02x", $need_pad_length / 2), STR_PAD_RIGHT ); $chunks = str_split($pad_bytes, $this->block_size); return strtolower(implode('', array_map(function ($chunk) { return $this->encrypt($chunk); }, $chunks))); } /**SM4加密单个片段(128bit) * * @param $text string 32个十六进制字符串 * * @return string * @throws Exception */ public function encrypt($text) { $x = $re = []; $t = $this->preProcess($text); for ($i = 0; $i < 4; $i++) { $x[] = $t[$i * 4] << 24 | $t[$i * 4 + 1] << 16 | $t[$i * 4 + 2] << 8 | $t[$i * 4 + 3]; } for ($k = 0; $k < 32; $k++) { $tmp = $x[$k + 1] ^ $x[$k + 2] ^ $x[$k + 3] ^ $this->skey[$k]; $buf = self::SM4_Sbox[($tmp >> 24) & 0xff] << 24 | self::SM4_Sbox[($tmp >> 16) & 0xff] << 16 | self::SM4_Sbox[($tmp >> 8) & 0xff] << 8 | self::SM4_Sbox[$tmp & 0xff]; $x[$k + 4] = $x[$k] ^ $buf ^ $this->sm4Rotl32($buf, 2) ^ $this->sm4Rotl32($buf, 10) ^ $this->sm4Rotl32($buf, 18) ^ $this->sm4Rotl32($buf, 24); } for ($i = 0; $i < 4; $i++) { $re[] = ($x[35 - $i] >> 24) & 0xff; $re[] = ($x[35 - $i] >> 16) & 0xff; $re[] = ($x[35 - $i] >> 8) & 0xff; $re[] = $x[35 - $i] & 0xff; } return $this->wrapResult($re); } /**预处理16字节长度的16进制字符串 返回10进制的数组 数组大小为16 * * @param $text * * @return array * @throws Exception */ private function preProcess($text) { preg_match('/[0-9a-f]{32}/', strtolower($text), $re); if (empty($re)) { throw new Exception('error input format!'); } $key = $re[0]; for ($i = 0; $i < 16; $i++) { $result[] = hexdec($key[2 * $i] . $key[2 * $i + 1]); } return $result; } /**将十进制结果包装成16进制字符串输出 * * @param $result * * @return string */ private function wrapResult($result) { $hex_str = ''; foreach ($result as $v) { $tmp = dechex($v); $len = strlen($tmp); if ($len == 1)//不足两位十六进制的数 在前面补一个0,保证输出也是32个16进制字符 { $hex_str .= '0'; } $hex_str .= $tmp; } return strtoupper($hex_str); } /**SM4解密单个片段(128bits) * * @param $text string 32个16进制字符串 * * @return string * @throws Exception */ public function decrypt($text) { $x = $re = []; $t = $this->preProcess($text); for ($i = 0; $i < 4; $i++) { $x[] = $t[4 * $i] << 24 | $t[4 * $i + 1] << 16 | $t[4 * $i + 2] << 8 | $t[4 * $i + 3]; } for ($k = 0; $k < 32; $k++) { $tmp = $x[$k + 1] ^ $x[$k + 2] ^ $x[$k + 3] ^ $this->skey[31 - $k]; $buf = (self::SM4_Sbox[($tmp >> 24) & 0xff]) << 24 | (self::SM4_Sbox[($tmp >> 16) & 0xff]) << 16 | (self::SM4_Sbox[($tmp >> 8) & 0xff]) << 8 | (self::SM4_Sbox[$tmp & 0xff]); $x[$k + 4] = $x[$k] ^ $buf ^ $this->sm4Rotl32($buf, 2) ^ $this->sm4Rotl32($buf, 10) ^ $this->sm4Rotl32($buf, 18) ^ $this->sm4Rotl32($buf, 24); } for ($i = 0; $i < 4; $i++) { $re[] = ($x[35 - $i] >> 24) & 0xff; $re[] = ($x[35 - $i] >> 16) & 0xff; $re[] = ($x[35 - $i] >> 8) & 0xff; $re[] = $x[35 - $i] & 0xff; } return $this->wrapResult($re); } public function decryptData($cipherText) { $chunks = str_split($cipherText, $this->block_size); $decrypt_text_data = implode('', array_map(function ($chunk) { return $this->decrypt($chunk); }, $chunks)); $pad_length = hexdec(substr($decrypt_text_data, -2)); return strtolower(hex2bin(preg_replace( sprintf("/%s$/", str_repeat(sprintf("%02x", $pad_length), $pad_length)), '', $decrypt_text_data ))); } } $data=[ "DOC_ID"=>"",'STATE'=>"1" ]; $sm4 = new SM4Util(); $original_plain_text_data = json_encode($data,true); $key = 'abcdefghij123456'; $origin_encrypted_text = '58fb892aef37be96fc032d0613d4aaea5cb416baa6aac04f304d02604bb4701c'; $encrypted_text_data = $sm4->setKey($key)->encryptData($original_plain_text_data); echo ' '; echo"自己加密：".$encrypted_text_data; echo ' 长度：'.strlen($encrypted_text_data); echo ' '; echo"自己解密：". $sm4->setKey($key)->decryptData($encrypted_text_data); echo ' '; echo"原文：".$origin_encrypted_text; echo ' 长度：'.strlen($origin_encrypted_text); //$encrypted_text_2_plain_text = $sm4->setKey($key)->decryptData($encrypted_text_data); $original_decrypted_text = $sm4->setKey($key)->decryptData($origin_encrypted_text); echo ' '; echo "原文解密：".$original_decrypted_text ; echo ' '; 另一种方法（实际使用过程中未解密成功，暂未深究）<?php class SM4 { const SM4_CK = [ 0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269, 0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9, 0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249, 0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9, 0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229, 0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299, 0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209, 0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279 ]; const SM4_SBOX = [ 0xd6,0x90,0xe9,0xfe,0xcc,0xe1,0x3d,0xb7,0x16,0xb6,0x14,0xc2,0x28,0xfb,0x2c,0x05, 0x2b,0x67,0x9a,0x76,0x2a,0xbe,0x04,0xc3,0xaa,0x44,0x13,0x26,0x49,0x86,0x06,0x99, 0x9c,0x42,0x50,0xf4,0x91,0xef,0x98,0x7a,0x33,0x54,0x0b,0x43,0xed,0xcf,0xac,0x62, 0xe4,0xb3,0x1c,0xa9,0xc9,0x08,0xe8,0x95,0x80,0xdf,0x94,0xfa,0x75,0x8f,0x3f,0xa6, 0x47,0x07,0xa7,0xfc,0xf3,0x73,0x17,0xba,0x83,0x59,0x3c,0x19,0xe6,0x85,0x4f,0xa8, 0x68,0x6b,0x81,0xb2,0x71,0x64,0xda,0x8b,0xf8,0xeb,0x0f,0x4b,0x70,0x56,0x9d,0x35, 0x1e,0x24,0x0e,0x5e,0x63,0x58,0xd1,0xa2,0x25,0x22,0x7c,0x3b,0x01,0x21,0x78,0x87, 0xd4,0x00,0x46,0x57,0x9f,0xd3,0x27,0x52,0x4c,0x36,0x02,0xe7,0xa0,0xc4,0xc8,0x9e, 0xea,0xbf,0x8a,0xd2,0x40,0xc7,0x38,0xb5,0xa3,0xf7,0xf2,0xce,0xf9,0x61,0x15,0xa1, 0xe0,0xae,0x5d,0xa4,0x9b,0x34,0x1a,0x55,0xad,0x93,0x32,0x30,0xf5,0x8c,0xb1,0xe3, 0x1d,0xf6,0xe2,0x2e,0x82,0x66,0xca,0x60,0xc0,0x29,0x23,0xab,0x0d,0x53,0x4e,0x6f, 0xd5,0xdb,0x37,0x45,0xde,0xfd,0x8e,0x2f,0x03,0xff,0x6a,0x72,0x6d,0x6c,0x5b,0x51, 0x8d,0x1b,0xaf,0x92,0xbb,0xdd,0xbc,0x7f,0x11,0xd9,0x5c,0x41,0x1f,0x10,0x5a,0xd8, 0x0a,0xc1,0x31,0x88,0xa5,0xcd,0x7b,0xbd,0x2d,0x74,0xd0,0x12,0xb8,0xe5,0xb4,0xb0, 0x89,0x69,0x97,0x4a,0x0c,0x96,0x77,0x7e,0x65,0xb9,0xf1,0x09,0xc5,0x6e,0xc6,0x84, 0x18,0xf0,0x7d,0xec,0x3a,0xdc,0x4d,0x20,0x79,0xee,0x5f,0x3e,0xd7,0xcb,0x39,0x48 ]; const SM4_FK = [0xA3B1BAC6, 0x56AA3350, 0x677D9197, 0xB27022DC]; public $_rk = []; public $_block_size = 16; public function __construct() { } public function encrypt($key, $data) { $this->sM4KeySchedule($key); $bytes = $this->pad($data, $this->_block_size); $chunks = array_chunk($bytes, $this->_block_size); $ciphertext = ""; foreach ($chunks as $chunk) { $ciphertext .= $this->sM4Encrypt($chunk); } return base64_encode($ciphertext); } public function decrypt($key, $data) { $data = base64_decode($data); if (strlen($data) < 0 || strlen($data) % $this->_block_size != 0) { return false; } $this->sM4KeySchedule($key); $bytes = unpack("C*", $data); $chunks = array_chunk($bytes, $this->_block_size); $plaintext = ""; foreach ($chunks as $chunk) { $plaintext .= substr($this->sM4Decrypt($chunk), 0, 16); } $plaintext = $this->un_pad($plaintext); return $plaintext; } private function sM4Decrypt($cipherText) { $x = []; for ($j=0; $j<4; $j++) { $x[$j]=($cipherText[$j*4]<<24) |($cipherText[$j*4+1]<<16)| ($cipherText[$j*4+2]<<8)|($cipherText[$j*4+3]); } for ($i=0; $i<32; $i++) { $tmp = $x[$i+1]^$x[$i+2]^$x[$i+3]^$this->_rk[31-$i]; $buf= (self::SM4_SBOX[($tmp >> 24) & 0xFF]) << 24 |(self::SM4_SBOX[($tmp >> 16) & 0xFF]) << 16 |(self::SM4_SBOX[($tmp >> 8) & 0xFF]) << 8 |(self::SM4_SBOX[$tmp & 0xFF]); $x[$i+4]=$x[$i]^($buf^$this->sm4Rotl32(($buf), 2)^ $this->sm4Rotl32(($buf), 10) ^ $this->sm4Rotl32(($buf), 18)^ $this->sm4Rotl32(($buf), 24)); } $plainText = []; for ($k=0; $k<4; $k++) { $plainText[4*$k]=($x[35-$k]>> 24)& 0xFF; $plainText[4*$k+1]=($x[35-$k]>> 16)& 0xFF; $plainText[4*$k+2]=($x[35-$k]>> 8)& 0xFF; $plainText[4*$k+3]=($x[35-$k])& 0xFF; } return $this->bytesToString($plainText); } private function sM4Encrypt($plainText) { $x = []; for ($j=0; $j<4; $j++) { $x[$j]=($plainText[$j*4]<<24) |($plainText[$j*4+1]<<16)| ($plainText[$j*4+2]<<8)|($plainText[$j*4+3]); } for ($i=0; $i<32; $i++) { $tmp = $x[$i+1]^$x[$i+2]^$x[$i+3]^$this->_rk[$i]; $buf= (self::SM4_SBOX[($tmp >> 24) & 0xFF]) << 24 |(self::SM4_SBOX[($tmp >> 16) & 0xFF]) << 16 |(self::SM4_SBOX[($tmp >> 8) & 0xFF]) << 8 |(self::SM4_SBOX[$tmp & 0xFF]); $x[$i+4]=$x[$i]^($buf^$this->sm4Rotl32(($buf), 2)^ $this->sm4Rotl32(($buf), 10) ^ $this->sm4Rotl32(($buf), 18)^ $this->sm4Rotl32(($buf), 24)); } $cipherText = []; for ($k=0; $k<4; $k++) { $cipherText[4*$k]=($x[35-$k]>> 24)& 0xFF; $cipherText[4*$k+1]=($x[35-$k]>> 16)& 0xFF; $cipherText[4*$k+2]=($x[35-$k]>> 8)& 0xFF; $cipherText[4*$k+3]=($x[35-$k])& 0xFF; } return $this->bytesToString($cipherText); } private function stringToBytes($string) { return unpack('C*', $string); } private function bytesToString($bytes) { return vsprintf(str_repeat('%c', count($bytes)), $bytes); } private function pad($data) { $bytes = $this->stringToBytes($data); $rem = $this->_block_size - count($bytes) % $this->_block_size; for ($i = 0; $i < $rem; $i++) { array_push($bytes, $rem); } return $bytes; } private function un_pad($data) { $bytes = $this->stringToBytes($data); $rem = $bytes[count($bytes)]; $bytes = array_slice($bytes, 0, count($bytes) - $rem); return $this->bytesToString($bytes); } private function sm4Rotl32($buf, $n) { return (($buf << $n) & 0xffffffff) | ($buf >> (32-$n)); } private function sM4KeySchedule($key) { $this->_rk = []; $key = array_values(unpack("C*", $key)); $k = []; for ($i=0; $i<4; $i++) { $k[$i] = self::SM4_FK[$i]^(($key[4*$i]<<24) | ($key[4*$i+1]<<16) |($key[4*$i+2]<<8) | ($key[4*$i+3])); } for ($j=0; $j<32; $j++) { $tmp = $k[$j+1]^$k[$j+2]^$k[$j+3]^ self::SM4_CK[$j]; $buf = (self::SM4_SBOX[($tmp >> 24) & 0xFF]) << 24 |(self::SM4_SBOX[($tmp >> 16) & 0xFF]) << 16 |(self::SM4_SBOX[($tmp >> 8) & 0xFF]) << 8 |(self::SM4_SBOX[$tmp & 0xFF]); $k[$j+4]=$k[$j]^(($buf)^($this->sm4Rotl32(($buf), 13))^($this->sm4Rotl32(($buf), 23))); $this->_rk[$j]=$k[$j+4]; } } } $key = base64_decode("E1Fg4vX90nFUmP7lmsg6FA==");//加密使用的key(字符串) // $key = '1478523698563214'; $data = '中国加中国加油中国加油中国加油中国加油中国加油中国加油中国加油中国加油中国加油中国加油中国加油中国加油油'; $sm4 = new SM4(); echo "加密key：" . $key . " "; echo "明文：" . $data . " "; $a = $sm4->encrypt($key, $data); echo "加密结果：" . $a . " "; $b = $sm4->decrypt($key, $a); echo "解密结果：" . $b . " ";
利用DatePeriod 类获取两个日期之间的所有日期
官方文档：https://www.php.net/manual/zh/class.dateperiod.phpDatePeriod 类表示一个时间周期，时间周期内允许对一组日期和时间进行迭代，在指定的时间间隔内定期重复。注意：8.2 新增 DatePeriod::INCLUDE_END_DATE/** * 获取两个日期间的所有日期 * @param $startDate 2023-04-01 * @param $endDate 2023-04-19 * @param $format * @param $last 是否包含最后一天 * @return array * @throws Exception */ function getDateRange($startDate, $endDate, $format = "Y-m-d", $last=true, $first=true) { $begin = new DateTime($startDate); $end = new DateTime($endDate); if($last){ $end->modify('+1 day'); } $interval = new DateInterval('P1D'); // 1 Day $exclude = 0; if(!$first){ $exclude = DatePeriod::EXCLUDE_START_DATE; } $dateRange = new DatePeriod($begin, $interval, $end, $exclude); $range = []; foreach ($dateRange as $date) { $range[] = $date->format($format); } return $range; }