ios内购支付-支付宝APP支付提现

news2024/12/23 14:57:07

文章目录

  • 前言
  • 一、IOS内购支付(ios订单生成自己写逻辑即可)
    • 1.支付回调票据校验controller
    • 1.支付回调票据校验server
  • 二、安卓APP支付宝支付
    • 1.生成订单返回支付宝字符串(用于app拉起支付宝,这里用的是证书模式)
    • 2.生成订单返回支付宝字符串server方法
    • 3.支付宝回调处理
  • 三、支付宝APP提现(没有授权,直接填用户账户信息)
    • 1.支付宝APP提现controller方法
    • 2.支付宝APP提现server方法


前言

这里用的是thinkphp5,但是支付这个其他框架或版本也可以参考,只需要改下写法即可

一、IOS内购支付(ios订单生成自己写逻辑即可)

在苹果内购支付中第一步先生成一个内部订单,然后把订单信息给到IOS客户端,内购支付只要是回调校验票据出路,这个票据会返给IOS客户端,让客户端把票据及订单信息一起传过来,注意订单号唯一即可

1.支付回调票据校验controller

public function payResult()
{
     //苹果内购的验证收据 orders模型换成自己的订单模型,字段换成自己的订单字段即可
     $receipt_data = $this->request->post('receipt-data');//票据
     $orderSn = $this->request->post('order_sn');//订单号
     // 验证支付状态
     $result = (new IosCheckServer())->payMoneyCheck($receipt_data, $orderSn);
     if($result['status']){
         $this->success('支付成功');
     }else{
         $this->error($result['message']);
     }
 }

1.支付回调票据校验server

/**
     * @param $receipt_data
     * @param $orderSn
     * @return array
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     * @throws \think\exception\PDOException
     * ios充值消费燃币支付回调票据校验
     */
    public function payMoneyCheck($receipt_data, $orderSn)
    {
        //苹果内购的验证收据 orders模型换成自己的订单模型,字段换成自己的订单字段即可
        $orderinfo = Orders::where(['order_sn' => $orderSn])->find();
        if($orderinfo){
            if($orderinfo['pay_status'] == Orders::PAY_STATUS_PAID){
                return ['status' => false,'message' => '订单已成功支付,请勿重复发起申请'];
            }
        }else{
            return ['status' => false,'message'=>'订单异常'];
        }
        // 验证支付状态
        $result = $this->validate_apple_pay($receipt_data);
        if($result['status']){
            /*业务逻辑*/
            Db::startTrans();
            try {
                $orderinfo->pay_status = Orders::PAY_STATUS_PAID;
                $orderinfo->paid_at = time();
                $orderinfo->save();
                /*处理自己内部业务逻辑*/
                /*处理自己内部业务逻辑*/
                /*处理自己内部业务逻辑*/
                Db::commit();
            } catch (\Exception $e) {
                Db::rollback();
                return ['status' => false,'message' => '支付失败,请联系管理员'];
            }
            return ['status' => true,'message' => '支付成功'];
        }else{
            return ['status' => false,'message' => $result['message']];
        }
    }
	/**
     * @param $receipt_data
     * @param $orderinfo
     * @return array
     * @throws \think\exception\PDOException
     * 校验票据
     */
    public function validate_apple_pay($receipt_data)
    {
        // 验证参数
        if (strlen($receipt_data) < 20){
            return ['status' => false, 'message' => '非法参数'];
        }
        // 请求验证
        $html = $this->acurl($receipt_data);
        $data = json_decode($html,true);
        // 如果是沙盒数据 则验证沙盒模式
        if($data['status'] == '21007'){
            // 请求验证
            $html = $this->acurl($receipt_data, 1);
            $data = json_decode($html,true);
            $data['sandbox'] = '1';
        }

        //找出时间最大的数组
        $receiptitem = $data['receipt']['in_app'];
        //这个是排序的方法  下面回帖出来 苹果会把这个会员往期的订单信息全部返回,需要找出来最近的那一组信息
        $item = $this->arraySort($receiptitem,'purchase_date','desc');
        //判断一下过期时间 延长会员时间
        $orderThird = $item['transaction_id'];                //本次订阅的订单号
        $orderThirdFirst = $item['original_transaction_id'];  //这个是原始订单号
        if($orderThird == $orderThirdFirst){                  //首次订阅 两个相等
            return ['status' => true,'message' => '支付成功'];
        }else{
            //判断过期时间和当前时间比较   expires_date_ms是毫秒单位
            if($item['expires_date_ms']/1000 > time()){
                return ['status' => true,'message' => '支付成功'];
            }else{
                //过期处理  票据失效
                return ['code' => false,'message' => '票据失效,请联系管理员'];
            }
        }
    }

	/**
     * @param $receipt_data
     * @param int $sandbox
     * @return bool|string
     * 数据校验
     */
    public function acurl($receipt_data, $sandbox = 0)
    {
        /**
         * 21000 App Store不能读取你提供的JSON对象
         * 21002 receipt-data域的数据有问题
         * 21003 receipt无法通过验证
         * 21004 提供的shared secret不匹配你账号中的shared secret
         * 21005 receipt服务器当前不可用
         * 21006 receipt合法,但是订阅已过期。服务器接收到这个状态码时,receipt数据仍然会解码并一起发送
         * 21007 receipt是Sandbox receipt,但却发送至生产系统的验证服务
         * 21008 receipt是生产receipt,但却发送至Sandbox环境的验证服务
         */
        //小票信息
        $POSTFIELDS = array("receipt-data" => $receipt_data);
        $POSTFIELDS = json_encode($POSTFIELDS);

        $url_buy     = "https://buy.itunes.apple.com/verifyReceipt";//正式购买地址
        $url_sandbox = "https://sandbox.itunes.apple.com/verifyReceipt";//沙盒购买地址
        $url = $sandbox ? $url_sandbox : $url_buy;

        //curl - post
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $POSTFIELDS);
        $result = curl_exec($ch);
        curl_close($ch);
        return $result;
    }

    /**
     * @param $arr
     * @param $key
     * @param string $type
     * @return mixed
     * 查找最新数据
     */
    public static function arraySort($arr,$key,$type='asc')
    {
        $keyArr = []; // 初始化存放数组将要排序的字段值
        foreach ($arr as $k => $v) {
            $keyArr[$k] = $v[$key]; // 循环获取到将要排序的字段值
        }
        if ($type == 'asc') {
            asort($keyArr); // 排序方式,将一维数组进行相应排序
        } else {
            arsort($keyArr);
        }
        foreach ($keyArr as $k => $v) {
            $newArray[$k] = $arr[$k]; // 循环将配置的值放入响应的下标下
        }
        $newArray = array_merge($newArray); // 重置下标
        return $newArray[0]; // 数据返回
    }

