vue 支付宝支付笔记总结

news2024/11/19 7:41:05

Vue 支付宝支付

1、支付宝介绍

支付宝(中国)网络技术有限公司成立于2004年,是国内的第三方支付平台,致力于为企业和个人提供“简单、安全、快速、便捷”的支付解决方案。支付宝公司从2004年建立开始,始终以“信任”作为产品和服务的核心。旗下有“支付宝”与“支付宝钱包”两个独立品牌。自2014年第二季度开始成为当前全球最大的移动支付厂商。
支付宝与国内外180多家银行以及VISA、MasterCard国际组织等机构建立战略合作关系,成为金融机构在电子支付领域最为信任的合作伙伴。
2020年2月,尼泊尔央行向支付宝颁发牌照。7月,支付宝入选区块链战“疫”优秀方案名单。10月,支付宝上线 “晚点付”功能。2021年12月,支付宝与中国银联在全国范围实现收款码扫码互认。
支付宝借呗改成信用贷。 12月2日,支付宝发布公告表示,支付宝与中国银联在2020年开始基于条码互联互通业务展开密切沟通和探索,并陆续在北京、天津、广州、深圳、成都、重庆、西安等多个城市实现收款码扫码互认 。
2022年2月,支付宝公布“支持中国女足发展工作小结”:已累计向中国足协拨款2.5亿元。
2022年8月,支付宝(中国)网络技术有限公司法定代表人、董事长将由井贤栋变更为倪行军。

百度百科介绍:

百度百科-支付宝

2、主要功能

1、支持余额宝,理财收益随时查看;
2、支持各种场景关系,群聊群付更方便;
3、提供本地生活服务,买单打折尽享优惠;
4、为子女父母建立亲情账户;
5、随时随地查询淘宝账单、账户余额、物流信息;
6、免费异地跨行转账,信用卡还款、充值、缴水电煤气费;
7、还信用卡、付款、缴费、充话费、卡券信息智能提醒;
8、行走捐,支持接入iPhone健康数据,可与好友一起健康行走及互动,还可以参与公益。 [63]
9、蚂蚁森林,通过特定方式获得能量,能量可以养成一棵树,养成后即可在现实某个地域种下一棵实体的树 [65] 。

3、日记风波

2016年11月支付宝推出圈子功能,发帖与芝麻信用分捆绑,甚至只限女性,由于出现大量美女自拍,甚至大尺度照片,因此被网友调侃为“支付鸨”。
在支付宝首页搜索框查找圈子功能的入口。其中“白领日记”和“校园日记”的圈子都显示有超过300万人看过,而这两个圈子都是在两三天前创建。但这些打着白领和校园标签的圈子,只允许女性发动态,而这些动态内容含有很多露骨的图片和暗示性语言。根据圈子的规则,明确规定只有女性有发帖权限,男性用户只能点赞、打赏和评论,且芝麻信用低于750分的用户也不允许评论。
支付宝已将一周内引起巨大争议的两大“圈子”悄悄下线。原本出现在支付宝首页的“白领日记”和“校园日记”等邀请,点进去已没有内容。

4、官方网站

支付宝-官网网站

第二节 支付宝沙箱环境开发

1、支付宝沙箱介绍

点击进入 支付宝沙箱环境

# 支付宝沙箱环境
https://opendocs.alipay.com/common/02kkv7
12

图片alt

2、支付宝扫码登录进入沙箱环境

# 支付宝扫码登录进入沙箱环境
https://openhome.alipay.com/platform/developerIndex.htm
12

图片alt

图片alt

3、支付宝沙箱环境介绍

1)、沙箱应用

图片alt

2)、沙箱账号

图片alt

3)、沙箱工具

图片alt

图片alt

安装后,如下图:

图片alt

参考文章

  • 使用支付宝登录
  • 沙箱账号应用
  • 当面付代码示例
  • 电脑网站支付
