返回首页>> 技术分享

    比心云 vpn加速软件

    最近遇到一些国外项目,需要翻墙,对比了多家翻墙软件,个人还是倾向于比心云,有需要的 可以通过链接下载安装。https://www.bixiny.ink/#/register?code=98arqoRP [详情]
    技术分享 2025-04-14 14:18:37 0 142

    YOU信云权益虚拟卡卷数字终端项目介绍

    不知不觉,网站已经经历了4个年头了,也希望自己的技术经验分享可以帮助到大家,后面也会时时更新文章。为了感谢各位的支持,给你们谋取了各种平台的会员福利,比官网价格要优惠许多,买不买无所谓,货比三家总没错,万一是最优惠的呢。如何成为学员代理加入我们呢,如何加盟?普通会员、年度会员、正式会员、高级会员  4月30号之前,7折优惠虚拟商品一经开通,不支持退款:权益不得以个人想象为准,请三思.赚钱有风险,投资需谨慎我们会给您提供什么?正规官方对接的直充拿货渠道,我们不做退款车、接短信验证码、灰产,共享号、慢充,撸羊毛,做活动等不正规渠道,只做官方正规的直充商品。影视视频会员|美食餐饮|办公会员|音乐会员|游戏会员|VIP项目|漫画阅读等多项虚拟消费项目闲鱼店铺运营指导,在闲鱼卖卡券的官方路线怎么走?我们很有经验。我们有长期经营的社群环境,让你面对问题时不再孤单。不像外面的网站不给你提供帮扶指导,或者只给你丢个教程就完了,我们会提供阶段培养,帮助你定计划,定指标,真正的希望你能通过这个副业赚到钱。拿货价格有没有优势,我们很清楚。与其他行业相比,虚拟权益业务具有较低的风险。你无需大量投入资金或承担巨大的经营风险,却能享受到稳定的现金流和高回报。这为你提供了一个低风险高收益的创业机会。做这件事情的心态如果你想开始做就立马日入几百上千,着急发财,那你也可以不用做了。闲鱼卖卡券是一分耕耘一分收获。资本助力,起飞更快。踏踏实实,没有那么多物流麻烦事,充上就让买家收货结钱,下一位。支持自动发货,面对爆单,解放双手无需物流发货、无需囤货、无库存压力、部分虚拟产品成本低,无风险,更不需要你去拍照等一些繁琐工作,你只需要一台设备(手机或平板,电脑)都可以开始干,自动发货,就可以实现无限发货,无需人工操作,长期稳定副业项目。适用人群合适所有人群宝妈、学生党、上班族等,我们传授0-1的电商全自动发货教程,以及全套私域引流教程,有空闲时间想做兼职挣零花的群体,投资小,收益快,无风险,而且平时自己用也很省钱,设备一部手机或电脑简单方便。盈利模式直接加入我们学员代理,低成本拿货,然后直接在各大平台出售,赚差价,就是低卖高卖,当然自己用也很优惠很省钱,招募代理,当你做了一段时间之后,私域有了一定的用户基础,自然而然就会有人会找你,问你收不收代理,这个项目怎么做。问:那我们该怎么做?去各大平台如闲鱼上架,你的销售价(自己自定义)-采购价格 =你的利润 配合自动发货教程实现全自动交易。在我们提供的经验基础上,自由发挥,随机应变。市场不是死的,做生意需要动脑。问:闲鱼做自动发货需要多少成本?首先开通鱼小铺 0元闲鱼店铺保证金500元(后台手动下单发货可忽略/卡密优惠券发货可忽略)保证金可退自动发货工具费用 138+?/年(后台手动下单发货可忽略)这个?是一单的接口费用,1分钱。加入放心充(原放心充)0元    直充有自动发货,回款周期最长是3天。直充没有自动发货,回款周期最长是10天。使用对接其他电商平台可另咨询问:什么是自动发货权限呢?答:自动发货就是商品自动充值、直充商品一分钟到账,仅需要客户提供账号即可,无需jie码。速度快,通常1分钟内到账,售后少。正价商品,有保障。不需要人工操作,实现了释放双手,客户下单之后,系统会自动发货充值给买家。问:你们只发一份课给我吗?后续还管吗? 答:我们会拉我们的技术对接小群,后续的任何相关问题直接发在发群聊技术和我们这边客服都在里面,都会在第一时间解决你这边遇到的问题。并且咱们这边后续的一切新课程玩法也时时更新!问:我付费我就可以躺赚了吗? 答:有这样想法的可以直接划走了,做了这么多年的经商我送一句话给你们:没有不赚钱的项目,只有不赚钱的人,执行力等于一切,脑袋里面想法再多不一个个落地,一切等于虚无。我们会教你可行落地方式方法只要你不笨有相对于的执行力大概率都会拿到想要的结果。请仔细查看我们给你发的文档最后,我们有那些商品?我大概列举一下问:网站拿货价格比闲鱼贵?我们不做任何接短信码/共享号/来路不明的慢充,因为那会让网站不稳定。只做官方接口,直充有售后保障。在可控的风险内赚钱,长久副业才是王道。我们的价格在同类货源内十分有优势。如果你看不懂价格,说明你被价格迷惑了。如果你觉得卖会员赚的少,那你也可以选择我们更高等级的服务付费.我为什么要跟你做?你的优势在哪?确实,你不一定要跟我做,市面上有各种各样的网站。但是他们有这么这么靠谱稳定的货源吗?会不会做几个月就跑路了?他们知道怎么引流吗?他们稳定吗?我们可以直接把成熟的教程,经验,交流群通通传授与你。你把节省的时间,可以去找流量,去做成交,后面给你带来的客户,很快回本了。找一个稳定、靠谱、有结果的人带你,这是入行最快的方式!能看到这,说明你对这个项目是感兴趣的,多的也不说了,如果你有执行力,每天能挤出半小时至一小时左右的时间,闭眼加入就行。 [详情]
    技术分享 2025-02-14 23:02:26 6 274

    图片压缩

    如今的手机越来越智能,拍摄的图片越来越高清,也就意味着图片很多,如果不进行压缩处理,上传过程会漫长,同时在预览图片的时候资源加载也很慢,更消耗服务器的带宽资源。下面讲解一个图片压缩的方法,本案例使用的是三方插件js lrz.bundle.js,可自行下载到自己项目中。本案例结合了layui,实现的是多图上传(单图上传,更简单,自行实现,不在啰嗦),具体代码如下:1、html部分<form class="layui-form layui-form-pane">     <div class="layui-form-item">         <label class="layui-form-label">上传图片:</label>         <div class="layui-input-block">             <button type="button" class="layui-btn" id="test2">                 多图上传             </button>         </div>     </div>     <div class="layui-form-item">         <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">             预览图片             <div class="layui-upload-list" id="demo2">             </div>         </blockquote>         <div class="input_images">             <!--input type="hidden" name="image[]" value="">-->         </div>     </div>     <!-- 提交按钮  -->     <div class="layui-form-item layui-btn_box">         <button class="layui-btn layui-btn-fluid layui-btn-normal" id="submit">确认提交</button>     </div> </form>2、script部分,注意替换自己的lrz.bundle.js路径<script src="/static/lib/js/lrz.bundle.js"></script> <script type="text/javascript">     layui.use(['layer','form','upload'], function () {         var layer = layui.layer;         var $ = layui.jquery;         var upload = layui.upload;         var form = layui.form;         var number = 5; // 最多上传个数         form.render();         //多图上传         upload.render({             elem: '#test2'             ,url: '/admin/empty_fun'             ,multiple: true             ,accept: 'images' // 只允许上传图片             ,number: number // 最多上传个数             ,choose: function (obj) {                 // 统计文件的个数 是否超过最大值                 var length = $('#demo2 .img_box').length + 1;                 if (length > number) {                     layer.msg('最多上传'+number+'张图片');                     return false;                 }                 // 预览图片                 obj.preview(function(index, file, result){                     var html = '<span class="img_box" id="'+index+'">' +                         '<img src="' + result + '" alt="'+ file.name +'" class="layui-upload-img">' +                         '<p class="up_tips up_suc">上传中</p>' +                         '<img src="/uploads/image/close.png" alt="" class="close-img">' +                         '</span>';                     $('#demo2').append(html);                     // 执行上传                     lrz(file, {                         quality: 0.8 //设置压缩率,可以自行调整 0-1之间                     }).then(function (rst) {                         $.ajax({                             url: '/admin/base64_file',                             type: 'post',                             data: {type: 'image', event: 'image', base64_str: rst.base64},                             success: function (ret) {                                 if (ret.code == 1) {                                     $('#' + index).find('.up_tips').html('上传成功');                                     $('.input_images').append('<input data-index="'+ index +'" type="hidden" name="image[]" value="' + ret.data.image + '">');                                 } else {                                     $('#' + index).find('.up_tips').html('上传失败');                                     $('.input_images').append('<input data-index="'+ index +'" type="hidden" name="image[]" value="">');                                 }                             },                             error: function (err) {                                 $('#' + index).find('.up_tips').html('上传失败');                                 $('.input_images').append('<input data-index="'+ index +'" type="hidden" name="image[]" value="">');                                 console.log(JSON.stringify((err)));                             }                         });                     });                 });             }             ,error: function(err){                 //请求fail回调             }         });         // 点击删除图片         $('#demo2').on('click','.img_box .close-img',function () {             var index = $(this).closest('.img_box').attr('id');             // 删除dom元素             $(this).closest('.img_box').remove();             // 删除对应的input             $('.input_images input').each(function (k,v) {                 var index1 = $(this).data('index');                 if (index1 == index) {                     $(this).remove();                 }             })         });     }); </script>3、js中使用到两个接口,如下:/**  * 空方法(用于base64文件上传使用)  */ public function empty_fun() {     $this->result('',1,'操作成功','json'); } /**  * @title base64上传文件  *  * @param $base64_str  string base64文件数据  * @param $type string 类型:image=图片,video=视频,audio=音频  * @param $event string 事件:avatar=头像,refund=售后,image=图片  *  */ public function base64_file() {     if(request()->isPost()){         $type = $this->request->param('type','image');         $event = $this->request->param('event','image');         $base64_str = $this->request->param('base64_str','');         if ($base64_str) {             $base64_str = explode(',', $base64_str);             $file = base64_decode($base64_str[1]);             if (!$file) {                 $this->result('',0,'请上传图片','json');             }         } else {             $this->result('',0,'请上传图片','json');         }         $savePath = './uploads/' . $type . '/' . $event . '/' . date("Ym") . "/". date("Ymd") . "/";         if (!is_dir($savePath)) {             mkdir($savePath, 0777, true);         }         $savePath = $savePath . uniqid() . '.png';         $filePath = str_replace('./','/',$savePath);         $res = file_put_contents($savePath, $file);         if($res){             $this->result(['image'=>$filePath, 'imageText'=>path_deal_with($filePath)],1,'上传成功','json');         }else{             $this->result('',0,'上传失败','json');         }     }else{         $this->result('',0,'请求错误','json');     } } [详情]
    技术分享 2024-09-01 15:42:06 0 1045

    JavaScript上传文件,获取大小、时长、类型、后缀、封面图等

    最近在开发项目中,遇到需要获取视频时长的需求,合作的前端一直说获取不到,无奈作为后端只能自己动手。其实很简单,文件在选中之后,文件流中都已经包含了所有的信息,我们直接从文件流中直接获取即可。JavaScript上传文件,如果是上传的图片,可以获取到文件的类型、后缀、大小、宽高;如果是上传的视频,可以获取到文件的类型、后缀、大小、宽高、时长、视频的封面图(如果是上传的三方存储,路径为:上传成功之后的路径+对应三方截取视频第一帧代码;当然,也可以单独上传;);如果是上传的音频,可以获取到文件的类型、后缀、大小、时长等。前端在获取到这些信息之后,直接通过接口回传给后端即可,废话不多说,直接上代码。html代码如下:<!--    触发上传的元素    --> <div id="picker_{$form.name}" class="input_file_box">     <input type="file" class="input_file" title="请上传文件" onchange="uploadFile(this)"> </div>JavaScript代码如下:<script type="text/javascript">// 上传文件 function uploadFile(e) {     let file = e.files[0]; // 文件流     let fileName = file.name; // 文件名称     let fileSize = file.size; // 文件大小 单位 B     let fileType = file.type; // 文件类型     let duration = 0; // 时长 单位 S     let ext = ''; // 文件后缀     let element = document.createElement('video');     // 判断上传的视频是否超过 1.5G     if (fileSize > 1.5 * 1024 * 1024 * 1024 ) {         layer.msg("文件大小不得超过1.5G");         return false;     }     // 获取文件后缀     ext = fileName.split('.').pop();     // 获取本地文件路径     element.src = URL.createObjectURL(file);     //下面需要注意的是在监听loadedmetadata绑定的事件中对duration直接进行赋值是无效的,需要在fun回调函数中进行赋值     element.addEventListener('loadedmetadata', function () {         //音频/视频的元数据已加载时,会发生 loadedmetadata 事件         duration = element.duration //时长以秒作为单位         videoWidth = element.videoWidth; // 宽度 videoHeight = element.videoHeight; // 高度     });} </script> [详情]
    技术分享 2024-06-03 09:36:31 0 980

    Windows系统下生成IOS证书

    官方文档提供了使用苹果系统下生成IOS证书的步骤,对于我这个没有imac的小白来说,使用Windows生成证书就成了我唯一要攻破的难关。在我尝试了很多次方法的情况下,终于功夫不负有心人,下面我就给大家分享一下生成经验,话不多说,上干货:1.先下载一个Openssl,安装在本地,目的是用来生成必要的文件  Openssl下载地址:http://slproweb.com/products/Win32OpenSSL.html  注:下载Win32 OpenSSL v1.0.2c Light版本(注意:版本可能会升级),如果您运行OpenSSL有问题,还需要下载Visual C++ 2008 Redistributables安装。2.申请一个属于自己的苹果开发者帐号,以个人开发者帐号为例(申请步骤这里不再赘述)3.进入Windows的命令行(WIN+R,进入运行),进入Openssl的安装目录(我这里为:D:\Program Files\OpenSSL-Win32\bin),大家可根据自己的实际安装目录进行更改。4.生成certSigningRequest文件(证书注册请求文件)cd E:\OpenSSL-Win64\bin\set RANDFILE=.rnd set OPENSSL_CONF=E:\OpenSSL-Win64\bin\openssl.cfgopenssl genrsa -out my.key 2048openssl req -new -key my.key -out my.certSigningRequest -subj "/emailAddress=myemail@sample.com,CN=Common Name,C=CN"生成后如图5.进入苹果开发者中心---->证书中心6.添加产品证书个人帐号请选择下载后文件为:xxx.cer (证书文件)7.将cer文件证书转换为 P12 文件,下载证书到OpenSSL安装目录下,运行下面命令苹果证书就完成了。//生成pem文件openssl x509 -in xxxx.cer -inform DER -out xxxx.pem -outform PEM//生成p12证书,并设置证书密码openssl pkcs12 -export -inkey xxx.key -in xxxx.pem -out xxxx.p12 -password pass:123456 [详情]
    技术分享 2024-02-21 12:59:43 1 1269

    ios position = fixed 滑动防抖

    页面布局  如下:<header></header><div></div><footer></footer>样式如下:header {        position: fixed;        top: 0;}div {        position: absolute;        width: 100%;        left: 0;        right: 0;        top: 0;        bottom: 0;        overflow-y: scroll;        -webkit-overflow-scrolling: touch;        /* 解决ios滑动不流畅问题 */}.footer {        position: fixed;        bottom: 0;} [详情]
    技术分享 2023-10-18 18:01:06 1 1262

    nginx虚拟目录alias和root两种配置方式的区别

    Nginx虚拟目录的配置方式可以分为alias和root两种,这里简单总结下区别。root配置方式1.Nginx中root指令的地址,其实是替换了匹配后的url中的host(因此path目录必须要真实存在与root指定的目录中)。2.root指令最后的斜杠可加可不加。多个斜杠在Nginx中相当于一个【~】。3.如果不匹配location,则寻找更外层的root做替换(外层没有location会使用Nginx默认的一个location)。alias配置方式1.alias并不是替换host,而是替换匹配部分的host,别名一个路径(也就是说,path目录不需要真实存在alias指定的目录中)。2.alias指令后面必须加斜杠,否则会报500错误,因为匹配的路径错误。比如需要访问ip/yanggb/test.html则需要配置alias /yanggb/,要是配置成alias /yanggb,则这时候访问的路径会被识别成/yanggbtest.html而不是/yanggb/test.html,这样因为匹配不到路由就会导致Nginx返回500错误信息。最佳实践通常最佳实践是配置一个项目的根root,其他的文件夹则使用alias。server {    listen 80;    server_name www.yanggb.com;    index index.html index.php index.htm;    access_log /usr/local/Nginx/logs/image.log;     LOCATIOn / {        root /var/yanggb;    }     LOCATIOn /yanggb1 {        # 匹配的path目录yanggb1不需要真实存在alias指定的目录中        alias /var/yanggb1/; # 后面的"/"符号一定要带上    }     LOCATIOn /yanggb22 {        # 匹配的path目录yanggb22一定要真实存在root指定的目录中(即/var/yanggb2下一定要有yanggb22目录存在,yanggb22一定是一个真实存在的目录名)        root /var/yanggb2;    } }简单总结就是:alias指定的目录是精确的,即location匹配访问的path目录下的文件直接是在此alias目录下查找的;而root指定的目录则是location匹配访问的path目录的上一级目录,且这个path目录一定要是真实存在root指定目录下的。扩展-正则配置-语法规则(按优先级)【=】表示精确匹配,优先级最高。【^~】表示uri以某个常规字符串开头,用于匹配url路径(而且不对url做编码处理,例如请求/static/20%/aa,可以被规则^~ /static/ /aa 匹配到(注意是空格))。【~】表示区分大小写的正则匹配。【~*】表示不区分大小写的正则匹配。【!~】表示区分大小写不匹配的正则。【!~*】表示不区分大小写不匹配的正则。【/】表示通用匹配,任何请求都会匹配到。 [详情]
    技术分享 2023-10-18 17:43:01 1 2096

    直播以及腾讯IM申请流程

    1、登录腾讯账号,网址如下:https://cloud.tencent.com/2、登录成功以后,点击控制台,在云产品中搜索“云直播”,如下图:  3、点击 云直播 ,进入到管理页面, 点击域名管理,添加播放域名、推流域名,播放域名、推流域名要保存好,项目需要用到,如下图:(注意:播放域名,一定要将域名指向该 CNAME 地址,才能通过自有域名到腾讯云直播拉流)    4、点击播放域名的 编辑 ,根据实际需要的协议,选择相应的播放解析地址,如下图: 5、点击推流域名 编辑,根据实际需要的协议,选择相应的推流解析地址,并将鉴权key 保存好,后台配置需要。  6、配置推流模板,如下图:   7、给推流模板绑定推流域名:如下图,  8、配置回放模板,如下图:  9、给回放模板绑定域名,如下图:  10、配置secretId、secretKey ,如下图:  11、登录成功以后,点击控制台,在云产品中搜索“即时通信IM”,如下图:然后点击 即时通信IM     将 SDKAPPid、key 保存好,后台配置需要: 12、生产的一个体验版的应用(体验版最多可以注册100个用户,如果需要更多,请点击查看可升级项),如下图: 13、生成签名:如下图: 复制生成的签名  将签名配置在后台;   [详情]
    技术分享 2023-08-19 18:32:01 2 1515

    Paypal对接文档

    Paypal对接文档1、申请paypal开发者账号,流程省略。2、用上述申请的账号、密码,登录paypal 开放平台,地址如下:https://developer.paypal.com/登录成功之后默认就是沙箱环境,如下图: 点击 “Apps & Credentials”按钮,如下图就可以看到 沙箱环境的 clientID,Secret;复制之后,放到后台的插件中即可。如果没有看到这个,可以自行点击“Create App”按钮,创建一个沙箱环境的APP,然后就能看到沙箱环境的 clientID,Secret; 3、点击创建的沙箱环境的APP名称,进入到详情,查看沙箱测试账号以及密码(备注:测试账号和密码 一个是卖家,一个是买家,测试支付的时候用买家账号),如下图:     4、点击下图中的按钮,切换为正式环境,并创建正式的APP,查看相应的clientID,Secret,如下图:  5、支付币种 可以填写,USD6、获取支付链接接口,如下(仅供参考):/**     * @title 获取订单预支付信息     *     * @url /pay/order_pay     * @method POST     *     * @param string order_sn 订单号     * @param string pay_type 支付类型(alipay=支付宝支付,wxpay=微信支付,coin=余额支付,ios=苹果支付,paypal=PayPal支付)     * @param string pay_password 支付密码(备注:pay_type=coin必填)     * @param string out_trade_no 支付交易号(备注:pay_type=ios必填)     *     */    public function order_pay($param = [], $user = [])    {        $user_id = $user['id'];        $userinfo = \app\automatic\model\m3180\User::get($user_id);        if(!$userinfo){            $this->result('',0,'用户不存在','json');        }        $order_sn = $param['order_sn'];        $order_type = substr($order_sn,0,2);        $pay_type = $param['pay_type'] ?: 'paypal';        $pay_password = $param['pay_password'] ?: '';        $out_trade_no = $param['out_trade_no'] ?: '';         if (!$order_sn) {            return ApiReturn::r(0,'','订单号参数错误');        }        if (!in_array($order_type, ['UR'])) {            return ApiReturn::r(0,'','订单类型错误');        }        if (!in_array($pay_type, ['alipay','wxpay','coin','ios','paypal'])) {            return ApiReturn::r(0,'','请选择正确支付类型');        }        if ($pay_type == 'coin') {            if (!$pay_password) {                return ApiReturn::r(0,'','请输入支付密码');            }        }         $money = 0.00;        switch ($order_type) {            case 'UR':                $subject = '充值金币';                // 充值                $is_order = Db::name('user_recharge')->where(['order_sn' => $order_sn, 'user_id' => $user_id])->find();                if (!$is_order || $is_order['pay_time'] > 0) {                    return ApiReturn::r(0,'','该订单已经支付过,请勿重复支付');                }                $money = $is_order['money'];                break;        }         switch ($pay_type) {            case 'alipay':                $data = array(                    'subject' => $subject,                    'body' => $subject,                    'out_trade_no' => $order_sn,                    'total_amount' => $money,                    'notify_url' => member_config_com('web_site_domain') . '/index/pay/ali_notify'                );                $arr = addons_action('Alipay', 'Aop', 'AlipayTradeAppPayRequest', [$data]);                return ApiReturn::r(1,$arr,'获取预支付信息成功');                break;            case 'wxpay':                $data_pay = array(                    'body' => $subject,                    'total_fee' => $money,                    'out_trade_no' => $order_sn,                    'notify_url' => member_config_com('web_site_domain') . '/index/pay/wx_notify'                );                $arr = addons_action('WeChat', 'AppPay', 'pay', [$data_pay]);                return ApiReturn::r(1,$arr,'获取预支付信息成功');                break;            case 'paypal':                $data_pay = array(                    'product' => $subject,                    'price' => $money,                    'shipping' => 0,                    'order_sn' => $order_sn,                    'description' => $subject,                    'notify_url' => member_config_com('web_site_domain') . '/index/pay/paypal_notify'                );                 $arr = addons_action('Paypal', 'Paypal', 'pay', $data_pay);                $config = addons_config('Paypal');                // 获取到路径之后 获取路劲中的 token 保存到数据库                $dsn = @parse_url($arr);                parse_str($dsn['query'],$query_param);                if (isset($query_param['token']) && $query_param['token']) {                    Db::name('user_recharge')                        ->where(['order_sn' => $order_sn, 'user_id' => $user_id])                        ->update(['token' => $query_param['token'], 'update_time' => time()]);                }                 return ApiReturn::r(1,[                    'url' => $arr,                    'clientId' => $config['environment'] ? $config['clientId'] : $config['clientIdTest'],                    'orderId' => $order_sn,                    'currency' => $config['country'],                    'environment' => $config['environment'] ? 'live' : 'sandbox',                ],'获取预支付信息成功');                break;            case 'coin':                if (!in_array($order_type,['UV'])) {                    return ApiReturn::r(0,'','支付订单类型错误');                    break;                }                // 判断支付密码是否正确                if (!Hash::check((string)$pay_password, $userinfo->pay_password)) {                    return ApiReturn::r(0, '', '支付密码错误');                    break;                }                // 判断余额是否充足                if($userinfo->user_money < $money){                    return ApiReturn::r(-1, '', '可用余额不足');                    break;                }                 Db::startTrans();                try{                    // 修改订单信息                    if ($order_type == 'UV') {                        \app\automatic\model\m3642\Uservip::orderNotify($order_sn, date('YmdHis').rand(100000,999999),$pay_type);                    }                    // 更改用户余额                    $notes = '用户【'.$userinfo->user_nickname.'】ID为:【'.$user_id.'】于'.date('Y-m-d H:i:s').'进行了余额支付,订单号为:'.$order_sn;                    \app\automatic\model\m3642\User::changeUserMoney($user_id,0-$money,6,$notes,$order_sn,'');                     Db::commit();                } catch (\Exception $e) {                    Db::rollback();                    return ApiReturn::r(0, '', '支付失败');                }                return ApiReturn::r(1, '', '支付成功');                break;            case 'ios':                if (!in_array($order_type,['UV'])) {                    return ApiReturn::r(0,'','支付订单类型错误');                    break;                }                 Db::startTrans();                try{                    // 修改订单信息                    if ($order_type == 'UV') {                        \app\automatic\model\m3642\Uservip::orderNotify($order_sn, $out_trade_no ?: date('YmdHis').rand(100000,999999),$pay_type);                    }                     Db::commit();                } catch (\Exception $e) {                    Db::rollback();                    return ApiReturn::r(0, '', '支付失败');                }                return ApiReturn::r(1, '', '支付成功');                break;        }    } [详情]
    技术分享 2023-08-19 18:29:03 1 2494

    php在linux上将word转pdf

    服务器安装libreofficeyum install libreoffice yum install libreoffice-headless yum -y install  libreoffice-langpack-zh-Han*安装完成libreoffice后,测试是否安装成功# 执行命令的目录下,生成了一个与word同名的pdf文件,即说明libreioffice安装成功了soffice --headless --invisible --convert-to pdf 1.docxphp使用shell_exec函数执行命令$str = "文件路径";$name = "文件名称,带文件后缀"$cmd = "cd {$str} && soffice --headless --invisible --convert-to pdf {$name}";shell_exec($cmd);php不能执行shell_exec命令解决办法如果方法禁用了,修改php.ini文件disable_functions配置    如果文档中使用了其他自定义的字体,操作步骤如下:    安装字体 (若转换的文件出现) 创建字体目录,将自己的字体文件上传至该文件夹下    mkdir -p /usr/share/fonts/win    执行以下命令,使字体生效mkfontscale mkfontdirsudo fc-cache -fv    【报错】    若执行 mkfontscale 出现报错 mkfontscale not found    则执行下列命令# 安装mkfontscaleyum install mkfontscale # 安装fontconfig yum install fontconfig [详情]
    技术分享 2023-01-07 23:09:58 1 1550

Copyright © 2021
www.yunyakeji.cn All rights reserved. 小明博客 豫ICP备2020029140号-1