二、安卓APP支付宝支付

前期准备工作:

  1. 获取 App ID 和 商户私钥
  2. 申请并下载支付宝公钥证书和应用证书
  3. 如果站点有ssl更好,没有的话可以下载一个cacert.pem证书放到配置文件对应的地址里面,https://curl.se/docs/caextract.html
  4. 完成之后修改一下php.ini的配置curl.cainfo = /etc/pki/tls/certs/cacert.pem
    这里的地址时我按照原配置文件直接用的,放其他地方的话只要保证配置文件里面一致即可,支付宝的证书我是直接放项目里面的,引用的时候保证路径没问题即可

1.生成订单返回支付宝字符串(用于app拉起支付宝,这里用的是证书模式)

controller方法(订单逻辑部分可以自己处理)

	/**
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     * 会员订单创建 - android
     */
    public function memberOrderByAndroid()
    {
        /**
         * 生成订单数据
         */
        $result = [];
        Db::startTrans();
        try {
            $model = new Orders($arr);
            $res = $model->save($arr);
            if ($res === false){
                Db::rollback();
                $this->error('订单创建失败');
            }
            $server = new AlipayServer();
            //订单号,金额,回调地址
            $res = $server->payMemberOrder($model->order_sn, number_format($model->amount, 2), '****/api/v1/member/notify');
            if ($res['code']){
                $result['orderStr'] = $res['data'];
            }
            Db::commit();
        }catch (\Exception $exception){
            Db::rollback();
            $this->error('订单创建失败');
        }
        $this->success('操作成功', $result);
    }