以上参考于恩师blog [参码踪 (shenmazong.com)]

支付界面如下所示:

当点击立即支付时,触发支付事件:
请添加图片描述
请添加图片描述
.png)]

了解一下支付流程:

​ 调用支付接口→拿到form表单→调起支付页面→查询支付结果

支付详解:

1、支付接口的参数并不是固定的,而是由后端决定,在接口发送成功后,我们会的得到响应数据,该数据并非JSON格式,而是一个表单数据!

请添加图片描述

开始使用支付宝沙箱完成支付功能》》》》

(1) 、首先引入Alipay依赖

<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>4.10.97.ALL</version>
</dependency>

(2) 、写自己的配置文件 AlipayConfig

支付宝网关一定要使用dev沙箱版 正式开发时去掉即可
// 支付宝网关
public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";

import java.io.FileWriter;
import java.io.IOException;

/**
 * @Author Sun
 * @Version 1.0
 * @description: 不可描述
 * @date 
 */

/* *
 *类名:AlipayConfig
 *功能:基础配置类
 *详细:设置帐户有关信息及返回路径
 *修改日期:2017-04-05
 *说明:
 *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
 */

public class AlipayConfig {

//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

    // 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
    public static String app_id = "支付宝账号";

    // 商户私钥,您的PKCS8格式RSA2私钥
    public static String merchant_private_key = "填写自己的商户私钥";

    // 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
    public static String alipay_public_key = "支付宝公钥";

    // 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    public static String notify_url = "http://工程公网访问地址/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";

    // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
//    public static String return_url = "http://工程公网访问地址/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp";
    public static String return_url = "http://localhost:9013/order/getResult";

    // 签名方式
    public static String sign_type = "RSA2";

    // 字符编码格式
    public static String charset = "utf-8";

    // 支付宝网关
    public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";

    // 支付宝网关
    public static String log_path = "D:\\";


//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

