1.背景

实际开发中用到支付宝支付的概念非常大......

这里重点分析一下支付宝支付实际生产必须要实现的功能

1.获取支付链接(统一下单)

2.支付回调(异步通知)

3.统一下单交易查询

4.退款

5.退款查询

6.对账单下载

官方接口文档如下

https://opendocs.alipay.com/apis

2.需要的账号数据

appid

公钥

私钥

网外可以访问的支付宝异步回调地址,如果没有学习可以使用免费的:https://www.cnblogs.com/newAndHui/p/14241177.html

当然实际生产这些是需要公司资质申请才可以的

但是支付做的非常人性化,提供了沙箱环境给我们测试、开发用

沙箱环境配置文档(很简单的几部就搞定)

https://opendocs.alipay.com/open/200/105311

沙箱环境配置好后可以得到如下数据

appid

公钥

私钥

买家支付宝账号(用于测试的时候登录付款)

商家账号(这里用不到)

配置好后截图如下:

3.获取支付链接(统一下单)

这里以手机网站支付为例,因为这个应用场景最常见

文档:https://opendocs.alipay.com/open/203/105287

统一下单代码:

package com.ldp.user.service.impl;

import cn.hutool.core.util.URLUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.alipay.api.response.AlipayTradeWapPayResponse;
import com.ldp.user.common.constant.AliPayData;
import com.ldp.user.common.constant.PayConstant;
import com.ldp.user.common.exception.AliPayException;
import com.ldp.user.entity.bo.PayBO;
import com.ldp.user.entity.vo.PayVO;
import com.ldp.user.service.IPayService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import java.util.HashMap; /**
* @author 姿势帝-博客园
* @address https://www.cnblogs.com/newAndHui/
* @WeChat 851298348
* @create 01/08 9:04
* @description
*/
@Service
@Slf4j
public class AliPayService implements IPayService {
// 缓存阿里客户端
private static HashMap<String, AlipayClient> payClient = new HashMap<>(); @Override
public String getPayType() {
return PayConstant.ALIPAY;
} @Override
public PayVO getPayInfo(PayBO payBO) throws Exception {
// 实际生中这里应该根据订单号查询产品 与 查询 收款账号数据
// 这里模拟订单数据 账号使用支付宝的沙箱环境
// 沙箱环境文档 https://opendocs.alipay.com/open/200/105311
payBO.setAppId("2016092900623927");
payBO.setPublicKey(AliPayData.PUBLIC_KEY);
payBO.setPrivateKey(AliPayData.PRIVATE_KEY);
payBO.setPayUrl("https://openapi.alipaydev.com/gateway.do");
payBO.setAsynchronousNotifyUrl("http://lidongping.free.idcfengye.com/api/async/alipay/payment");
payBO.setSynchronizationNotifyUrl("http://lidongping.free.idcfengye.com/api/sync/alipay/payment");
payBO.setPayTitle("购买课程测试");
payBO.setPayMoney(100.01);
// 准备支付客户端
AlipayClient client = initAlipay(payBO);
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
// 设置异步通知地址
request.setNotifyUrl(payBO.getAsynchronousNotifyUrl());
// 设置同步通知地址
request.setReturnUrl(payBO.getSynchronizationNotifyUrl());
JSONObject bizContent = new JSONObject();
String payTitle = URLUtil.encode(payBO.getPayTitle(), "utf-8");
bizContent.put("subject", payTitle);
bizContent.put("out_trade_no", payBO.getOrderNo());
bizContent.put("total_amount", String.format("%.2f", payBO.getPayMoney()));
//用户付款中途退出返回商户网站的地址(同步返回地址)
bizContent.put("quit_url", payBO.getSynchronizationNotifyUrl());
bizContent.put("product_code", "QUICK_WAP_WAY");
//90分钟超时
bizContent.put("timeout_express", "90m");
request.setBizContent(bizContent.toJSONString());
log.info("支付宝下单参数:" + JSON.toJSONString(request));
AlipayTradeWapPayResponse response = client.pageExecute(request);
log.info("支付宝下单响应:" + JSON.toJSONString(response));
if (!response.isSuccess()) {
throw new AliPayException(response.getMsg());
}
PayVO payVO = new PayVO().setOrderNo(payBO.getOrderNo()).setPayInfo(response.getBody());
return payVO;
} /**
* @param payBO
* @return
*/
private AlipayClient initAlipay(PayBO payBO) {
log.info("收款支付宝账号客户端初始化,url:{},AppId:{}", payBO.getPayUrl(), payBO.getAppId());
AlipayClient alipayClient = payClient.get(payBO.getAppId());
if (alipayClient != null) {
return alipayClient;
}
alipayClient = new DefaultAlipayClient(payBO.getPayUrl(), payBO.getAppId(),
payBO.getPrivateKey(), "json", "utf-8", payBO.getPublicKey(), "RSA2");
payClient.put(payBO.getAppId(), alipayClient);
return alipayClient;
}
}