2.生成订单返回支付宝字符串server方法

	/**
     * @param $out_trade_no 订单号
     * @param $total_amount 金额
     * @param $notify_url 回调地址
     * @return array
     * 燃币充值 - 安卓 - 支付宝
     */
    public function payMemberOrder($out_trade_no, $total_amount, $notify_url)
    {
        require_once __PUBLIC__ . '/../vendor/alipaysdk/openapi/v2/aop/AopCertClient.php';
        require_once __PUBLIC__ . '/../vendor/alipaysdk/openapi/v2/aop/request/AlipayTradeAppPayRequest.php';

        /** 初始化 **/
        $aop = new \AopCertClient;
        /** 支付宝网关 **/
        $aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
        /** 应用id,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/190/201602493024 **/
        $aop->appId = config('alipay.app_id');
        /** 密钥格式为pkcs1,如何获取私钥请参考:https://opensupport.alipay.com/support/helpcenter/207/201602469554  **/
        $aop->rsaPrivateKey = trim(config('alipay.private_key'));
        /** 应用公钥证书路径,下载后保存位置的绝对路径  **/
        $appCertPath = __PUBLIC__ . '/cert/appCertPublicKey_2021004170664201.crt';
        /** 支付宝公钥证书路径,下载后保存位置的绝对路径 **/
        $alipayCertPath = __PUBLIC__ . '/cert/alipayCertPublicKey_RSA2.crt';
        /** 支付宝根证书路径,下载后保存位置的绝对路径 **/
        $rootCertPath = __PUBLIC__ . '/cert/alipayRootCert.crt';
        /** 设置签名类型 **/
        $aop->signType= "RSA2";
        /** 设置请求格式,固定值json **/
        $aop->format = "json";
        /** 设置编码格式 **/
        $aop->charset= "utf-8";
        /** 调用getPublicKey从支付宝公钥证书中提取公钥 **/
        $aop->alipayrsaPublicKey = $aop->getPublicKey($alipayCertPath);
        /** 是否校验自动下载的支付宝公钥证书,如果开启校验要保证支付宝根证书在有效期内 **/
        $aop->isCheckAlipayPublicCert = true;
        /** 调用getCertSN获取证书序列号 **/
        $aop->appCertSN = $aop->getCertSN($appCertPath);
        /** 调用getRootCertSN获取支付宝根证书序列号 **/
        $aop->alipayRootCertSN = $aop->getRootCertSN($rootCertPath);
        /** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay **/
        $request = new \AlipayTradeAppPayRequest();
        /** 设置业务参数 **/
        $request->setBizContent("{" .
            /**  商户订单号,商户自定义,需保证在商户端不重复,如:20200612000001 **/
            "\"out_trade_no\":\"{$out_trade_no}\"," .
            /** 销售产品码,固定值:QUICK_MSECURITY_PAY **/
            "\"product_code\":\"QUICK_MSECURITY_PAY\"," .
            /** 订单金额,精确到小数点后两位 **/
            "\"total_amount\":\"{$total_amount}\"," .
            /** 订单标题(可自定义) **/
            "\"subject\":\"会员充值\"," .
            /** 订单描述(可自定义) **/
            "\"body\":\"会员充值\"" .
            "}");
        /** 异步通知地址,以http或者https开头的,商户外网可以post访问的异步地址,用于接收支付宝返回的支付结果,如果未收到该通知可参考该文档进行确认:https://opensupport.alipay.com/support/helpcenter/193/201602475759 **/
        $request->setNotifyUrl($notify_url);
        try {
            /** 调用SDK生成支付链接,可在浏览器打开链接进入支付页面 **/
            $result = $aop->sdkExecute($request);
            $result = str_replace('&amp;', '&', htmlspecialchars($result));
            /** response.getBody()打印结果就是orderString,可以直接给客户端请求,无需再做处理。如果传值客户端失败,可根据返回错误信息到该文档寻找排查方案:https://opensupport.alipay.com/support/helpcenter/89 **/
            return ['code' => 1, 'data' => $result, 'msg' => ''];
        } catch (\Exception $e) {
            return ['code' => 0, 'data' => $e->getMessage(), 'msg' => ''];
        }
    }

返回APP客户端示例:
在这里插入图片描述

3.支付宝回调处理

	/**
     * @return string
     * 安卓充值支付回调
     */
    public function notify()
    {
        if(isset($_POST['out_trade_no']) && empty($order_sn)){
            $order_sn = $_POST['out_trade_no'];
        }
        Db::startTrans();
        try {
            $order = Orders::where('order_sn', $order_sn)->find();
            if(!$order){
                Db::rollback();
                return 'false';
            }
            $order->save(['pay_status' => Orders::PAY_STATUS_PAID]);
            //处理自己的业务逻辑
            Db::commit();
        }catch (\Exception $exception){
            Db::rollback();
            return 'false';
        }
        return 'success';
    }

