【Java 实现微信支付、Native 支付流程】,从编写代码到支付成功,一步到位!

2023-11-06

1. 项目环境介绍

jdk 1.8
mysql 5.7
maven 3.6
在这里插入图片描述
项目前后端分离:后端 SpringBoot 项目、前端 Vue 项目

2. 微信支付文档

官方文档:https://pay.weixin.qq.com/wiki/doc/api/index.html
在这里插入图片描述
Native 场景介绍:用户扫描商户展示在各种场景的二维码进行支付。
这里我们支付流程选择方式二:
官方流程图:
在这里插入图片描述

2.1 业务流程说明

用我自己完成一次的过程来说。

  1. 在前端页面,用户肯定要点击某个按钮或者东西来触发事件,调用我们自己编写的接口,然后返回给前端一个二维码。
  2. 我们通过调用微信支付 【统一下单API】接口得到一个 code_url。
  3. 然后在前端通过某项技术跟据返回的 code_url 生成二维码。
  4. 用户打开微信 “扫一扫”,然后扫描这个二维码。
  5. 进入支付页面,支付指定金额后完成支付交易。
  6. 然后我们在调用微信支付【查询订单 API】查询用户支付状态
  7. 通过此支付状态可以判断用户支付成功还是支付失败。
  8. 支付成功就执行我们自己的业务逻辑,一般像修改定单状态改成已支付。
    在这里插入图片描述

3. 准备信息

pom 文件引入微信支付 SDK 依赖

		<!-- 微信支付 SDK -->
		<dependency>
			<groupId>com.github.wxpay</groupId>
			<artifactId>wxpay-sdk</artifactId>
			<version>0.0.3</version>
		</dependency>

由于我们后面要调用微信支付的 API,所以我们要提前准备好一些配置信息.

/**
 * 微信支付参数配置信息
 *
 * @author: 南独酌酒 <211425401@126.com>
 * @date: 2020/10/9 16:14
 */
public class ConfigUtil {
    /**
     * 微信公众账号
     */
    public final static String APPID = "填写自己的";
    /**
     * 商户号
     */
    public final static String MCH_ID = "填写自己的";
    /**
     * API密钥
     */
    public final static String API_KEY = "填写自己的";
}

3.1 微信公众账号如何获取?

公众账号ID是什么:微信支付分配的公众账号ID(企业号corpid即为此appId)
申请地址:PC网站接入支付
在这里插入图片描述

3.2 商户号如何获取?

商户号是什么:微信支付分配的商户号
申请地址:https://pay.weixin.qq.com/index.php/apply/applyment_home/guide_normal

3.3 API密钥如何获取?

文档地址:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=4_3
API 密钥是自己的商户平台设置的:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置

这三种信息的获取,大家要好好看文档,微信的生态圈还是挺庞大的,还是要多花些时间好好研究一下。

3.4 准备工具类

这是用来发送 Http 请求的工具类

import javax.net.ssl.HttpsURLConnection;
import java.io.OutputStream;
import java.net.URL;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;

/**
 * 自定义微信支付工具类
 *
 * @author: 南独酌酒 <211425401@126.com>
 * @date: 2020/10/9 16:34
 */