4.支付回调

文档:https://opendocs.alipay.com/open/203/105286/

代码:

package com.ldp.user.controller;

import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.servlet.ServletUtil;
import com.alipay.api.internal.util.AlipaySignature;
import com.ldp.user.common.base.BaseResponse;
import com.ldp.user.common.base.ResponseBuilder;
import com.ldp.user.common.constant.AliPayConstant;
import com.ldp.user.common.constant.AliPayData;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest;
import java.util.Map; /**
* @author 姿势帝-博客园
* @address https://www.cnblogs.com/newAndHui/
* @WeChat 851298348
* @create 01/09 6:24
* @description
*/
@RestController
@Slf4j
public class AliPayController {
/**
* 支付宝支付 异步回调
* 官方文档
* https://opendocs.alipay.com/open/203/105286/
*
* @param request
* @return
* @throws Exception
*/
@PostMapping("/async/alipay/payment")
public String notifyPaymentResult(HttpServletRequest request) throws Exception {
log.info("异步回调....");
Map<String, String> paramsMap = ServletUtil.getParamMap(request);
// 解析参数
String tradeStatus = paramsMap.get("trade_status");
String totalAmount = paramsMap.get("total_amount");
String orderNo = paramsMap.get("out_trade_no");
String tradeNo = paramsMap.get("trade_no");
String buyerId = paramsMap.get("buyer_id");
if (StrUtil.isEmpty(tradeStatus) || StrUtil.isEmpty(orderNo) ||
(!tradeStatus.equals(AliPayConstant.WAIT_BUYER_PAY) &&
!tradeStatus.equals(AliPayConstant.TRADE_CLOSED) &&
!tradeStatus.equals(AliPayConstant.TRADE_SUCCESS) &&
!tradeStatus.equals(AliPayConstant.TRADE_FINISHED))) {
log.error("支付宝回调参数异常");
return AliPayConstant.RESP_FAILURE;
}
// 不处理状态
if (tradeStatus.equals(AliPayConstant.WAIT_BUYER_PAY) ||
tradeStatus.equals(AliPayConstant.TRADE_CLOSED)) {
return AliPayConstant.RESP_SUCCESS;
}
// TODO 根据订单号获取收款账号数据... 实际生产应该这样写 这里略
// 这里使用模拟数据
String publicKey = AliPayData.PUBLIC_KEY;
// 参数验签
boolean signPassed = AlipaySignature.rsaCheckV1(paramsMap, publicKey, "utf-8", "RSA2");
if (!signPassed) {
log.error("支付宝验签失败");
return AliPayConstant.RESP_FAILURE;
}
// TODO 更新数据库订单数据 ... 这里略
return AliPayConstant.RESP_SUCCESS;
} /**
* 支付宝支付 同步返回
*
* @return
* @throws Exception
*/
@GetMapping("/async/alipay/payment")
public BaseResponse async() {
log.info("同步返回.....");
// TODO 同步返回一般是指用户支付完成后返回的页面,通常是一个页面,这里模拟一下同步返回...
return ResponseBuilder.success("同步返回额....");
}
}