三、支付宝APP提现(没有授权,直接填用户账户信息)

这里设计的是让用户输入支付宝账户和绑定的用户名,授权的话可以参考支付宝文档https://opendocs.alipay.com/common/02nk10?pathHash=a7475006

1.支付宝APP提现controller方法

	/**
     * 提现到支付宝
     */
    public function alipayToUser()
    {
        $redis = new \Redis();
        $redis->connect('127.0.0.1', 6379);
        $redis->auth('Hd20240306');
        $lockKey = 'box_lock_' . $this->user->id;
        $lockValue = uniqid(); // 生成唯一值,用于解锁验证
        $expireTime = 10; // 锁的超时时间,秒
        // 尝试获取锁
        $isLocked = $redis->setnx($lockKey, $lockValue);
        if ($isLocked) {
            $redis->expire($lockKey, $expireTime); // 设置锁的过期时间,以避免死锁
            Db::startTrans();
            try {
                $out_biz_no = $this->request->post('out_biz_no');//商户端的唯一订单号
                $payee_type = $this->request->post('payee_type');//收款方账户类型(支付宝账户)
                $payee_account = $this->request->post('payee_account');//收款方支付宝账号
                $name = $this->request->post('name');//收款方支付宝账号
                if (!$name || $name == ''){
                    throw new Exception('请输入支付宝绑定的真实用户名');
                }
                $cash = (new Cash())->where('order_sn', $out_biz_no)->find();
                if (!$cash){
                    throw new Exception('订单有误');
                }
                $amount = number_format($cash->amount, 2);//转账金额
                //用户 -
                $num = number_format($amount * config('money.other'), 2);
                $memo = '提现'.$num.'燃币';
                $user_info = \app\common\model\User::where('id', $this->user->id)->find();
                if ($user_info->money < number_format($cash->amount * config('money.other'), 2)){
                    throw new Exception('余额不足');
                }
                //业务逻辑处理
                //提现
                (new AlipayServer())->payToUser($out_biz_no, $payee_account, $amount, $payee_type, $name);
                //订单状态变更
                $cash->payee_account = $payee_account;
                $cash->real_name = $name;
                $cash->pay_status = 2;
                $cash->save();
                Db::commit();
            }catch (\Exception $exception){
                Db::rollback();
                Log::info('alipayToUser-to' . $exception->getMessage());
                $this->error($exception->getMessage());
            }
            $this->success('提现成功');
        } else {
            $this->error('操作过于频繁,请稍后再试');
        }
    }