    /**
     * 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
     * @param sWord 要写入日志里的文本内容
     */
    public static void logResult(String sWord) {
        FileWriter writer = null;
        try {
            writer = new FileWriter(log_path + "alipay_log_" + System.currentTimeMillis()+".txt");
            writer.write(sWord);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (writer != null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

配置信息完成后来看看接口怎么写的吧

Controller层

/**
     * 支付宝支付
     * @param payWeChatOrderVo
     * @return
     * @throws AlipayApiException
     */
    @PostMapping("alipay-pay")
    public ResultResponse pay(@RequestBody PayWeChatOrderVo payWeChatOrderVo) throws AlipayApiException {
        return tbOrderService.aliPay(payWeChatOrderVo);
    }

	/*
	PayWeChatOrderVo自己定义的订单信息根据自己项目变更即可(也可以使用官方给出的参数)
	@Data
        public class PayWeChatOrderVo implements Serializable {
            private Long outTradeNo;
            private String description;
            private Long amount;
            private String attach;
        }
	*/

Service Impl

   @Override
    public ResultResponse aliPay(PayWeChatOrderVo payWeChatOrderVo) throws AlipayApiException {
//获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);

        //设置请求参数
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        alipayRequest.setReturnUrl(AlipayConfig.return_url);
        alipayRequest.setNotifyUrl(AlipayConfig.notify_url);

        //商户订单号,商户网站订单系统中唯一订单号,必填
        Long out_trade_no = payWeChatOrderVo.getOutTradeNo();
        //付款金额,必填
        Long total_amount = payWeChatOrderVo.getAmount();
        //订单名称,必填
        String subject = payWeChatOrderVo.getAttach();
        //商品描述,可空
        String body = payWeChatOrderVo.getDescription();

        alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
                + "\"total_amount\":\""+ total_amount +"\","
                + "\"subject\":\""+ subject +"\","
                + "\"body\":\""+ body +"\","
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

        //若想给BizContent增加其他可选请求参数,以增加自定义超时时间参数timeout_express来举例说明
        //alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
        //		+ "\"total_amount\":\""+ total_amount +"\","
        //		+ "\"subject\":\""+ subject +"\","
        //		+ "\"body\":\""+ body +"\","
        //		+ "\"timeout_express\":\"10m\","
        //		+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
        //请求参数可查阅【电脑网站支付的API文档-alipay.trade.page.pay-请求参数】章节

        //请求
        String result = alipayClient.pageExecute(alipayRequest).getBody();
        return ResultResponse.SUCCESS().data("result", result);
    }

最后返回结果:

 "result": "<form name=\"punchout_form\" method=\"post\" action=\"https://openapi.alipaydev.com/gateway.do?charset=utf-8&method=alipay.trade.page.pay&sign=YVU9IIZLSal7va53ep%2B46Z2ZFtEE%2BDGiA9abXrKKzJfSHMbXRxxyQNEzRQbrkzY3LsFIJvPkwucDWFH7kBzWSMLnAZptD%2BZymd4byKsNBrVPLba39yw9sO7YgxlJLc9G9v5hd3CPTW2zQYaJXE14rUFVZi%2F5tk7Q4NXvPVVXGcnj%2BfwTjHh0XVJZ4GFb8D7McuVDcVeHy4sXDMCKPZ7BYKbfmDnKCQhwUrF%2B2uMZClUc6xNdyB%2FKS%2FOCJ4pE4LB50aJfUFNKU%2FY2pboCmo9mOnl41LoSMizOGtIhydR6%2FrVPA%2Bnd93lwJ%2FjgxC3ySmnDZ49fHi9YBieAjMmMkdnhTw%3D%3D&return_url=http%3A%2F%2Flocalhost%3A9013%2Forder%2FgetResult&notify_url=http%3A%2F%2F%E5%B7%A5%E7%A8%8B%E5%85%AC%E7%BD%91%E8%AE%BF%E9%97%AE%E5%9C%B0%E5%9D%80%2Falipay.trade.page.pay-JAVA-UTF-8%2Fnotify_url.jsp&version=1.0&app_id=2021000122606111&sign_type=RSA2&timestamp=2022-12-25+16%3A00%3A57&alipay_sdk=alipay-sdk-java-dynamicVersionNo&format=json\">\n<input type=\"hidden\" name=\"biz_content\" value=\"{&quot;out_trade_no&quot;:&quot;852963741&quot;,&quot;total_amount&quot;:&quot;1&quot;,&quot;subject&quot;:&quot;1&quot;,&quot;body&quot;:&quot;1&quot;,&quot;product_code&quot;:&quot;FAST_INSTANT_TRADE_PAY&quot;}\">\n<input type=\"submit\" value=\"立即支付\" style=\"display:none\" >\n</form>\n<script>document.forms[0].submit();</script>"

2、接下来如何将得到的数据调起支付界面呢?我们需要在页面中有一个可以提供渲染的元素,该元素可以在网页的任何位置

<div ref="alipayWap" v-html="alipay" />

3、在接口响应成功后,将数据渲染到元素内,通过触发表单的提交事件,就可以调起支付接口了,是不是非常简单

// 调用支付接口

//支付宝
    alipayhandleBuy(index, row) {
      console.log(index, row);
      this.aliPaydialogTableVisible = true;
      let param = {};
      param.outTradeNo = row.orderNo;
      param.description = row.productName;
      param.amount = row.orderAmount;
      param.attach = row.productName;
      this.orderNoa = row.orderNo;
      apipay(param).then((res) => {
        // 渲染支付页面
        this.alipay = res.data.data.result;
        // 防抖避免重复支付
        this.$nextTick(() => {
          // 提交支付表单
          this.$refs.alipayWap.children[0].submit();
          setTimeout(() => {
            // this.toPayFlag = false;
          }, 500);
        });
      });
    },

4、最后就是回调函数了

在填写之前的配置信息时同步回调路径写上自己的函数(同步)

 /**
     * 得到支付结果   以下代码均来自于支付宝官网
     * @param request
     * @param response
     * @return
     * @throws AlipayApiException
     */
    @Override
    public void aliPayResult(HttpServletRequest request, HttpServletResponse response) throws AlipayApiException, IOException {
        //获取支付宝GET过来反馈信息
        Map<String,String> params = new HashMap<String,String>();
        Map<String,String[]> requestParams = request.getParameterMap();
        for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
            String name = (String) iter.next();
            String[] values = (String[]) requestParams.get(name);
            String valueStr = "";
            for (int i = 0; i < values.length; i++) {
                valueStr = (i == values.length - 1) ? valueStr + values[i]
                        : valueStr + values[i] + ",";
            }
            //乱码解决,这段代码在出现乱码时使用
            // valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
            params.put(name, valueStr);
        }

        boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type); //调用SDK验证签名

        //——请在这里编写您的程序(以下代码仅作参考)——
        String out_trade_no="";
        if(signVerified) {
            //商户订单号
             out_trade_no = request.getParameter("out_trade_no");

            //支付宝交易号
            String trade_no = request.getParameter("trade_no");

            //付款金额
            String total_amount = request.getParameter("amount");

            System.out.println("trade_no:"+trade_no+"<br/>out_trade_no:"+out_trade_no+"<br/>total_amount:"+total_amount);
            log.info("成功转发到产品列表");
            //支付成功修改状态
            OrderNoInfoVo orderNoInfoVo = new OrderNoInfoVo();
            orderNoInfoVo.setOrderNo(out_trade_no);
            updateState(orderNoInfoVo);
            response.sendRedirect("http://localhost:8080/#/order?orderNo="+out_trade_no);
        }else {
            System.out.println("验签失败");
            log.error("失败转发到订单列表");
            //0000 失败订单编号
            String fail="0000";
            response.sendRedirect("http://localhost:8080/#/order?orderNo="+fail);
        }
    }

验证成功返还正常的订单编号,失败则返回-0000

这时候重定向到订单列表地址栏取得商品订单编号就可以校验订单是否成功

就绪函数
created() {
    this.LoadList();
    //取得地址信息
    let orderOnInfo=this.$route.query.orderNo
    console.log("orderOnInfo====",orderOnInfo)
    if(orderOnInfo != null && orderOnInfo!='000'){
      this.$message.success("支付成功")
      //清除地址栏
      let path = this.$route.path; //先获取路由路径
      this.$router.push(path); //再跳转路由路径,query参数没带过去,所以被清除了
    }
  }

单列表地址栏取得商品订单编号就可以校验订单是否成功

就绪函数
created() {
    this.LoadList();
    //取得地址信息
    let orderOnInfo=this.$route.query.orderNo
    console.log("orderOnInfo====",orderOnInfo)
    if(orderOnInfo != null && orderOnInfo!='000'){
      this.$message.success("支付成功")
      //清除地址栏
      let path = this.$route.path; //先获取路由路径
      this.$router.push(path); //再跳转路由路径,query参数没带过去,所以被清除了
    }
  }

参考链接:【https://blog.csdn.net/Goodboygo/article/details/120153900】

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

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

相关文章

CTF-PWN-堆-【chunk extend/overlapping-2】(hack.lu ctf 2015 bookstore)

文章目录 hack.lu ctf 2015 bookstore检查IDA源码main函数edit_notedelete_notesubmit .fini_array段劫持(回到main函数的方法)思路python格式化字符串简化思路&#xff1a; exp 佛系getshell 常规getshell hack.lu ctf 2015 bookstore 检查 got表可写&#xff0c;没有地址随…

1、缓存击穿背后的问题

当面试官问&#xff1a;你知道什么是缓存击穿吗&#xff0c;你们是如何解决的&#xff1f; 首先我们要了解什么是缓存击穿&#xff1f;以及缓存击穿会引发什么问题&#xff1f; 缓存击穿就是redis中的热点数据过期&#xff0c;缓存失效&#xff0c;导致大量的请求直接打到数据…

【c++】高精度算法(洛谷刷题2024)玩具谜题详解(含图解)

系列文章目录 第三题&#xff1a;玩具谜题 视频讲解&#xff1a;http://【洛谷题单 - 算法 - 高精度】https://www.bilibili.com/video/BV1Ym4y1s7BD?vd_source66a11ab493493f42b08b31246a932bbb 文章目录 目录 系列文章目录 文章目录 前言 一、题目分析以及思考 二、代码…

伊恩·斯图尔特《改变世界的17个方程》相对论笔记

它告诉我们什么&#xff1f; 物质包含的能量等于其质量乘以光速的平方。 为什么重要&#xff1f; 光的速度很快&#xff0c;它的平方绝对是一个巨大的数。1千克的物质释放出的能量相当于史上最大的核武器爆炸所释放能量的约40%。一系列相关的方程改变了我们对空间、时间、物质和…

C/C++ - 函数进阶(C++)

目录 默认参数 函数重载 内联函数 函数模板 递归函数 回调函数 默认参数 定义 默认参数是在函数声明或定义中指定的具有默认值的函数参数。默认参数允许在调用函数时可以省略对应的参数&#xff0c;使用默认值进行替代。 使用 默认参数可以用于全局函数和成员函数。默认参…

WebRTC 入门:开启实时通信的新篇章(上)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

使用电脑时突然遇到“mfc140.dll文件丢失”的问题都有什么解决办法

当你在使用电脑时突然遇到“mfc140.dll文件丢失”的问题时&#xff0c;可能会感到困惑和苦恼。一旦出现这样的问题&#xff0c;缺少这个文件可能导致一些应用程序无法正常启动&#xff0c;影响你的工作和娱乐体验。其实这个问题是可以解决的&#xff0c;接下来我们将介绍一些可…

部署个人知识库管理软件 MrDoc详细教程

效果 一、拉取 MrDoc 代码 进入目录&#xff1a; cd /opt开源版&#xff1a; git clone https://gitee.com/zmister/MrDoc.git专业版&#xff1a; git clone https://{用户名}:{密码}git.mrdoc.pro/MrDoc/MrDocPro.git二、拉取 Docker 镜像 docker pull zmister/mrdoc:v7三…

yarn安装第三方插件包,提示报错,yarn的镜像源已经过期了,因为yarn和npm用的是淘宝的镜像源,淘宝的镜像源已经过期了,要设置最新的淘宝镜像源。

淘宝最新镜像源切换_淘宝镜像-CSDN博客 查看yarn用的什么镜像源 yarn config get registry 查看具体的信息 yarn config list 设置淘宝的最新镜像源&#xff0c;yarn和npm都要设置最新的淘宝镜像源&#xff0c;不然还是报错 npm config set registry https://registry.npmm…

211毕业38岁产品经理被裁瞒着妻子送外卖

估计很多人都看到这个新闻了&#xff0c;微博和知乎也都上了热搜榜。 有人说&#xff0c;这一看就是摆拍的&#xff0c;谁没事在家里装个摄像头啊&#xff0c;这两人演技也还差点意思。 也有人说&#xff0c;大丈夫能屈能伸。虽然211毕业在互联网大厂工作&#xff0c;但是被裁了…

代码随想录算法训练营Day42|0-1背包理论基础、416. 分割等和子集

目录 0-1背包理论基础 0-1背包问题 二维dp数组01背包 算法实现 一维dp数组01背包 ​编辑算法实现 416. 分割等和子集 前言 思路 算法实现 总结 0-1背包理论基础 0-1背包问题 题目链接https://kamacoder.com/problempage.php?pid1046 有n件物品…

一、Kotlin 开发环境搭建

1. Kotlin 官网 https://kotlinlang.org/ 2. Kotlin 命令行工具下载 下载网址&#xff1a; https://github.com/JetBrains/kotlin/releases/tag/v1.3.50 切换其他版本&#xff0c;改下版本号即可 下载 kotlin-compiler-1.3.50.zip 文件即可 解压 kotlin-compiler-1.3.50.zip…

【智能家居入门之环境信息监测】(STM32、ONENET云平台、微信小程序、HTTP协议)

作为入门本篇只实现微信小程序接收下位机上传的数据&#xff0c;之后会持续发布如下项目&#xff1a;①可以实现微信小程序控制下位机动作&#xff0c;真正意义上的智能家居&#xff1b;②将网络通讯协议换成MQTT协议再实现上述功能&#xff0c;此时的服务器也不再是ONENET&…

回归预测 | MATLAB实现PSO-GRNN粒子群优化广义回归神经网络多输入单输出预测(含优化前后预测可视化)

回归预测 | MATLAB实现PSO-GRNN粒子群优化广义回归神经网络多输入单输出预测 目录 回归预测 | MATLAB实现PSO-GRNN粒子群优化广义回归神经网络多输入单输出预测预测效果基本介绍程序设计参考资料预测效果 <

Cesium.js实现显示点位对应的自定义信息弹窗(数据面板)

零、相关技术选型&#xff1a; Vue2 Vuecli5 Cesium.js 天地图 一、需求说明 在使用2D地图&#xff08;天地图、高德地图等&#xff09;基于官方文档可以实现下面需求&#xff1a; 实现添加点位&#xff0c;并在点位附近显示对应的信息弹窗。 一般信息弹窗的显示方式有两种&am…

Qt线程高级应用

一般我们在用Qt开发时&#xff0c;把耗时操作放在线程中执行&#xff0c;避免卡界面&#xff0c;Qt的线程使用有两种方式&#xff0c;一种是继承QThread&#xff0c;一种是moveToThread的方式&#xff0c;以及QtConcurrent方式 首先我们来看第一种&#xff1a; #ifndef WORKER…

matlab appdesigner系列-仪器仪表3-旋钮

旋钮&#xff0c;同过旋转显示特定的值 示例&#xff1a;模拟收音机调频 操作步骤&#xff1a; 1&#xff09;将旋钮、标签按钮拖拽到画布上&#xff0c;将标签文字修改为&#xff1a;欢迎收听&#xff0c;并将旋钮其数值范围改为90-107 2&#xff09;设置旋钮的回调函数 代…

实现屏蔽 Ctrl + Alt + Del 、Ctrl + Shift + Esc 等热键(一)

前面几篇我们都讲解了很多有关 winlogon 挂钩的事情。拦截系统热键的非驱动方式是比较复杂的。本节就复现《禁止CtrlAltDel、WinL等任意系统热键》一文中的方法四&#xff0c;实现拦截 Ctrl Alt Del 等热键。其实通过 heiheiabcd 给出的方法从 WMsgKMessageHandler 入手并不是…

数字图像处理(实践篇)三十二 OpenCV-Python比较两张图片的差异

目录 一 方案 二 实践 ​通过计算两张图像像素值的均方误差(MSE)来比较两张图像。差异大的两张图片具有较大的均方差值,相反,相似的图片间则具有较小的均方差值。需要注意的是。待比较的两张图像要具有相同的高度、宽度和通道数。 一 方案 ①导入依赖库 import cv2 import…

【项目管理】CMMI-管理性能与度量

管理性能与度量 (Managing Performance and Measurement, MPM)的目的在于开发和维持度量能力来管理开发过程性能&#xff0c;以实现公司业务目标&#xff0c;更直接来说&#xff0c;将管理和改进工作集中在成本、进度表和质量性能上&#xff0c;最大限度地提高业务投资回报。 1…