5.测试

1.调用获取支付信息接口

/**
* 支付宝沙箱环境 支付账号
* 买家账号djpbvo6259@sandbox.com
* 登录密码111111
* 支付密码111111
*/
@Test
void getPayInfo() {
String url = urlLocal + "/userOrder/payInfo";
System.out.println("请求地址:" + url);
HttpRequest request = HttpUtil.createRequest(Method.GET, url);
Map<String, Object> map = new HashMap<>();
map.put("orderNo", "NO" + System.currentTimeMillis());
// 微信支付 wechat 支付宝 alipay
map.put("payCategory", "alipay");
// 201 jsapi支付 , 202 微信H5 101支付宝H5
map.put("payType", "101");
request.form(map);
System.out.println("请求参数:" + map);
request.header("X-Real_IP", "192.168.5.195");
request.setConnectionTimeout(60 * 1000);
String respone = request.execute().body();
System.out.println("响应结果:" + respone);
}

测试请求如下:

请求地址:http://localhost:8080/api/userOrder/payInfo
请求参数:{payCategory=alipay, orderNo=NO1610170051893, payType=101}
响应结果:{"message":"success","code":100,"data":{"orderNo":"NO1610170051893","payInfo":"<form name=\"punchout_form\" method=\"post\" action=\"https://openapi.alipaydev.com/gateway.do?charset=utf-8&method=alipay.trade.wap.pay&sign=GDby0sDLbIeH8Q7lbE7cls9Ar5uF0hPsy7f8BVxZff6%2B38rRXioUtAhYhf9vEd464vCV0spWLIpZmoL0Kx9HtIkHdZXDt90yL37JHKgedvn292kE3sqYHnF0mpXBLqFcbwxllxkq%2BpS8IQA7KKZWADTuHDPdGOYy6%2BZD3gP607aJ7i34hNKUReCeFcAc3M0ctUubn6u%2F%2FiC%2FXQQARI%2FJ7pR2MMD86m5GKuev%2FNv1hUvYDvW0SMH9IADGxoCo4Fn4faCX2Yz3HTjUWAgpzQun6eohEnyRD%2Fg1JLGMZ2PJc4NYnYpDDmFYHf430nQvIiKpQ%2BR3wO%2BUph54zKBsMIS7pA%3D%3D&return_url=http%3A%2F%2Flidongping.free.idcfengye.com%2Fapi%2Fsync%2Falipay%2Fpayment&notify_url=http%3A%2F%2Flidongping.free.idcfengye.com%2Fapi%2Fasync%2Falipay%2Fpayment&version=1.0&app_id=2016092900623927&sign_type=RSA2&timestamp=2021-01-09+13%3A27%3A32&alipay_sdk=alipay-sdk-java-3.7.26.ALL&format=json\">\n<input type=\"hidden\" name=\"biz_content\" value=\"{&quot;out_trade_no&quot;:&quot;NO1610170051893&quot;,&quot;total_amount&quot;:&quot;100.01&quot;,&quot;quit_url&quot;:&quot;http://lidongping.free.idcfengye.com/api/sync/alipay/payment&quot;,&quot;subject&quot;:&quot;%E8%B4%AD%E4%B9%B0%E8%AF%BE%E7%A8%8B%E6%B5%8B%E8%AF%95&quot;,&quot;timeout_express&quot;:&quot;90m&quot;,&quot;product_code&quot;:&quot;QUICK_WAP_WAY&quot;}\">\n<input type=\"submit\" value=\"立即支付\" style=\"display:none\" >\n</form>\n<script>document.forms[0].submit();</script>"}}