2.支付宝APP提现server方法

	/**
     * @param $outBizNo - 订单号
     * @param $payeeAccount - 账户
     * @param $amount - 金额
     * @param $payeeType - 账户类型
     * @param $name - 账户绑定的实名信息
     * @param string $remark - 备注
     */
    public function payToUser($outBizNo, $payeeAccount, $amount, $payeeType, $name, $remark = '提现')
    {
        require_once __PUBLIC__ . '/../vendor/alipaysdk/openapi/v3/src/Util/AlipayConfigUtil.php';
        require_once __PUBLIC__ . '/../vendor/alipaysdk/openapi/v3/src/Util/AlipayLogger.php';
        require_once __PUBLIC__ . '/../vendor/alipaysdk/openapi/v3/src/Api/AlipayFundTransUniApi.php';
        require_once __PUBLIC__ . '/../vendor/alipaysdk/openapi/v3/src/Model/AlipayFundTransUniTransferModel.php';
        require_once __PUBLIC__ . '/../vendor/alipaysdk/openapi/v3/src/Model/Participant.php';
        // 初始化SDK
        $alipayConfigUtil = new AlipayConfigUtil($this->getPayConfig());

        // 构造请求参数以调用接口
        $apiInstance = new AlipayFundTransUniApi(
            new Client()
        );
        // 设置AlipayConfigUtil
        $apiInstance->setAlipayConfigUtil($alipayConfigUtil);
        $data = new AlipayFundTransUniTransferModel();

        // 设置商家侧唯一订单号
        $data->setOutBizNo($outBizNo);//自己定义的转账外部单号

        // 设置订单总金额
        $data->setTransAmount($amount);

        // 设置描述特定的业务场景
        $data->setBizScene("DIRECT_TRANSFER");

        // 设置业务产品码
        $data->setProductCode("TRANS_ACCOUNT_NO_PWD");

        // 设置转账业务的标题
        $data->setOrderTitle($remark);

        // 设置收款方信息
        $payeeInfo = new Participant();
        $payeeInfo->setIdentity($payeeAccount);
        $payeeInfo->setIdentityType($payeeType);
        $payeeInfo->setName($name);
        $data->setPayeeInfo($payeeInfo);

        // 设置业务备注
        $data->setRemark($remark);

        // 设置转账业务请求的扩展参数
        $data->setBusinessParams("{\"payer_show_name_use_alias\":\"true\"}");

        try {
        	//屏蔽日志打印
            AlipayLogger::setNeedEnableLogger(false);
            $result = $apiInstance->transfer($data);
            $result = json_decode($result, true);
            if ($result['status'] == 'SUCCESS'){
                return true;
            }else{
                throw new Exception($result['message']);
            }
        } catch (ApiException $e) {
            throw new Exception('操作失败' . $e->getMessage());
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2182155.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

相机基础概念

景深&#xff1a; 景深的定义 DOF:depth of filed 是指在摄影机镜头或其他成像器前沿能够取得清晰图像的成像所测定的被摄物体前后距离范围。光圈、镜头、及焦平面到拍摄物的距离是影响景深的重要因素。定义3&#xff1a;在镜头前方&#xff08;焦点的前、后&#xff09;有一…

PCL 投影滤波器

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 投影滤波 2.1.2 可视化 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#xff09; 一、…

Java的栈帧和动态链接是什么?

在 Java 的面试过程中&#xff0c;不可避免的一个面试题那就是 JVM&#xff0c;而 JVM 的面试题中&#xff0c;有各种&#xff0c;比如在堆中会被问到的关于垃圾回收机制的相关问题&#xff0c;在栈中会被问到入栈以及出栈的过程&#xff0c;来聊一下关于栈的相关问题&#xff…

【EchoMimic整合包及教程】蚂蚁集团支付宝开源了数字人技术EchoMimic,可用于虚拟主播、视频编辑等

蚂蚁集团支付宝开源了数字人技术EchoMimic&#xff0c;可用于虚拟主播和视频编辑。EchoMimic是一个音频驱动的肖像动画生成工具&#xff0c;具有丰富的表情和流畅的动作。它支持音频驱动、姿势驱动和音频与姿势混合驱动动画&#xff0c;并提供了易于使用的WebUI和GradioUI界面。…

三品PLM系统如何提升企业产品研发效率?

三品PLM系统如何提升企业研发效率 在竞争日益激烈的市场环境中&#xff0c;企业研发效率的高低直接决定了其产品的上市速度、质量以及市场竞争力。为了应对这一挑战&#xff0c;越来越多的企业开始引入PLM系统&#xff0c;而三品PLM系统凭借其强大的功能和全面的解决方案&…

移动技术开发:音乐播放器

1 实验名称 音乐播放器 2 实验目的 掌握使用Service启动服务的方法&#xff0c;掌握BroadcastReceiver广播传递机制的实现&#xff0c;利用Activity、Service和BroadcastReceiver实现一个音乐播放器APP。 3 实验源代码 布局文件代码&#xff1a; <?xml version"1.…

yum无法使用解决办法

yum无法使用解决方法&#xff08;比较全&#xff0c;以后如果遇到别的问题还会添加&#xff09;yum无法使用解决方法&#xff08;比较全&#xff0c;以后如果遇到别的问题还会添加&#xff09; 如下&#xff0c;新装的linux虚拟机&#xff0c;yum安装wget报错 Cannot find a …

内存占用估算方法

优质博文&#xff1a;IT-BLOG-CN 通过掌握每种数据类型的大小&#xff0c;就可以更准确地预测对象和数据的内存消耗。 一、基础数据类型 Java基础数据类型结构&#xff0c;在64位系统开启指针压缩情况下的内存占用字节数&#xff1a; booleanbytecharshortintlongfloatdoub…

D23【 python 接口自动化学习】- python 基础之判断与循环

day23 match语句 学习日期&#xff1a;20240930 学习目标&#xff1a;判断与循环 --33 match语句&#xff1a;如何通过match关键字来处理程序的分支逻辑&#xff1f; 学习笔记&#xff1a; match语句的语法 基本写法 代码实现&#xff08;后续更新为自己写的代码&#xff…

软件测试学习笔记丨Mock的价值与实战

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/32331 一、Mock的价值与意义 1.1 简介 测试过程中&#xff0c;对于一些不容易构造或获取的对象&#xff0c;用一个虚拟的对象来替代它&#xff0c;达到相同的效果&#xff0c;这个虚拟的对象…

YOLOv11尝鲜测试五分钟极简配置

ultralytics团队在最近又推出了YOLOv11&#xff0c;不知道在有生之年能不能看到YOLOv100呢哈哈。 根据官方文档&#xff0c;在 Python>3.8并且PyTorch>1.8的环境下即可安装YOLOv11&#xff0c;因此之前YOLOv8的环境是可以直接用的。 安装YOLOv11&#xff1a; pip instal…

安宝特分享 | AR技术重塑工业:数字孪生与沉浸式培训的创新应用

在数字化转型的浪潮中&#xff0c;AR&#xff08;增强现实&#xff09;技术与工业的结合正在呈现新的趋势和应用延伸。特别是“数字孪生”概念的崛起&#xff0c;为AR技术在工业中提供了独特而创新的切入点。 本文将探索AR如何与数字孪生、沉浸式体验和实用案例相结合&#xf…

OpenHarmony(鸿蒙南向开发)——小型系统芯片移植指南(一)

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 移植须知 本文详细介绍如何将OpenHarmony小型系统的linux和LiteOS…

Elasticsearch学习笔记(3)

RestAPI Elasticsearch&#xff08;ES&#xff09;官方提供了多种语言的客户端库&#xff0c;用于与Elasticsearch进行交互。这些客户端库的主要功能是帮助开发者更方便地构建和发送DSL&#xff08;Domain Specific Language&#xff09;查询语句&#xff0c;并通过HTTP请求与…

全面提升MySQL性能:从硬件到配置再到代码的最佳实践

MySQL 是全球最流行的开源关系型数据库管理系统之一&#xff0c;广泛应用于各种规模的应用程序中。随着应用规模的增长&#xff0c;数据库的性能优化成为提升系统整体性能的关键因素。本文将从多个角度探讨如何对MySQL进行性能优化&#xff0c;帮助开发者和DBA解决实际问题&…

JWT 令牌生成报错

一、问题描述 我在获取JWT令牌时&#xff0c;报了一个这样的错误 error&#xff1a;io.jsonwebtoken.security.WeakKeyException: The signing keys size is 64 bits which is not secure enough for the HS256 algorithm. 二、问题原因 原因是我这里指定的签名密钥也就是si…

java实现的无头单向非循环链表

java实现的无头单向非循环链表 ArrayList的缺陷链表链表的概念及结构无头单向非循环链表的实现链表OJ题 ArrayList的缺陷 由于ArrayList底层是一段连续空间&#xff0c;当在ArrayList任意位置插入或者删除元素时&#xff0c;就需要将后序元素整体往前或者往后搬移&#xff0c;…

使用C语言获取iostat中的await值的方法和方案

使用C语言获取iostat中的await值的方法和方案 1. 准备工作2. 调用iostat命令并获取输出3. 解析iostat输出4. 完整实现和错误处理5. 注意事项在Linux系统中,iostat命令是sysstat软件包的一部分,用于监控系统的CPU、网卡、tty设备、磁盘、CD-ROM等设备的活动情况和负载信息。其…

逻辑回归(下): Sigmoid 函数的发展历史

背景 闲来无事翻了一下之前买的一个机器学习课程及之前记录的网络笔记&#xff0c;发现遇到公式都是截图&#xff0c;甚至是在纸上用笔推导的。重新整理一遍之前逻辑回归函数的学习笔记&#xff0c;主要是为了玩一下 LaTex 语法&#xff0c;写公式挺有意思的。 整理之前三篇笔…

VMware 虚拟机 下载安装 Centos7 和Windows10 镜像源

准备工作 下载 VMware链接&#xff1a;稍后发布链接 Centos7完整版链接&#xff1a;https://www.123865.com/ps/EF7OTd-mdAnH Centos7mini版链接&#xff1a;https://www.123865.com/ps/EF7OTd-1dAnH Windows10链接&#xff1a;https://www.123865.com/ps/EF7OTd-4dAnH 演示环境…