public class CommonUtil {
    /**
     * 发送 http 请求
     *
     * @param requestUrl    请求路径
     * @param requestMethod 请求方式(GET/POST/PUT/DELETE/...)
     * @param outputStr     请求参数体
     * @return 结果信息
     */
    public static String httpsRequest(String requestUrl, String requestMethod, String outputStr) {
        try {
            URL url = new URL(requestUrl);
            HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setUseCaches(false);
            // 设置请求方式(GET/POST)
            conn.setRequestMethod(requestMethod);
            conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");
            // 当outputStr不为null时向输出流写数据
            if (null != outputStr) {
                OutputStream outputStream = conn.getOutputStream();
                // 注意编码格式
                outputStream.write(outputStr.getBytes("UTF-8"));
                outputStream.close();
            }
            // 从输入流读取返回内容
            InputStream inputStream = conn.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String str = null;
            StringBuffer buffer = new StringBuffer();
            while ((str = bufferedReader.readLine()) != null) {
                buffer.append(str);
            }
            // 释放资源
            bufferedReader.close();
            inputStreamReader.close();
            inputStream.close();
            inputStream = null;
            conn.disconnect();
            return buffer.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取ip
     *
     * @param request 请求
     * @return ip 地址
     */
    public static String getIp(HttpServletRequest request) {
        if (request == null) {
            return "";
        }
        String ip = request.getHeader("X-Requested-For");
        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("X-Forwarded-For");
        }
        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_CLIENT_IP");
        }
        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return ip;
    }
}

4. 进入开发阶段

4.1 后端编写生成微信支付二维码的接口

编写第一个接口:主要的作用是调用微信支付【统一下单 API】,这里接口返回结果我们封装成一个 Map ,主要返回给前端 code_url 二维码、 total_fee 总金额、 out_trade_no 订单号
创建一个 WeiXinPayController 控制器

import com.github.wxpay.sdk.WXPayConstants;
import com.github.wxpay.sdk.WXPayUtil;
import com.ruoyi.common.utils.pay.CommonUtil;
import com.ruoyi.common.utils.pay.ConfigUtil;
import com.ruoyi.framework.web.domain.AjaxResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.text.DecimalFormat;
import java.util.*;
import java.util.concurrent.TimeUnit;

/**
 * 微信支付控制层
 *
 * @author: 南独酌酒 <211425401@126.com>
 * @date: 2020/10/9 17:07
 */
@RestController
@RequestMapping(value = "/pay")
public class WeiXinPayController {

	private static final DecimalFormat df = new DecimalFormat("#");