payInfo是支付宝返回的支付信息,测试是建议在断点的情况下复制出来,因为输出后form表单中有转移符

2.获得支付信息后,模拟访问html页面中

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>支付测试</title>
</head>
<body>
<h2>test ali pay</h2>
<div>
<!-- TODO 这里的代码时获取支付信息时支付宝返回的,实际生产中应该在前端填充然后会自动跳转,
这里只是测试,手动复制接口获得的支付信息,然后在使用浏览器访问该html页面,即可就如支付宝支付页面-->
<form name="punchout_form" method="post"
action="https://openapi.alipaydev.com/gateway.do?charset=utf-8&method=alipay.trade.wap.pay&sign=fMqWzKUHlcaj0UkqXlR%2Fl4Gx4bmPQ7xRIxZ49n%2BXCjVT2wPtEmUyCfJG7d1x0UfAXUhgaCnEgu8vS1IjBPH5aAfCHni5UMDOJBDArAqcJvGvZkp43zCp9f9fFsPf4kUwXOLCvpO%2BjqEbM2puF6k5JpTT%2BsBWIo9CaILT4GC5fvyTXxAC6DmMwlN%2F4NrsbFXbQjxdnMrF4LTLWJmPFZn%2BftdLIstsgh79RvS0r%2BnVy6dDpaEbxCYIlal%2FGGhdnp8bttnI3WHxv4fZqu8qiyGHFdQ6N9ZHx09HgthCnd7PJqkO6IOy1aeYo4ZhSmSRzQxbMUTqPXIS7orNPHMtJBdcNg%3D%3D&return_url=http%3A%2F%2Flidongping.free.idcfengye.com%2Fapi%2Fwc%2Fnotify%2Fcode&notify_url=http%3A%2F%2Flidongping.free.idcfengye.com%2Fapi%2Fwc%2Fnotify%2Fcode&version=1.0&app_id=2016092900623927&sign_type=RSA2&timestamp=2021-01-08+22%3A01%3A19&alipay_sdk=alipay-sdk-java-3.7.26.ALL&format=json">
<input type="hidden" name="biz_content"
value="{&quot;out_trade_no&quot;:&quot;NO1610114479772&quot;,&quot;total_amount&quot;:&quot;100.01&quot;,&quot;quit_url&quot;:&quot;http://lidongping.free.idcfengye.com/api/wc/notify/code&quot;,&quot;subject&quot;:&quot;%E8%B4%AD%E4%B9%B0%E8%AF%BE%E7%A8%8B%E6%B5%8B%E8%AF%95&quot;,&quot;timeout_express&quot;:&quot;90m&quot;,&quot;product_code&quot;:&quot;QUICK_WAP_WAY&quot;}">
<input type="submit" value="立即支付" style="display:none">
</form>
<script>document.forms[0].submit();</script>
</div>
</body>
</html>

3.访问html页面

因为我们是在浏览器上演示,选择继续浏览器付款

选择支付宝登录

4.登录沙箱环境买家账号

5.输入密码确认支付

6.支付宝异步回调

