java接入apiv3微信小程序支付(以java的eladmin框架为例)
一、需要准备的资料
1.小程序AppID
如:wx2e56f5******
2.商户号
如:1641******
3.商户API私钥路径:什么是商户API证书?如何获取商户API证书? 获取文件如下图:
如:
本地路径:E:\Env\eladmin\cert\c2\apiclient_key.pem(本地部署写入绝对路径)
服务器路径:/data/cert/eladmin/c2/apiclient_key.pem(服务器写入相对路径)
4.商户证书序列号:登录商户平台【API安全】->【API证书】->【查看证书】,可查看商户API证书序列号。
如:4F24D009CDBC89A**********************
5.商户APIV3密钥:API v3密钥 - 通用规则 | 微信支付商户文档中心
如:tYsmXJrIr*****************
【商户平台】->【账户中心】->【API安全】的页面设置该密钥,请求才能通过微信支付的签名校验。密钥的长度为32个字节。
6.商户平台证书路径
如:
本地路径:E:\Env\eladmin\cert\c2\apiclient_cert.pem(本地部署写入绝对路径)
服务器路径:/data/cert/eladmin/c2/apiclient_cert.pem(服务器写入相对路径)
7.商户平台证书路径p12
如:
本地路径:E:\Env\eladmin\cert\c2\apiclient_cert.p12(本地部署写入绝对路径)
服务器路径:/data/cert/eladmin/c2/apiclient_cert.p12(服务器写入相对路径)
二、代码部分
1.pom.xml内加入微信支付扩展
<!-- 微信支付 --><dependency><groupId>com.github.wechatpay-apiv3</groupId><artifactId>wechatpay-java</artifactId><version>0.2.7</version></dependency>
2.在resources的dev和prod内加入微信支付必填字段#微信支付字段
wx:merchantId: 164*******privateKeyPath: E:\Env\eladmin\cert\c2\apiclient_key.pemcertPath: E:\Env\eladmin\cert\c2\apiclient_cert.pemcertP12Path: E:\Env\eladmin\cert\c2\apiclient_cert.p12merchantSerialNumber: 4F24D009CDBC**********************apiV3key: tYsmXJr******************appId: wx2e56f5******
3.微信支付测试接口3-1:测试下单接口/api/weChatPay/ceshiJSAPI3-2:测试微信支付结果回调地址,当微信支付后,微信方返回支付信息,在回调接口内触发业务逻辑注:测试回调接口必须为线上接口,线下无法实现可先在线上将微信返回数据打印到txt文件内,然后在本地测试回调接口,触发业务逻辑/api/weChatPay/ceshiPayNotify(放入线上的测试回调接口)/api/weChatPay/payNotify(本地测试回调接口)--可在postman内测试测试时,在Headers内Wechatpay-Serial、Wechatpay-Nonce、Wechatpay-Timestamp、Wechatpay-Signature必填上微信返回的json,直接放入raw-json内进行测试4.退款测试接口/api/weChatPay/ceshiRefund(回调接口不是必填项,可用可不用)
WeChatPayService.java:可放在Service内
----------------------------------------------------package me.zhengjie.modules.api.service;import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.Signature;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;
import java.util.Random;@Service
@RequiredArgsConstructor
public class WeChatPayService {/** 商户API私钥路径 */@Value("${wx.privateKeyPath}") //可自己写死路径public String privateKeyPath;//=============生成签名=====开始===================================================/*** 作用:使用字段appId、timeStamp、nonceStr、package计算得出的签名值* 场景:根据微信统一下单接口返回的 prepay_id 生成调启支付所需的签名值* @param appId* @param timestamp* @param nonceStr* @param pack package* @return* @throws Exception*/public String getSign(String appId, long timestamp, String nonceStr, String pack) throws Exception{String message = buildMessage(appId, timestamp, nonceStr, pack);String paySign= sign(message.getBytes("utf-8"));return paySign;}private String buildMessage(String appId, long timestamp, String nonceStr, String pack) {return appId + "\n"+ timestamp + "\n"+ nonceStr + "\n"+ pack + "\n";}private String sign(byte[] message) throws Exception{Signature sign = Signature.getInstance("SHA256withRSA");//这里需要一个PrivateKey类型的参数,就是商户的私钥。sign.initSign(getPrivateKey(privateKeyPath));sign.update(message);return Base64.getEncoder().encodeToString(sign.sign());}/*** 获取私钥。** @param filename 私钥文件路径 (required)* @return 私钥对象*/public static PrivateKey getPrivateKey(String filename) throws IOException {String content = new String(Files.readAllBytes(Paths.get(filename)), "utf-8");try {String privateKey = content.replace("-----BEGIN PRIVATE KEY-----", "").replace("-----END PRIVATE KEY-----", "").replaceAll("\\s+", "");KeyFactory kf = KeyFactory.getInstance("RSA");return kf.generatePrivate(new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey)));} catch (NoSuchAlgorithmException e) {throw new RuntimeException("当前Java环境不支持RSA", e);} catch (InvalidKeySpecException e) {throw new RuntimeException("无效的密钥格式");}}/*** 获取随机位数的字符串* @param length* @return*/public static String getRandomString(int length) {String base = "abcdefghijklmnopqrstuvwxyz0123456789";Random random = new Random();StringBuffer sb = new StringBuffer();for (int i = 0; i < length; i++) {int number = random.nextInt(base.length());sb.append(base.charAt(number));}return sb.toString();}//=============生成签名=====结束===================================================/*** 获取请求文体* @param request* @return* @throws IOException*/public static String getRequestBody(HttpServletRequest request) throws IOException {ServletInputStream stream = null;BufferedReader reader = null;StringBuffer sb = new StringBuffer();try {stream = request.getInputStream();// 获取响应reader = new BufferedReader(new InputStreamReader(stream));String line;while ((line = reader.readLine()) != null) {sb.append(line);}} catch (IOException e) {throw new IOException("读取返回支付接口数据流出现异常!");} finally {reader.close();}return sb.toString();}
}
Controller代码如下:package me.zhengjie.modules.api.rest;import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSONObject;
import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAAutoCertificateConfig;
import com.wechat.pay.java.core.exception.ServiceException;
import com.wechat.pay.java.core.notification.NotificationConfig;
import com.wechat.pay.java.core.notification.NotificationParser;
import com.wechat.pay.java.core.notification.RequestParam;
import com.wechat.pay.java.service.payments.jsapi.JsapiService;
import com.wechat.pay.java.service.payments.jsapi.model.Amount;
import com.wechat.pay.java.service.payments.jsapi.model.Payer;
import com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest;
import com.wechat.pay.java.service.payments.jsapi.model.PrepayResponse;
import com.wechat.pay.java.service.payments.model.Transaction;
import com.wechat.pay.java.service.refund.RefundService;
import com.wechat.pay.java.service.refund.model.AmountReq;
import com.wechat.pay.java.service.refund.model.CreateRequest;
import com.wechat.pay.java.service.refund.model.Refund;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import me.zhengjie.annotation.AnonymousAccess;
import me.zhengjie.annotation.Log;
import me.zhengjie.config.FileProperties;
import me.zhengjie.exception.BadRequestException;
import me.zhengjie.modules.api.service.WeChatPayService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;@Slf4j
@RestController
@RequiredArgsConstructor
@Api(tags = "1.微信小程序")
@RequestMapping("/api/weChatPay")
public class WeChatPayContoller {private final WeChatPayService weChatPayService;private final FileProperties fileProperties;/*** appID*/@Value("${wx.appId}") // 可自己写死--我引用的是自己写的配置内(写死的方式如:appId=wx12345678910)public String appId;/*** 商户号*/@Value("${wx.merchantId}") // 可自己写死public String merchantId;/*** 商户API私钥路径*/@Value("${wx.privateKeyPath}") //可自己写死public String privateKeyPath;/*** 商户证书序列号*/@Value("${wx.merchantSerialNumber}") // 可自己写死public String merchantSerialNumber;/*** 商户APIV3密钥*/@Value("${wx.apiV3key}") //可自己写死public String apiV3key;/*** 商户平台证书路径*/@Value("${wx.certPath}") // 可自己写死public String certPath;/*** 商户平台证书路径p12*/@Value("${wx.certP12Path}") //可自己写死public String certP12Path;private static Map<String, Config> configMap = new HashMap<>();private static Config config = null;private static JsapiService service = null;private static RefundService refundService = null;/*** JSAPI 测试下单接口*/@PostMapping(value = "/ceshiJSAPI")@Log("JSAPI 测试下单接口")@ApiOperation("JSAPI 测试下单接口")@AnonymousAccess@Transactional(rollbackFor = Exception.class)public JSONObject ceshiJSAPI() throws Exception {if (config == null) {config =new RSAAutoCertificateConfig.Builder().merchantId(merchantId).privateKeyFromPath(privateKeyPath).merchantSerialNumber(merchantSerialNumber).apiV3Key(apiV3key).build();}if (service == null) {service = new JsapiService.Builder().config(config).build();}// request.setXxx(val)设置所需参数,具体参数可见Request定义PrepayRequest request = new PrepayRequest();Amount amount = new Amount();amount.setTotal(1);//金额,1为0.01元request.setAmount(amount);request.setAppid(appId);request.setMchid(merchantId);request.setDescription("测试商品标题");//下单标题request.setNotifyUrl("https://www.ceshi123.com/api/weChatPay/ceshiPayNotify");//要求必须为线上接口String ddh = weChatPayService.getRandomString(20);request.setOutTradeNo(ddh);//订单号Payer payer = new Payer();payer.setOpenid("oMr**********");//openidrequest.setPayer(payer);PrepayResponse response = service.prepay(request);JSONObject result = new JSONObject();Long date = new Date().getTime();//获取当前时间戳String nonceStr = weChatPayService.getRandomString(28);//随机字符串,长度为32个字符以下result.put("timeStamp", date.toString());//时间戳result.put("nonceStr", nonceStr);//随机字符串,长度为32个字符以下result.put("package", "prepay_id=" + response.getPrepayId());//PrepayIdresult.put("signType", "RSA");//签名类型result.put("paySign", weChatPayService.getSign(appId, date, nonceStr, "prepay_id=" + response.getPrepayId()));//签名return result;}/*** 测试微信支付结果回调地址(放入线上测试)** @param*/@PostMapping(value = "/ceshiPayNotify")@Log("ceshiPayNotify方法")@ApiOperation("ceshiPayNotify方法")@AnonymousAccesspublic void ceshi_payNotify(HttpServletRequest request) throws IOException {//微信返回的证书序列号String serialNo = request.getHeader("Wechatpay-Serial");//微信返回的随机字符串String nonceStr = request.getHeader("Wechatpay-Nonce");//微信返回的时间戳String timestamp = request.getHeader("Wechatpay-Timestamp");//微信返回的签名String wechatSign = request.getHeader("Wechatpay-Signature");String singType = request.getHeader("Wechatpay-Signature-Type");String collect = request.getReader().lines().collect(Collectors.joining());try {FileUtil.writeUtf8String(collect, fileProperties.getPath().getPath() + "/huidiao-collect.txt");//打印看效果FileUtil.writeUtf8String(serialNo, fileProperties.getPath().getPath() + "/huidiao-serialNo.txt");//打印看效果FileUtil.writeUtf8String(singType, fileProperties.getPath().getPath() + "/huidiao-Signature-Type.txt");//打印看效果FileUtil.writeUtf8String(nonceStr, fileProperties.getPath().getPath() + "/huidiao-nonceStr.txt");//打印看效果FileUtil.writeUtf8String(timestamp, fileProperties.getPath().getPath() + "/huidiao-timestamp.txt");//打印看效果FileUtil.writeUtf8String(wechatSign, fileProperties.getPath().getPath() + "/huidiao-wechatSign.txt");//打印看效果//TODO 业务校验---可以写入自己的业务逻辑} catch (Exception e) {System.out.println("e = " + e);FileUtil.writeUtf8String("22222222222222222222", fileProperties.getPath().getPath() + "/huidiao22.txt");//打印看效果}}/*** 微信支付结果回调地址(本地)** @param request* @return*/@PostMapping(value = "/payNotify")@AnonymousAccess@Transactional(rollbackFor = Exception.class)public ResponseEntity<Object> wxCallback(HttpServletRequest request) throws Exception {//获取报文String body = weChatPayService.getRequestBody(request);//随机串String nonce = request.getHeader("Wechatpay-Nonce");//微信传递过来的签名String signature = request.getHeader("Wechatpay-Signature");//证书序列号(微信平台)String wechatPaySerial = request.getHeader("Wechatpay-Serial");String singType = request.getHeader("Wechatpay-Signature-Type");//时间戳String timestamp = request.getHeader("Wechatpay-Timestamp");if (configMap.get("config") == null) {config = new RSAAutoCertificateConfig.Builder().merchantId(merchantId).privateKeyFromPath(privateKeyPath).merchantSerialNumber(merchantSerialNumber).apiV3Key(apiV3key).build();configMap.put("config", config);}else {config = configMap.get("config");}NotificationParser parser = new NotificationParser((NotificationConfig) config);RequestParam.Builder builder = new RequestParam.Builder();builder.body(body);builder.signature(signature);builder.nonce(nonce);builder.timestamp(timestamp);builder.serialNumber(wechatPaySerial);builder.signType(singType);RequestParam requestParam = builder.build();Transaction parse = parser.parse(requestParam, Transaction.class);if ("SUCCESS".equals(parse.getTradeState().toString())) {//支付成功,你的业务逻辑return new ResponseEntity<>(HttpStatus.OK);} else {throw new BadRequestException( "支付失败");}}/** 测试退款申请* @return*/@PostMapping(value = "/ceshiRefund")@Log("JSAPI 测试退款接口")@ApiOperation("JSAPI 测试退款接口")@AnonymousAccess@Transactional(rollbackFor = Exception.class)public JSONObject ceshiRefund(String No) throws Exception {if (config == null) {config = new RSAAutoCertificateConfig.Builder().merchantId(merchantId).privateKeyFromPath(privateKeyPath).merchantSerialNumber(merchantSerialNumber).apiV3Key(apiV3key).build();}if (refundService == null) {// 初始化服务refundService = new RefundService.Builder().config(config).build();}CreateRequest request = new CreateRequest();request.setOutTradeNo(No);//商户订单号request.setOutRefundNo(weChatPayService.getRandomString(16));//商户退款单号,随机生成request.setReason("取消订单的退款");//退款原因AmountReq amount = new AmountReq();//金额信息amount.setRefund(Long.parseLong("1"));//退款金额(0.01元)amount.setTotal(Long.parseLong("1"));//原订单退款金额(0.01元)amount.setCurrency("CNY");//人民币request.setAmount(amount);// request.setNotifyUrl("https://https://www.ceshi123.com/api/weChatPay/ceshiRefundNotify");//回调接口,退款时非必填--这里我就没写接口JSONObject result = new JSONObject();try {Refund response = refundService.create(request);result.put("code", "SUCCESS");result.put("message", "退款成功");return result;} catch (ServiceException e) { // 服务返回状态小于200或大于等于300,例如500// 调用e.getResponseBody()获取返回体打印日志或上报监控,更多方法见ServiceException定义return JSONObject.parseObject(e.getResponseBody());}}}
相关文章:
java接入apiv3微信小程序支付(以java的eladmin框架为例)
一、需要准备的资料 1.小程序AppID 如:wx2e56f5****** 2.商户号 如:1641****** 3.商户API私钥路径:什么是商户API证书?如何获取商户API证书? 获取文件如下图: 如: 本地路径:E:\Env\e…...
第19节-PhotoShop基础课程-历史记录画笔工具
文章目录 前言1.历史记录画笔工具1.从当前状态创建文档2.创建新快照 2.历史记录艺术画笔工具 前言 任何记录都会被记录下来,并且可以拍快照,从历史中恢复,特别适合艺术创作的孩子 1.历史记录画笔工具 不只是画笔,所有操作记录都…...
MongoDB常用的比较符号和一些功能符号
比较符号 results collection.find({age: {$gt: 20}})功能符号 results collection.find({name: {$regex: ^M.*}})...
网络安全(黑客)技术自学
前言 一、什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有攻与防…...
C++ 引用
C 引用 引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。 C 引用 vs 指针 引用很容易与指针混淆,它们之间有三个主要的不同:…...
9.1.tensorRT高级(4)封装系列-自动驾驶案例项目self-driving-道路分割分析
目录 前言1. 道路分割总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍,顺便记记笔记。 本次课程学习 tensorRT 高级-自动驾驶案例项目self-driving-道路分…...
稳定的 Glance 来了,安卓小部件有救了!
稳定的 Glance 来了,安卓小部件有救了! 稳定版本的 Glance 终于发布了,来一起看看吧,看看这一路的旅程,看看好用么,再看看如何使用! 前世今生 故事发生在两年的一天吧,其实夸张了…...
用友U8与MES系统API接口对接案例分析
企业数字化转型:轻易云数据集成平台助力 U8 ERPMES 系统集成 为什么选择数字化转型? 领导层对企业资源规划(ERP)的深刻理解促使了数字化转型的启动。采用精确的“N5”滚动计划,为供应商提供充分的预期信息,…...
web UI自动化介绍
文章目录 一、web UI自动化介绍1.1 执行UI自动化测试前提1.2 Selenium介绍以及知识点梳理 二、Selenium 学习2.1 基础2.1.1 环境安装与基础使用2.1.2 web浏览器控制2.1.3 常见控件的八大定位方式2.1.3.1 八大定位方式介绍2.1.3.2 NAME、ID定位2.1.3.3 css_selector定位2.1.3.4 …...
小米13Pro/13Ultra刷面具ROOT后激活LSPosed框架微X模块详细教程
喜欢买小米手机,很多是因为小米手机的开放,支持root权限,而ROOT对普通用户来说更多的是刷入DIY模块功能,今天ROM乐园小编就教大家如何使用面具ROOT,实现大家日常情况下非常依赖的微X模块功能,体验微X模块的…...
文盘Rust -- 给程序加个日志 | 京东云技术团队
日志是应用程序的重要组成部分。无论是服务端程序还是客户端程序都需要日志做为错误输出或者业务记录。在这篇文章中,我们结合log4rs聊聊rust 程序中如何使用日志。 log4rs类似java生态中的log4j,使用方式也很相似 log4rs中的基本概念 log4rs 的功能组件也由 appe…...
C语言深入理解指针(非常详细)(五)
目录 回调函数qsort使用举例qsort函数的模拟实现sizeof和strlen的对比sizeofstrlensizeof和strlen的对比一道关于sizeof的题 回调函数 回调函数就是一个通过函数指针调用的函数 如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指…...
[docker]笔记-portainer的安装
1、portainer是一款可视化的容器管理软件,利用portainer可以轻松方便的管理和创建容器。portainer本身是一个容器,完全免费并且具有汉化版。本文介绍portainer的安装和使用。 2、安装好容器并配置好容器环境,可参照https://blog.csdn.net/bl…...
详解TCP/IP的三次握手和四次挥手
文章目录 前言一、TCP/IP协议的三次握手1.1 三次握手流程 二、TCP/IP的四次挥手2.1 四次挥手流程 三、主要字段3.1、标志位(Flags)3.2、序号(sequence number)3.3、确认号(acknowledgement number) 四、状态…...
YOLOv5算法改进(16)— 增加小目标检测层
前言:Hello大家好,我是小哥谈。小目标检测层是指在目标检测任务中用于检测小尺寸目标的特定网络层。由于小目标具有较小的尺寸和低分辨率,它们往往更加难以检测和定位。YOLOv5算法的检测速度与精度较为平衡,但是对于小目标的检测效…...
蓝桥杯官网练习题(图像模糊)
题目描述 小蓝有一张黑白图像,由 nm 个像素组成,其中从上到下共 n 行,每行从左到右 �m 列。每个像素由一个 0 到 255 之间的灰度值表示。 现在,小蓝准备对图像进行模糊操作,操作的方法为: 对…...
使用鳄鱼指标和ADX开立空头的条件,3秒讲清楚
使用鳄鱼指标和ADX开立空头的条件其实很简单,anzo capital昂首资本3秒钟讲清楚。 首先,市场行情需呈水平状态。再者,均线体系开始向上发散,给出明确的信号。最后,ADX确认该信号,要求指数上涨20%以上&#…...
RabbitMQ死信队列与延迟队列
目录 死信队列 死信队列的定义 死信队列的应用场景 死信队列的作用 死信队列架构图 死信队列代码实现 延迟队列 延迟队列的定义 延迟队列的应用场景 延迟队列的作用 延迟队列架构图 延迟队列的代码实现 死信队列 死信队列的定义 死信队列(Dead Letter …...
存储管理呀
世界太吵,别听,别看,别管,别怕,向前走 一. 存储管理 初识硬盘 机械 HDD 固态 SSDSSD的优势 SSD采用电子存储介质进行数据存储和读取的一种技术,拥有极高的存储性能,被认为是存储技术发展的未来…...
学习 BeautifulSoup 库从入门到精通
可以按照以下步骤进行: 1. 安装 BeautifulSoup: 首先,确保你已经安装了 Python。然后可以使用 pip 命令来安装 BeautifulSoup 库。在命令行中输入以下命令: pip install beautifulsoup42. 导入 BeautifulSoup: 在 …...
JavaScript基础知识总结
目录 一、js代码位置 二、变量与数据类型 1、声明变量 2、基本类型(7种基本类型) 1、undefined和null 2、String ⭐ 模板字符串(Template strings) 3、number和bigint ⭐ 4、boolean ⭐ 5、symbol 3、对象类型 1、Fun…...
技术面试与HR面:两者之间的关联与区别
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
【Redis】为什么要学 Redis
文章目录 前言一、Redis 为什么快二、Redis 的特性2.1 将数据储存到内存中2.2 可编程性2.3 可扩展性2.4 持久性2.5 支持集群2.6 高可用性 三、Redis 的应用场景四、不能使用 Redis 的场景 前言 关于为什么要学 Redis 这个问题,一个字就可以回答,那就是&…...
动静态库生成使用
🔥🔥 欢迎来到小林的博客!! 🛰️博客主页:✈️林 子 🛰️博客专栏:✈️ Linux 🛰️社区 :✈️ 进步学堂 🛰…...
LLVM编译安装
LLVM编译安装 #全量下载 git clone https://github.com/llvm/llvm-project.git #只下载最新commit版本 git clone --depth 1 https://github.com/llvm/llvm-project.git#配置 #!/bin/bash set -ex cmake -S llvm -B build -DCMAKE_INSTALL_PREFIX/data0/huozai/software/insta…...
表的内连接和外连接
表的连接是SQL中的一种操作,用于将两个或多个表中的数据按照某个条件进行关联。 内连接 使用内连接将两个表(Table1 和 Table2)进行连接: select * from Table1 inner join Table2 on Table1.id Table2.id;举例: -- 用普通的写法 select…...
三、C#—变量,表达式,运算符(3)
🌻🌻 目录 一、变量1.1 变量1.2 使用变量的步骤1.3 变量的声明1.4 变量的命名规则1.5 变量的初始化1.6 变量初始化的三种方法1.7 变量的作用域1.8 变量使用实例1.9 变量常见错误 二、C#数据类型2.1 数据类型2.2 值类型2.2.1 值类型直接存储值2.2.2 简单类…...
纷享销客受邀出席CDIE2023数字化创新博览会 助力大中型企业增长
2023年,穿越周期,用数字化的力量重塑企业经营与增长的逻辑,再次成为企业数字化技术应用思考的主旋律,以数字经济为主线,数字技术融入产业发展与企业增长为依据,推动中国企业数字化升级。 9月5日,…...
linux下qt交叉编译 tslib 库
在 Linux 下进行 Qt 的交叉编译,并包含 tslib 库,可以按照以下步骤进行操作:1. 准备交叉编译工具链:首先,你需要准备适用于目标平台的交叉编译工具链。这个工具链包括交叉编译器、 2. 链接器和其他相关的工具ÿ…...
2.13 PE结构:实现PE代码段加密
代码加密功能的实现原理,首先通过创建一个新的.hack区段,并对该区段进行初始化,接着我们向此区段内写入一段具有动态解密功能的ShellCode汇编指令集,并将程序入口地址修正为ShellCode地址位置处,当解密功能被运行后则可…...
wordpress 数据库连接文件/郑州高端网站制作
flutter 运行别人项目 包无法导入报错:Target of URI doesnt exist package:flutter/material.dart 解决方法参考文章: (1)flutter 运行别人项目 包无法导入报错:Target of URI doesnt exist package:flutter/materia…...
张店党风廉政建设网站/百度收录刷排名
题库来源:安全生产模拟考试一点通公众号小程序 2020年美容师(中级)考试题及美容师(中级)多少分及格,包含美容师(中级)考试题答案和解析及美容师(中级)多少分…...
哪个网站做3d模型/b2b免费推广网站
为什么80%的码农都做不了架构师?>>> 计算机网络知识 讲述计算机网络的最经典的当属Andrew S.Tanenbaum的《计算机网络》第五版,这本书难易适中。 目前已经是第五版,本书作者80年代就开发出MINIX,是一个用于…...
研发网站要多长时间/搜索引擎优化的分类
此文是依据赵磊在【QCON高可用架构群】中的分享内容整理而成。转载请事先联系赵磊及相关编辑。 赵磊,Uber高级project师,08年上海交通大学毕业。曾就职于微软。后添加Facebook主要负责Messenger的后端消息服务。这个系统在当时支持Facebook全球5亿人同一…...
怎么做bs网站/怎样做百度推广网页
点击上方“蓝色字”可关注我们!暴走时评:日本银行控股和金融服务公司三菱UFJ金融集团(MUFG)在11月9日的声明中表示,将使用Ripple(XRP)为巴西创建一项新的跨境支付服务。MUFG将与巴西的Banco Bra…...
网站销售怎么做/百度热搜榜排行
阅读本文大概需要 3 分钟,挑书可能需要很多分钟。六一八来了,现在各大平台都开始促销了,作为一名程序员,除了自己买一些大件和帮女朋友疯狂抢购,最好的选择就是买书好好学习技术了。关注我的朋友可能很多都是学习 Java…...