	/**
     * 生成微信支付二维码
     *
     * @param outTradeNo 订单号
     * @param totalFee   金额(分)
     */
    @RequestMapping(value = "/createNative")
    public Map<String, String> createNative(@RequestParam("outTradeNo") String outTradeNo,
                                            @RequestParam("totalFee") String totalFee,
                                            HttpServletRequest request, HttpServletResponse response) {
        try {
            //todo 创建请求参数
            SortedMap<String, String> req = new TreeMap<String, String>();
            req.put("appid", ConfigUtil.APPID);    //公众号
            req.put("mch_id", ConfigUtil.MCH_ID);  // 商户号
            req.put("nonce_str", WXPayUtil.generateNonceStr()); // 32位随机字符串
            req.put("body", "去氘水"); // 商品描述
            req.put("out_trade_no", outTradeNo);   // 商户订单号
            req.put("total_fee", df.format(Double.parseDouble(totalFee) * 100));    // 标价金额(分)
            req.put("spbill_create_ip", CommonUtil.getIp(request));   // 终端IP
            req.put("notify_url", "http://www.baidu.com");  // 回调地址
            req.put("trade_type", "NATIVE");    // 交易类型
            req.put("sign", WXPayUtil.generateSignature(req, ConfigUtil.API_KEY, WXPayConstants.SignType.MD5));  // 签名

            //todo 生成要发送的 xml
            String xmlBody = WXPayUtil.generateSignedXml(req, ConfigUtil.API_KEY);
            System.err.println(String.format("微信支付预下单请求 xml 格式:\n%s", xmlBody));

            //todo 发送 POST 请求 统一下单 API 并携带 xmlBody 内容,然后获得返回接口结果
            String result = CommonUtil.httpsRequest("https://api.mch.weixin.qq.com/pay/unifiedorder", "POST", xmlBody);
            System.err.println(String.format("%s", result));

            //todo 将返回结果从 xml 格式转换为 map 格式
            Map<String, String> resultMap = WXPayUtil.xmlToMap(result);
            Map<String, String> map = new HashMap<>();
            map.put("code_url", resultMap.get("code_url")); // 支付地址
            map.put("total_fee", totalFee); // 总金额
            map.put("out_trade_no", outTradeNo);    // 订单号
            return map;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

4.2 前端实现

  1. 前端通过点击结算按钮,调用此接口,获取到返回的 code_url 属性,然后通过 Vue-qr 来实现二维码的生成操作。
    在这里插入图片描述
  2. 首先实现 showalert 函数,通过一系列表单选项都填写后,调用生成二维码的函数
	// 立即支付按钮事件
    showalert() {
      	let that = this;
        if (that.pro === '') {
          that.$message.warning("请选择收货省份");
        } else if (that.city === '') {
          that.$message.warning("请选择收货城市");
        } else if (that.value3 === '') {
          that.$message.warning("请填写联系人");
        } else if (that.value4 === '') {
          that.$message.warning("请填写联系电话");
        } else {
          if (that.fukuan === true) {
            that.createNative();
          } else {
            that.$message.warning("请选择支付方式");
          }
        }
      }
    }
  1. 二维码实现的函数调用
	// 生成微信支付二维码
    createNative() {
      let that = this;
      let outTradeNo = moment(new Date()).format('YYYYMMDDHHmmssSSS');  // 订单号
      let totalFee = 1;
      $.ajax({
        type: 'GET',
        url: 'http://localhost:8080/pay/createNative?outTradeNo=' + outTradeNo + '&totalFee=' + totalFee,
        success: function (res) {
          that.codeUrl = res.code_url;
        }
      });
    }
  • moment 是一个日期格式化工具包【Moment.js 文档
    Vue 使用 moment :
// 通过 cnpm 安装 moment
cnpm install moment --save
// 在组件中引入后即可使用 moment
import moment from 'moment'
  • codeUrl 是用来在页面上展示二维码的变量
  1. 使用 Vue-qr 来在页面上展示二维码
// 安装 vue-qr
cnpm install vue-qr --save
// 使用还是先引入 vueqr
import VueQr from 'vue-qr'
// 然后通过 components 注册 VueQr
components: {
    VueQr
}

在这里插入图片描述
将二维码展示到页面上,codeUrl 就是用的上面提前声明好的 codeUrl

<vue-qr class="wximg"
              :size="191"
              :margin="0"
              :auto-color="true"
              :dot-scale="1"
              :text="codeUrl"/>

常用属性介绍
在这里插入图片描述

4.3 后端编写 查询订单支付状态 接口

前面通过后台返回 code_url,前端通过调用接口,然后利用 vue-qr 技术正确的将支付二维码展示到页面上去了。现在来通过调用微信支付【查询订单 API】,查看用户支付成功还是支付失败。
继续在 WeiXinPayController 控制器中添加接口,通过订单号查询此次支付的状态。

 /**
     * 查询订单支付状态
     *
     * @param outTradeNo 订单号
     * @return 支付状态
     */
    @RequestMapping(value = "/queryOrder")
    public AjaxResult queryOrder(@RequestParam("outTradeNo") String outTradeNo) {
        int x = 0;
        while (true) {
            // 调用查询微信支付订单状态方法
            Map<String, String> map = this.queryPayStatus(outTradeNo);
            if (map.isEmpty()) {
                return AjaxResult.error("支付出错!");
            }
            if (map.get("trade_state").equals("SUCCESS")) {
                return AjaxResult.success("支付成功!");
            }
            try {
                // 间隔3秒
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // 为了不让程序无休止的运行下去,定义一个 x 变量,当超过 100 次的话我们就退出此程序
            x++;
            if (x >= 100) {
                return AjaxResult.error("二维码超时!");
            }
        }
    }

    /**
     * 查询微信支付订单状态
     *
     * @param outTradeNo 订单号
     * @return 支付状态
     */
    private Map<String, String> queryPayStatus(String outTradeNo) {
        try {
            //todo 创建请求参数
            SortedMap<String, String> req = new TreeMap<String, String>();
            req.put("appid", ConfigUtil.APPID); // 公众号ID
            req.put("mch_id", ConfigUtil.MCH_ID);   // 商户号
            req.put("out_trade_no", outTradeNo);    // 订单号
            req.put("nonce_str", WXPayUtil.generateNonceStr()); // 随机字符串
            req.put("sign", WXPayUtil.generateSignature(req, ConfigUtil.API_KEY, WXPayConstants.SignType.MD5));

            //todo 生成要发送的 xml
            String xmlBody = WXPayUtil.generateSignedXml(req, ConfigUtil.API_KEY);
            System.err.println(String.format("查询订单支付状态 xml 格式:\n%s", xmlBody));

            //todo 调用查询订单支付状态 API
            String result = CommonUtil.httpsRequest("https://api.mch.weixin.qq.com/pay/orderquery", "POST", xmlBody);

            //todo 返回解析后的 map 数据
            Map<String, String> map = WXPayUtil.xmlToMap(result);
            System.out.println(String.format("%s", map));
            return map;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

4.4 前端调用 查询订单支付状态 接口

  1. 在原本实现过的 createNative 函数中调用此接口
	// 生成微信支付二维码
    createNative() {
      let that = this;
      let outTradeNo = moment(new Date()).format('YYYYMMDDHHmmssSSS');  // 订单号
      let totalFee = 1;
      $.ajax({
        type: 'GET',
        url: 'http://localhost:8080/pay/createNative?outTradeNo=' + outTradeNo + '&totalFee=' + totalFee,
        success: function (res) {
          that.codeUrl = res.code_url;
          // 在这里调用查询支付状态的函数 --------------------------begin
          /* 
          调用查询订单,查看微信支付状态
          订单号就是生成支付二维码接口返回的参数,直接传给 queryPayStatus 即可
		  */
          that.queryPayStatus(res.out_trade_no);
          // 在这里调用查询支付状态的函数 --------------------------end
        }
      });
    }
  1. queryPayStatus 函数实现
	// 查询订单支付状态
    queryPayStatus(outTradeNo) {
      let that = this;
      $.ajax({
        type: 'GET',
        url: 'http://localhost:8080/pay/queryOrder?outTradeNo=' + outTradeNo,
        success: function (res) {
          if (res.code === 200) {
            // 支付成功
            that.$alert(res.msg, '支付窗口', {
              confirmButtonText: '确定'
              //todo 支付成功跳转至自己的订单页面
            });
            // 剩下的就是调用自己的业务逻辑等等...
            /*
			比如自己写个函数,这里来调用
			然后主要逻辑就是修改定单的状态为已支付
			然后清空购物车
			跳转至订单页面等等...
			*/
          } else {
            // 支付失败
            that.$alert(res.msg, '支付窗口', {
              confirmButtonText: '重新支付',
              callback: action => {
                that.createNative();  // 重新生成二维码
              }
            });
          }
        }
      });
    }

总结

到这里基本的支付流程就算完成了,通过调用微信开发文档提供的【统一下单】【查询订单】就可以实现一个简单的支付功能,还有后续一些申请退款等功能未实现。
如果你觉得这篇文章对你有帮助,那就给作者点个赞,来个评论增加点人气,让我也开心开心

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Java 实现微信支付、Native 支付流程】,从编写代码到支付成功,一步到位! 的相关文章

  • 将比较器对象存储在数组中

    我为我的对象定义了 4 个比较器 如下所示 public static Comparator
  • 如何以编程方式检查应用程序是否在调试模式下运行?

    我必须在应用程序中的某个位置确定我的应用程序是在调试模式还是实时模式下运行 是否有任何函数或代码可用于检查 在开 关两种情况下都会返回 true false 如果是这样 请帮助我 提前致谢 从问题中尚不清楚调试模式是否指的是 应用程序是否可
  • JPA 实体中的方法是否允许抛出异常?

    我尝试创建的 Entity 有问题 当尝试使用 OpenJPA 实现在 Eclipse 中测试类时出现问题 我有not尝试过其他人 所以不确定它是否适用于他们 我的测试用例非常简单 因为它创建一个 EntityManagerFactory
  • 如何使用 log4j 自动记录类中调用的每个方法

    我有一个包含数据库调用的类 我通常希望使用 log4j 记录该类中调用的每个方法 带参数 logger debug foo id id initiated 可以自动执行此操作吗 也许通过在每个方法的开头使用某种注释而不是编写每个 logge
  • 仅使用 ServletContext 查找应用程序的 URL

    我正在使用 Spring MVC 编写一个 Java Web 应用程序 我有一个后台进程 它会遍历数据库并查找必须通过电子邮件发送给我的用户的通知 这些电子邮件需要包含应用程序的超链接 对于网络应用程序来说 这似乎是相当常见的模式 但我遇到
  • 将 Spring Boot 应用程序部署到 Heroku 失败并显示“无效标志:--release -> [帮助 1]”

    当我尝试将代码部署到 Heroku 时 通过git push heroku master 我收到 Maven 错误 remote ERROR Failed to execute goal org apache maven plugins m
  • C# 中的 Culture 相当于 Java 中的 Locale 吗?

    C 使用文化的概念 这在操作上与 Java 中的 Locale 类似吗 或者底层概念是否存在显着差异 从文化而不是语言环境的角度进行工作是一种寻找正确抽象层次的尝试 从以类似方式做事的人群的角度来考虑事物 而不是谈论地理区域和语言 并有点疯
  • 用户“root”@“localhost”的访问被拒绝

    我正在尝试从数据库中获取记录 但我面临这个访问被拒绝的问题 我尝试了 Stack Overflow 上提到的其他解决方案 例如向用户授予权限 但没有任何效果 访问数据库的代码 public void service HttpServletR
  • Android - Java - 发送 facebook 聊天消息的意图(facebook 禁用 xmpp)

    Facebook 已弃用 xmpp API 有没有办法打开意图 或将数据传递到fb 以在Android设备上发送聊天消息 设备上安装的 Facebook 和 Messenger 应用 谢谢 您需要将 uri 传递给意图 这里10000572
  • Java HttpURLConnection:内容长度计算

    我目前正在为 bitbucket issues RESTful API 开发一个库 我取得了很大的进步 现在我要解决这个部分更新问题 http confluence atlassian com display BBDEV Issues Is
  • 从 Java 调用 Python 代码时出现问题(不使用 jython)

    我发现这是从 java 运行 使用 exec 方法 python 脚本的方法之一 我在 python 文件中有一个简单的打印语句 但是 我的程序在运行时什么也没做 它既不打印Python文件中编写的语句 也不抛出异常 程序什么都不做就终止了
  • java3d 中的面部着色

    使用java3d 如何不在每个顶点基础上着色 而是在每个面基础上着色 我尝试学习 java3d 但我生成的 Shape3d 看起来并不符合预期 我想用不同的颜色给不同的三角形着色 但我不知道该怎么做 纹理看起来有点大材小用 而且我根本没有掌
  • Java反序列化中避免重复对象

    我有两个列表 list1 和 list2 其中包含对某些对象的引用 其中某些列表条目可能指向同一对象 然后 由于各种原因 我将这些列表序列化为两个单独的文件 最后 当我反序列化列表时 我想确保我不会重新创建超出需要的对象 换句话说 List
  • Java 中 LINQ 的等价物是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Java 中 LINQ 的等价物是什么 没有什么比 LINQ for Java 更好的了 Edit 现在
  • 如何迭代SparseArray?

    有没有办法迭代 Java SparseArray 适用于 Android 我用了sparsearray通过索引轻松获取值 我找不到 看来我找到了解决方案 我没有正确注意到keyAt index 功能 所以我会这样做 for int i 0
  • GAE - Eclipse 中的开发服务器未更新?

    我在 Eclipse 上使用 Google AppEngine 开发服务器 我的本地网页似乎没有更新 直到我在开发服务器上进行了多次重新启动 使用 Eclipse 中的 运行 或 调试 按钮 我究竟做错了什么 基本流程是 更改 java 文
  • 在java中设置Process对象的安全性

    有人可以告诉我如何限制通过进程对象访问系统属性吗 如果我通过进程对象运行以下代码 我可以抛出安全异常吗 System getProperty user home 请告诉我如何为流程对象配置证券 在ProcessBuilder类文档中 环境方
  • Spring Data JPA 和 Exists 查询

    我正在使用 Spring Data JPA 使用 Hibernate 作为我的 JPA 提供程序 并想要定义一个exists附加 HQL 查询的方法 public interface MyEntityRepository extends C
  • 跳过一行GridBagLayout

    我在 JFrame 上使用 GridBagLayout 我希望能够跳过一两行 但将这些行显示为空白 然后在这些行后面有一个按钮 我在文档中找不到任何方法来执行我所描述的操作 有谁知道我可以执行此操作的任何方法吗 发现它比添加空组件干净得多
  • 文件构造函数说明

    我无法理解以下文件构造函数 public File String parent String child and public File File parent String child 参数有什么作用parent and child该文件

随机推荐

  • 100个数据分析常用指标和术语

    有个朋友是金融行业产品经理 最近在对已有的站内用户做分层与标签分类 需要对用户进行聚类分析 一般从事数据分析行业的朋友对这类词并不陌生 但是像市场运营人员就会把这类些名词概念搞混 导致结果不准确 数据分析相关概念多且杂 容易搞混 为了便于大
  • 搜索引擎solr系列---core的创建及数据全量导入

    有关官方配置的步骤 我已经在这篇文章里写了 连接是官方配置solr步骤 一 solr下载及单节点的启动 配置说明 大家都知道 solr是首先要将数据建立出索引 而建立成的索引文件就存放到solrHome里 因为一个solr服务器因为需求 将
  • 高频交易数据如何产生和处理?

    证监会主席易会满出席第60届世界交易所联合会 WFE 会员大会时表示 在成熟市场 量化交易 高频交易比较普遍 在增强市场流动性 提升定价效率的同时 也容易引发交易趋同 波动加剧 有违市场公平等问题 万物均有一体两面 高频交易作为当前常见的交
  • ffmpeg源码编译vs2013版本

    完整版安装ffmpeg 一 安装choco 1 Set ExecutionPolicy AllSigned 2 Set ExecutionPolicy Bypass Scope Process Force System Net Servic
  • springboot @ConfigurationProperties和@value读取配置文件的内容

    这里先只介绍 ConfigurationProperties的用法 1 属性文件信息 2 java类
  • cause and effect essay

    cause and effect essay Introduction 2 sentences rewritten question introduction of specific topics Causes 4 5 sentences
  • Memcache是什么

    Memcache是什么Memcache是danga com的一个项目 最早是为 LiveJournal 服务的 目前全世界不少人使用这个缓存项目来构建自己大负载的网站 来分担数据库的压力 它可以应对任意多个连接 使用非阻塞的网络IO 由于它
  • 【linux】查看文件

    01 cat命令 语法 cat 选项 文件 功能 查看目标文件的内容 常用选项 b 对非空输出行编号 n 对输出的所有行编号 s 不输出多行空行 02 tac 命令 功能 与cat类似查看文件内容但是是反向输出 03 more指令 语法 m
  • ue4 Config ini 配置文件使用记录

    休息了一段时间出来码字了 这段时间通过接触国外的技术面试 让我更加坚定了一个想法 技术本身有高低 但我大可不必去追求这个技术本身的 高 产品本身更需要的是在开发迭代中发现问题 而不是仅仅纠结规范不规范的问题 有机会接触更简单 直接的表达当然
  • ToArray,CopyTo,List (IEnumerable collection)

    public class Stu public string Name get set void Main List
  • git如何查看项目的分支和转换分支来提交代码

    要查看Git项目中的所有分支 可以使用以下命令 git branch 该命令会列出当前仓库中所有本地分支 其中 带有 符号的分支表示当前所在的分支 要切换到特定的分支并提交代码 可以使用以下命令 git checkout
  • 【华为机试真题 JAVA】字符串重新排列-100

    题目描述 给定一个字符串s s包括以空格分隔的若干个单词 请对s进行如下处理后输出 1 单词内部调整 对每个单词字母重新按字典序排序 2 单词间顺序调整 1 统计每个单词出现的次数 并按次数降序排列 2 次数相同 按单词长度升序排列 3 次
  • 深入理解计算机系统Lab3实验

    目录 实验准备 实验资源的准备 生成ctarget等文件的反汇编代码 确定实验环境是大端还是小端 实验进行 Phase1 简述 测试 分析 目标 找到touch1的代码并重写 并且 找到getbuf 函数中 为Get 函数所开辟的字符串最大
  • 数据治理-数据质量-数据质量实施方法

    质量实施方法 数据质量领域研究学者和专家结合自身实践 先后提出了一系列质量管理得项目实施方法 其中以全面信息质量管理 全面数据质量管理 数据管理十步法 六西格玛等 与传统数据质量管理一样 数据GIGO规则仍然发挥作用 但在由于大数据的多样性
  • Python 套接字 Accept 超时

    套接字是网络通信的基本构建块 每当两个网络实体需要传输数据时 就会打开一个套接字 这些套接字在会话期间保持连接 但有时 在 Python 中使用套接字时 您可能会等待很长时间 而另一端仍然接受套接字连接 本文讨论了 Python 中套接字的
  • 好书推荐《R语言在定量金融中的应用》

    给大家推荐一本R语言在定量金融方面的好书 是我老师编写的 我也非常有幸参与到这本书的编写过程中 这本书2015年5月份正式上线 其实从2013年底开始写的 经历大约两年的时间 这本书一出来就收到了很大的关注 读者反映都很好 这本书本身是属于
  • HIVE中数据更新(update)操作的实现

    数据更新是一种常见的操作 然后数据仓库的概念一般要求的是数据是集成 稳定的 HIVE作为一种分布式环境下以HDFS为支撑的数据仓库 它同样更多的要求数据是不可变的 然而现实很多任务中 往往需要对数据进行更新操作 经查 Hive自0 11版本
  • 蓝牙模块四大天线方式

    在蓝牙产品中 天线与蓝牙模块的关系是相辅相成的 是一个除了作为核心的系统芯片外 天线是另一个具有影响蓝牙模块传输特性的关键性组件 首先简单概述什么是天线 天线是一种用来发送或者接收电磁波的器件 天线的作用 发射天线的作用是将发射机的高频电流
  • flex布局导致ellispsis失效

    问题描述 之前的文本超过长度省略文章中 讲到了如何通过CSS控制文本超过长度省略 但是在flex布局中 ellispis却失效了 举例说明 文档结构如下 div class container div class div 1 div div
  • 【Java 实现微信支付、Native 支付流程】,从编写代码到支付成功,一步到位!

    文章目录 1 项目环境介绍 2 微信支付文档 2 1 业务流程说明 3 准备信息 3 1 微信公众账号如何获取 3 2 商户号如何获取 3 3 API密钥如何获取 3 4 准备工具类 4 进入开发阶段 4 1 后端编写 生成微信支付二维码