异步处理代码

  /**
* 支付宝支付 异步回调
* 官方文档
* https://opendocs.alipay.com/open/203/105286/
*
* @param
* @return
* @throws Exception
*/
@PostMapping("/async/alipay/payment")
public String notifyPaymentResult(@RequestParam Map<String, String> paramsMap) throws Exception {
log.info("异步回调....");
// 解析参数
String tradeStatus = paramsMap.get("trade_status");
String totalAmount = paramsMap.get("total_amount");
String orderNo = paramsMap.get("out_trade_no");
String tradeNo = paramsMap.get("trade_no");
String buyerId = paramsMap.get("buyer_id");
if (StrUtil.isEmpty(tradeStatus) || StrUtil.isEmpty(orderNo) ||
(!tradeStatus.equals(AliPayConstant.WAIT_BUYER_PAY) &&
!tradeStatus.equals(AliPayConstant.TRADE_CLOSED) &&
!tradeStatus.equals(AliPayConstant.TRADE_SUCCESS) &&
!tradeStatus.equals(AliPayConstant.TRADE_FINISHED))) {
log.error("支付宝回调参数异常");
return AliPayConstant.RESP_FAILURE;
}
// 不处理状态
if (tradeStatus.equals(AliPayConstant.WAIT_BUYER_PAY) ||
tradeStatus.equals(AliPayConstant.TRADE_CLOSED)) {
return AliPayConstant.RESP_SUCCESS;
}
// TODO 根据订单号获取收款账号数据... 实际生产应该这样写 这里略
// 这里使用模拟数据
String publicKey = AliPayData.PUBLIC_KEY;
// 参数验签
boolean signPassed = AlipaySignature.rsaCheckV1(paramsMap, publicKey, "utf-8", "RSA2");
if (!signPassed) {
log.error("支付宝验签失败");
return AliPayConstant.RESP_FAILURE;
}
// TODO 更新数据库订单数据和缓存 ... 这里略
// 这里只是模拟方放入缓存,便于前端查询订单 60 * 60 * 2L 表示缓存2小时
RedisUtil.set(orderNo, JSON.toJSON(paramsMap), 60 * 60 * 2L);
log.info("异步处理成功.............");
return AliPayConstant.RESP_SUCCESS;
}

异步处理结果

01-09 22:42:17.323 [http-nio-8080-exec-4] INFO c.l.u.c.i.HttpServletRequestWrapperFilter - ContentType: application/x-www-form-urlencoded; charset=utf-8
01-09 22:42:17.323 [http-nio-8080-exec-4] INFO c.l.u.c.i.HttpServletRequestWrapperFilter - 请求地址: /api/async/alipay/payment
01-09 22:42:17.323 [http-nio-8080-exec-4] INFO c.l.u.c.i.HttpServletRequestWrapperFilter - 请求方法: POST
01-09 22:42:17.323 [http-nio-8080-exec-4] INFO c.l.u.c.i.HttpServletRequestWrapperFilter - 请求参数: gmt_create=2021-01-09 22:42:11&charset=utf-8&seller_email=ybtvrf9123@sandbox.com&subject=购买课程测试&sign=md0r4kl8kNllBUv+kTZXH/QnaVJuqyfEVwO5swkTDc08eHw0yM6JY/KASVAuYQV/1eJf4X1DRNmxN0Tr786k7PclEedO4wm4Qd4xC3Har5h6NlaGKCvWGRGfeIiaypxm4ILgct9MHKtCPztJDiU2Cg03vzqmidkMrdKcTr2RZN0ZgHGCzNodbTyp5ijt7purGFAdLEyAWfDjsLwMXUSgiSqhYhqe6qMm1meSVSjQkLH9e0GlJGgUU7pxjEQesrLcp6fzFhOVF0wwsccZeXJ+fFWLewTlJTb8L+ER8r1tGLBPMKATfGwuNkUWTUuEjsJXgp07qmNBgbAFQdnvkqZ4bg==&buyer_id=2088102178030268&invoice_amount=100.01&notify_id=2021010900222224212030260509089969&fund_bill_list=[{"amount":"100.01","fundChannel":"ALIPAYACCOUNT"}]&notify_type=trade_status_sync&trade_status=TRADE_SUCCESS&receipt_amount=100.01&buyer_pay_amount=100.01&app_id=2016092900623927&sign_type=RSA2&seller_id=2088102177806680&gmt_payment=2021-01-09 22:42:12&notify_time=2021-01-09 22:42:13&version=1.0&out_trade_no=NO1610203242503&total_amount=100.01&trade_no=2021010922001430260501106994&auth_app_id=2016092900623927&buyer_logon_id=djp***@sandbox.com&point_amount=0.00
01-09 22:42:17.323 [http-nio-8080-exec-4] INFO com.ldp.user.controller.AliPayController - 异步回调....
01-09 22:42:17.339 [http-nio-8080-exec-4] INFO com.ldp.user.controller.AliPayController - 异步处理成功.............
01-09 22:42:17.339 [http-nio-8080-exec-4] INFO c.l.u.c.i.HttpServletRequestWrapperFilter - 响应结果: success
01-09 22:42:17.339 [http-nio-8080-exec-4] INFO c.l.u.c.i.HttpServletRequestWrapperFilter - HTTP状态: 200
01-09 22:42:17.339 [http-nio-8080-exec-4] INFO c.l.u.c.i.HttpServletRequestWrapperFilter - 处理时长: 16毫秒

7.同步返回

  /**
* 支付宝支付 同步返回
*
* @return
* @throws Exception
*/
@GetMapping("/sync/alipay/payment")
public BaseResponse async() {
log.info("同步返回.....");
// TODO 同步返回一般是指用户支付完成后返回的页面,通常是一个页面,这里模拟一下同步返回...
return ResponseBuilder.success("同步返回额....");
}

7.查询订单支付状态

 /**
* 获取支付信息
* <p>
*
* @param orderNo
* @return
*/
@GetMapping("/order")
public BaseResponse getOrder(String orderNo) throws Exception {
// TODO 实际生产中应该根据订单号 先查询缓存,缓存没有在查询数据库
// 这里只是测试,只查询缓存
Object order = RedisUtil.get(orderNo);
if (null == order) {
// TODO 查询数据库 略
}
return ResponseBuilder.success(order);
}

6.小结

1.这里代码是实际开发中的代码,只是将业务逻辑去掉,架构模式保留,如果要完整的代码可以找我拿源码;

2.这里暂时只是演示下单和回调接口,后面在组织项目的时候再详细讲解;

3.如果看了博客后还是是很理解,该博客有视频详细的讲解与演示,可以看视频讲解或单独问我;

完美!

支付宝支付java版实战(含视频讲解)的更多相关文章

  1. 微信支付java版V3验证数据合法性

    [TOC] 1. 微信支付java版V3验证数据合法性 概要:使用微信支付接口时,微信会返回或回调给商户XML数据,开发者需要验证微信返回的数据是否合法. 特别提醒:商户系统对于支付结果通知的内容一定 ...

  2. 银联支付java版

    注:本文来源于:<  银联支付java版    > 银联支付java版 2016年09月18日 15:55:20 阅读数:2431 首先去银联官网注册测试支付账户   下载对应的demo[ ...

  3. app支付宝支付java服务端代码

    app支付java服务端生成支付单文档 public String aliPay(String amount,Map<String,Object> body){ //实例化客户端 Alip ...

  4. 手把手教你完成App支付JAVA后台-支付宝支付JAVA

    接着上一篇博客,我们暂时完成了手机端的部分支付代码,接下来,我们继续写后台的代码. 后台基本需要到以下几个参数,我都将他们写在了properties文件中: 支付宝参数 AliPay.payURL = ...

  5. 支付宝支付Java代码

    支付宝调用流程 开发前的准备工作 配置应用网关 应用网关里面填写的值就是商户后台的异步回调地址.也就是在支付宝付完款之后,由支付宝调用商户,便于商户验证订单各信息和更新订单状态 授权回调地址 授权回调 ...

  6. 支付宝支付Java后台总结

    这个支付的流程是前端H5(APP等)需要支付时调用后台的接口拿到我们加密的签名去调起支付宝的支付界面(支付宝APP)进行支付操作,并且前端在支付成功后,支付宝后台会回调一个我们在签名时写入的一个接口地 ...

  7. 微信支付与支付宝支付java开发注意事项

    说明:这里只涉及到微信支付和淘宝支付 以官网的接口为准,主要关注[网关].[接口].[参数][加密方式][签名][回调] 第一步,了解自己的项目要集成的支付方式 常见的有扫码支付.网页支付.APP支付 ...

  8. JAVA全套资料含视频源码(持续更新~)

    本文旨在免费分享我所搜集到的Java学习资源,所有资源都是通过正规渠道获取,不存在侵权.现在整理分享给有所需要的人. 希望对你们有所帮助!有新增资源我会更新的~大家有好的资源也希望分享,大家互帮互助共 ...

  9. 银联在线 网关支付 (JAVA版)

    这一版本的编写是在我上一次博客的基础上写的,有不懂得童鞋可以先看下我的原先在线支付的博客,熟悉下:http://blog.csdn.net/yulei_qq/article/details/45197 ...

  10. Java后端框架之Spring Boot详解,文末有Java分布式实战项目视频可取

    在 Java 后端框架繁荣的今天,Spring 框架无疑是最最火热,也是必不可少的开源框架,更是稳坐 Java 后端框架的龙头老大. 用过 Spring 框架的都知道 Spring 能流行是因为它的两 ...

随机推荐

  1. 请写出常用的linux指令

    a.cd /home 进入 '/ home' 目录' b.cd .. 返回上一级目录 c.cd ../.. 返回上两级目录 d.mkdir dir1 创建一个叫做 'dir1' 的目录' e.mkdi ...

  2. C++操作符重载(operator)

    c++操作符 例如-=+*/等,甚至包括,<<等都是操作符.c++特色之一就是给予完全重构和重载操作符(Java不可以,c#操作部分). 例子入手 假设一个结构体,定义如下 struct ...

  3. 无法启动 IIS Express Web 服务器.....另一个程序正在使用此文件,进程无法访问。 问题解决

    一般是由于端口被占用导致的,但是这个端口你在命令行netstat -a里 排除 如果发现被占用,那么就kill进程就可以了 如果没有发现被占用,依然无法启动,可以尝试以下方法 解决方案1: 修改iis ...

  4. JAVA日期当天0点0分0秒

    LocalDateTime LocalDateTime ldt = LocalDateTime.now(); LocalDateTime todayZero = LocalDateTime.of(ld ...

  5. 支撑阻力指标,庄家成本价是可靠的支撑位(无未来,DLL加密)

    本指标依据庄家的成本价设计的,庄家成本价是可靠的支撑位.底层逻辑:庄家是有内幕的, 庄家能在价格低位时抄底,庄家控股时,庄家不会让散户获取低价的筹码,所以当股价到达到支撑位时,会有比较大的反弹.庄家也 ...

  6. python 将查询到数据,处理成包含列名和数据的字典类型数据

    try: self.connect_dbserver() self.cursor.execute(sql) res = self.cursor.fetchall() # 返回的是数组的类型 print ...

  7. 解读MySQL 8.0数据字典的初始化与启动

    本文分享自华为云社区<MySQL全文索引源码剖析之Insert语句执行过程>,作者:GaussDB 数据库. 本文主要介绍MySQL 8.0数据字典的基本概念和数据字典的初始化与启动加载的 ...

  8. hive第一课:# hive-3.1.2分布式搭建文档

    hive-3.1.2分布式搭建文档 谷歌浏览器下载网址:Google Chrome – Download the fast, secure browser from Google 华为云镜像站:htt ...

  9. HTTP 协议学习:1-HTTP概述

    背景 原文:HTTP概述 HTTP是一种能够获取如 HTML 这样的网络资源的 protocol(通讯协议).它是在 Web 上进行数据交换的基础,是一种 client-server 协议,也就是说, ...

  10. Docker使用Dockerfile部署项目

    什么是dockerfile? Dockerfile是一个包含用于组合映像的命令的文本文档.可以使用在命令行中调用任何命令. Docker通过读取Dockerfile中的指令自动生成镜像. 如何通过do ...