【微信公众号】微信 jsapi 支付大概流程

article/2025/9/13 20:17:17

文章目录

  • 一、个人对微信 jsapi 支付的介绍
  • 二、微信支付需要的数据库表(例子)
    • 1. 订单表
    • 2. 支付信息表
      • 3. 退款信息表
  • 三、微信支付必须的参数(配置文件)
  • 四、WxPayConfig.java
    • 1. MAVEN 依赖
    • 2. Java 代码(商户私钥、签名验证...)
      • (1)getPrivateKey
      • (2)getVerifier
      • (3)getWxPayClient
  • 五、工具类相关
    • 1. WxPayUtil

一、个人对微信 jsapi 支付的介绍

  • jsapi 支付可运用于微信小程序和 h5
  • jsapi 支付不会弹出二维码(这点与 native 支付不同)
  • jsapi 支付运用于移动端
  • native 支付运用于 PC 端

🔥 微信支付需要商家申请商户号,商务号需要和小程序或公众号(服务号)进行绑定
💦 在微信商务平台可开通 native 支付、jsapi 支付或其他支付方式
🔥 在微信商务平台能够获取到:mch_id(商户号)、
💦 在微信商务平台可配置 API v3 密钥(主要用于平台证书解密、回调信息解密)
🔥 下载并配置商户证书(获取证书序列号和商户私钥 ➡️ apiclient_key.pem)
💦 设置支付授权目录
🔥 设置授权域名

上述操作的详细步骤都可在下面的链接中找到:
https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_1.shtml

二、微信支付需要的数据库表(例子)

1. 订单表

订单表应与一个【用户表】关联,进而得知是那个用户创建的订单?进而得知某某用户创建的订单的支付情况。

CREATE TABLE `pay_order` (`id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '订单 id',`title` varchar(256) DEFAULT NULL COMMENT '订单标题',`order_no` varchar(50) DEFAULT NULL COMMENT '商户订单编号',`user_id` bigint(20) DEFAULT NULL COMMENT '用户 id', `total_fee` int(11) DEFAULT NULL COMMENT '订单金额(分)', `order_status` varchar(10) DEFAULT NULL COMMENT '订单状态',`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

2. 支付信息表

该表中的字段大多来自微信商户平台返回的支付通知。该表记录的是微信商户平台对该笔账单的支付情况。

CREATE TABLE `payment_info` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '支付记录 id',`order_no` varchar(50) DEFAULT NULL COMMENT '商户订单编号',`transaction_id` varchar(50) DEFAULT NULL COMMENT '支付系统交易编号',`payment_type` varchar(20) DEFAULT NULL COMMENT '支付类型',`trade_type` varchar(20) DEFAULT NULL COMMENT '交易类型',`trade_state` varchar(50) DEFAULT NULL COMMENT '交易状态',`payer_total` int(11) DEFAULT NULL COMMENT '支付金额(分)',`content` text COMMENT '通知参数',`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

3. 退款信息表

当用户支付的时候,需要创建一个【退款订单】,用于记录退款情况。

CREATE TABLE `refund_info` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '退款单 id',`order_no` varchar(50) DEFAULT NULL COMMENT '商户订单编号',`refund_no` varchar(50) DEFAULT NULL COMMENT '商户退款单编号',`refund_id` varchar(50) DEFAULT NULL COMMENT '支付系统退款单号',`total_fee` int(11) DEFAULT NULL COMMENT '原订单金额(分)',`refund` int(11) DEFAULT NULL COMMENT '退款金额(分)',`reason` varchar(50) DEFAULT NULL COMMENT '退款原因',`refund_status` varchar(10) DEFAULT NULL COMMENT '退款状态',`content_return` text COMMENT '申请退款返回参数',`content_notify` text COMMENT '退款结果通知参数',`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

三、微信支付必须的参数(配置文件)

wechat:mch-id: 1736608159mch-serial-no: 99A92506FC7B6BE2DA2F3F87898FFFF1C1D3811Aprivate-key-path: apiclient_key.pemapi-v3-key: 312f0ebadc062813ebc6812325fc2f23appid: wx60aa253aa13aaeb6domain: https://api.mch.weixin.qq.comnotify-domain: https://helloboy.roroam.comapp-secret: a712223142566a78a7beced6eff3ge59

✏️ 【mch-id】: 商户号(商家申请商户号后,可让管理员登录微信商户平台查看)

✏️ 【mch-serial-no】: 证书序列号(某些情况下,将需要更新密钥对和证书。为了保证更换过程中不影响 API 的使用,请求和应答的 HTTP 头部中包括证书序列号 ,以声明签名或者加密所用的密钥对和证书。)

✏️ 【private-key-path】: 商户 API 私钥文件路径(商户申请商户 API 证书时,会生成商户私钥,并保存在本地证书文件夹的文件 apiclient_key.pem 中。)
私钥和证书:https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay3_1.shtml

✏️ 【api-v3-key】: APIV3 秘钥(主要用于平台证书解密、回调信息解密)具体使用:证书和回调报文解密https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_2.shtml

✏️ 【appid】: 小程序或服务号的唯一标识(调用 jsapi 的下单接口时需要、前端 JS 方法调起支付的时候需要)

✏️ 【domain】: domain 是域名的意思(在此表示向微信商户平台发起请求的路径的基本路径

jsapi 下单接口:https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi
查询订单接口: https://api.mch.weixin.qq.com/v3/pay/transactions/id/{transaction_id}
关闭订单接口:https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/{out_trade_no}/close
申请退款接口:https://api.mch.weixin.qq.com/v3/refund/domestic/refunds
…(很多微信商务平台的接口的基本地址都是一样的,将它抽取为 domain)

✏️ 【notify_domain】: 通知域名(用户下单之后、退款之后,微信商户平台会向我们的商户系统返回通知 ➖ 告诉我们用户的支付情况或退款单的退款情况)【这个通知域名必须是外网能够访问得到的,可以是 ngrok 地址】

✏️ 【app_secret】: app 密码(在小程序或公众号中能够找到,可通过它向微信系统获取用户的 openid)【openid 用户的唯一标识】

四、WxPayConfig.java

第三节的配置文件中的内容大多都是为 WxPayConfig 而服务,下面把 WxPayConfig.java 中的代码拷贝如下,并做简单介绍(深层次的东西我不懂
在使用 Java 代码前,先引入一些 MAVEN 依赖,免得报错

1. MAVEN 依赖

🎈 微信支付 apiv3 开发工具包

  <!-- 微信支付 SDK(software development kit) --><dependency><groupId>com.github.wechatpay-apiv3</groupId><artifactId>wechatpay-apache-httpclient</artifactId><version>0.3.0</version></dependency>

🎈 谷歌的 JSON 处理工具(可进行 JSON 字符串和 Java 对象的转换)

  <!--google 的 JSON 处理依赖--><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId></dependency>

🎈 简单易用的缓存框架

  <!-- EhCache 缓存框架 --><dependency><groupId>org.ehcache</groupId><artifactId>ehcache</artifactId></dependency>

2. Java 代码(商户私钥、签名验证…)

@Slf4j
@Component
@Data
@ConfigurationProperties("wechat")
public class WxPayConfig implements ApplicationContextAware {private static WxPayConfig wxPayConfig;// 商户号private String mchId;// 商户API证书序列号private String mchSerialNo;// 商户私钥文件private String privateKeyPath;// APIv3密钥private String apiV3Key;// 应用的唯一标识private String appid;// 微信服务器地址private String domain;// 接收结果通知地址private String notifyDomain;private String appSecret;public static WxPayConfig getInstance() {return wxPayConfig;}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {wxPayConfig = this;}/*** 获取商户私钥** @param privateKeyPath 私钥文件所在路径* @return 私钥*/public PrivateKey getPrivateKey(String privateKeyPath) {try {return PemUtil.loadPrivateKey(new FileInputStream(privateKeyPath));} catch (Exception e) {e.printStackTrace();throw new IllegalArgumentException("私钥文件不存在(可能是私钥文件路径错误)");}}/*** 获取签名验证器* 签名验证器: 用于验签的对象*/@Beanpublic ScheduledUpdateCertificatesVerifier getVerifier() {// 获取商户私钥PrivateKey privateKey = getPrivateKey(privateKeyPath);// 私钥签名对象PrivateKeySigner privateKeySigner = new PrivateKeySigner(mchSerialNo, privateKey);//身份认证对象WechatPay2Credentials wechatPay2Credentials = new WechatPay2Credentials(mchId, privateKeySigner);// 使用定时更新的签名验证器,不需要传入证书ScheduledUpdateCertificatesVerifier verifier = new ScheduledUpdateCertificatesVerifier(wechatPay2Credentials,apiV3Key.getBytes(StandardCharsets.UTF_8));return verifier;}/*** 获取微信远程 http 请求对象** @param verifier 签名验证器*/@Bean(name = "wxPayClient")public CloseableHttpClient getWxPayClient(ScheduledUpdateCertificatesVerifier verifier) {WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create().withMerchant(mchId, mchSerialNo, getPrivateKey(privateKeyPath)).withValidator(new WechatPay2Validator(verifier));return builder.build();}/*** 【签名】使用字段 appId、timeStamp、nonceStr、package 计算得出的签名值* appId: 应用的唯一标识* timeStamp: 时间戳* nonceStr: 随机字符串* package: 订单详情扩展字符串 (形如:"prepay_id=wx32j43k1kj5li1o")* <p>* 官方文档链接:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_4.shtml#menu1** @return 签名值*/public static String createSignVal(String prepayId, String timeStampStr, String nonceStr) {// 构建签名串String signString = buildSignString(prepayId, timeStampStr, nonceStr);// 计算签名值String signVal = calculateSignVal(signString);return signVal;}/*** 计算签名值【下面是官方说明】* 绝大多数编程语言提供的签名函数支持对签名数据进行签名* <p>* 强烈建议商户调用该类函数, 使用【商户私钥】对【待签名串】进行【SHA256 with RSA】签名* 并对签名结果进行 Base64 编码得到签名值** @param signStr 待签名字符串* @return 签名值*/private static String calculateSignVal(String signStr) {try {// Signature: java 提供的用来为应用程序提供数字签名算法功能的类(数字签名用于确保数字数据的验证和完整性)// Signature: java.securitySignature signature = Signature.getInstance("SHA256withRSA");// 初始化签名(官方要求使用商户私钥对待签名串进行 SHA256 with RSA 签名PrivateKey privateKey = WxPayConfig.getInstance().getPrivateKey(WxPayConfig.getInstance().getPrivateKeyPath());signature.initSign(privateKey);// 将数据添加到签名signature.update(signStr.getBytes(StandardCharsets.UTF_8));// 计算签名byte[] signRes = signature.sign();// 对签名结果(signRes)进行 Base64 编码// Base64 是 java.util 里面的类return Base64.getEncoder().encodeToString(signRes);} catch (Exception e) {e.printStackTrace();log.error("计算签名值出错:WxUtil - calculateSignVal");return null;}}/*** 【该方法服务于 createSignVal 方法】* 构造签名串【下面是官方说明】* 创建签名串:签名串一共有四行, 每一行为一个参数。行尾以【\n (换行符, ASCII 编码值为 0x0A) 结束】, 包括最后一行* 如果参数本身以【\n】结尾, 也需要附加一个【\n】* <p>* 签名格式内容:appid、timeStamp、nonceStr、package** @param prepayId 预支付 id (调用 JSAPI 下单后可获得它的值)* @return 签名字符串*/private static String buildSignString(String prepayId, String timeStampStr, String nonceStr) {return WxPayConfig.getInstance().getAppid() + "\n"+ timeStampStr + "\n"+ nonceStr + "\n"+ "prepay_id=" + prepayId + "\n"; // 一定要拼接一个【prepay_id】字符串, 之前一直无法支付成功就是这里有问题}}

上面代码中核心且复杂的方法有三个:

(1)getPrivateKey

📗 getPrivateKey:获取商户私钥(个人理解:对数据进行解密操作,公钥加密,私钥解密)【我不是很懂,大概知道一点点】

privateKeyPath 是商户私钥文件所在路径(一般都是放在类路径),使用 PemUtil 工具(来自 com.wechat.pay.contrib.apache.httpclient.util 包)加载 privateKeyPath 路径的商户私钥文件,并返回 PrivateKey 对象

    /*** 获取商户私钥** @param privateKeyPath 私钥文件所在路径* @return 私钥*/public PrivateKey getPrivateKey(String privateKeyPath) {try {return PemUtil.loadPrivateKey(new FileInputStream(privateKeyPath));} catch (Exception e) {e.printStackTrace();throw new IllegalArgumentException("私钥文件不存在(可能是私钥文件路径错误)");}}

(2)getVerifier

📗 getVerifier:获取签名验证器(个人理解:就是一个被人封装好的,用于验证签名的对象)。该方法中会使用到很多熟悉的东西,如:privateKeyPath(商户私钥文件路径)、mchSerialNo(证书序列号)、privateKey(私钥对象)、mchId(商户号)。签名验证器(Verifier)是一个帮助开发者对网络请求进行签名验证的东西,是被人封装好的,开发者直接使用它进行验签即可。

验证签名的作用:① 增加完整性校验(保证数据的来源和完整性);② 增加保密性

   /*** 获取签名验证器* 签名验证器: 用于验签的对象*/@Beanpublic ScheduledUpdateCertificatesVerifier getVerifier() {// 获取商户私钥PrivateKey privateKey = getPrivateKey(privateKeyPath);// 私钥签名对象PrivateKeySigner privateKeySigner = new PrivateKeySigner(mchSerialNo, privateKey);// 身份认证对象WechatPay2Credentials wechatPay2Credentials = new WechatPay2Credentials(mchId, privateKeySigner);// 使用定时更新的签名验证器,不需要传入证书ScheduledUpdateCertificatesVerifier verifier = new ScheduledUpdateCertificatesVerifier(wechatPay2Credentials,apiV3Key.getBytes(StandardCharsets.UTF_8));return verifier;}

(3)getWxPayClient

📗 getWxPayClient:CloseableHttpClient 对象是微信支付平台推荐的实现远程 HTTP 请求的对象。SpringBoot 项目启动后,会创建 CloseableHttpClient 对象的实例(把它的实例放入 IoC 容器)。后期我们需要向微信商务平台发送网络请求(如:下单、退款、关单…)的时候就使用 IoC 容器里面的 CloseableHttpClient 对象。

创建它的实例需要签名验证器作为参数。代码内部也要使用到商户号、证书序列号和商户秘钥。

官方地址:https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay
/wechatpay6_0.shtml
在这里插入图片描述

   /*** 获取微信远程 http 请求对象** @param verifier 签名验证器*/@Bean(name = "wxPayClient")public CloseableHttpClient getWxPayClient(ScheduledUpdateCertificatesVerifier verifier) {WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create().withMerchant(mchId, mchSerialNo, getPrivateKey(privateKeyPath)).withValidator(new WechatPay2Validator(verifier));return builder.build();}

五、工具类相关

1. WxPayUtil

该类中有五个方法,我简单说明一下,后期都会使用到。
⛄️ ① notifyCiphertext2plainText:把通知密文转换为明文。(用户支付之后成功和商户系统退款成功之后)

/*** 用于创建订单(支付订单、退款订单)编号*/
public class WxPayUtil {/*** 通知密文(ciphertext)转明文** @param notifyMap 包含进行解密所需的参数* @return 明文*/public static String notifyCiphertext2plainText(Map notifyMap) {try {// resource: 通知数据Map notifyData = (Map) notifyMap.get("resource");// 数据密文String ciphertext = (String) notifyData.get("ciphertext");// 附加数据String associatedData = (String) notifyData.get("associated_data");// 随机串String nonce = (String) notifyData.get("nonce");// 创建解密对象AesUtil aesUtil = new AesUtil(WxPayConfig.getInstance().getApiV3Key().getBytes());return aesUtil.decryptToString(associatedData.getBytes(),nonce.getBytes(StandardCharsets.UTF_8), ciphertext);} catch (Exception e) {e.printStackTrace();throw new IllegalArgumentException("微信支付通知密文转密文出现错误");}}/*** 生成支付订单编号*/public static String generatePayOrderNumber() {return "ORDER_" + generateNumber();}/*** 生成退款订单编号*/public static String generateRefundNumber() {return "REFUND_" + generateNumber();}/*** 生成订单编号*/private static String generateNumber() {SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");String newDate = sdf.format(new Date());StringBuilder result = new StringBuilder();Random random = new Random();for (int i = 0; i < 3; i++) {result.append(random.nextInt(10));}return newDate + result + UUID.randomUUID().toString().substring(0, 5);}/*** 获取当前时间字符串** @return 当前时间字符串*/public static String getCurTimeStr() {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");return sdf.format(new Date()).toString();}}

http://chatgpt.dhexx.cn/article/9kxTDBnW.shtml

相关文章

微信小程序支付V2版之JSAPI支付

文章目录 一、微信支付环境搭建1 企业微信小程序的开通2. 企业商户号的开通3 小程序号与商户号关联 二、微信小程序的支付流程1 JSAPI支付流程2 微信小程序获取openid3 微信小程序下单4 后台服务程序对订单的处理5 微信小程序发起支付6 支付结果的通知 三、微信支付API的使用1 …

Java实现微信支付(微信公众号JSAPI支付)

Java实现微信支付&#xff08;微信公众号JSAPI支付&#xff09; 第一步 开发环境准备 在接入微信支付之前&#xff0c;需要现在微信支付商户平台入驻&#xff0c;成为商家&#xff0c;才能继续后续的开发。 微信支付商户平台网址&#xff1a;https://pay.weixin.qq.com不过&…

微信 JSAPI 支付流程

微信支付分为5种&#xff1a; Jsapi支付&#xff0c;二维码支付&#xff0c;H5支付&#xff0c;小程序支付&#xff0c;App支付 Jsapi支付流程&#xff1a; (1) 通过oauth协议获取open_id a.第一步&#xff1a;用户同意授权&#xff0c;获取code 在确保微信公众账号拥有授权…

微信小程序微信支付《JSAPI支付》APIV3详细教程

文章目录 前提整体介绍我的maven依赖1、整体流程2、openid 的获取3、统一下单Controller&#xff08;预支付订单&#xff09;4、配置类和配置文件5、工具类6、前端接收到必要的参数&#xff0c;进行调起支付页面7、微信支付通知&#xff0c;notify_url的回调Controller8、前端小…

java对接微信支付:JSAPI支付(微信公众号支付)

本文是【微信JSAPI支付】文章&#xff0c;主要讲解商户对接微信支付&#xff0c;简洁版测试 文章目录 一、JSAPI支付接入前准备 二、代码片段 1.引入Maven依赖 2.后端业务请求接口 3.前端调起支付请求方法 总结 一、JSAPI支付接入前准备 1、JSAPI支付首先需要注册、认证一个公…

微信 JSAPI 支付流程

微信支付&#xff0c;开发文档地址&#xff1a; https://pay.weixin.qq.com/wiki/doc/api/index.html JSAPI支付文档地址&#xff1a; https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter9_2 微信支付分为5种&#xff1a; Jsapi支付&#xff0c;二维码支付&#xf…

微信公众号支付(JSAPI)

六年代码两茫茫&#xff0c;不思量&#xff0c;自难忘 6年资深前端主管一枚&#xff0c;只分享技术干货&#xff0c;项目实战分享 关注博主不迷路~ 文章目录 JSAPI支付简介应用场景支付的对接准备工作开发流程必填参数预支付统一下单公众号授权获取用户信息微信支付&#xff08…

微信支付之JSAPI支付

首先看一下&#xff0c;微信支付关于jsapi的官方文档&#xff0c;相关接口&#xff0c;一共有下单&#xff0c;查询订单&#xff0c;关闭订单&#xff0c;调起jsapi支付&#xff0c;支付结果通知&#xff0c;申请退款&#xff0c;查询单笔退款&#xff0c;退款结果通知&#xf…

微信支付JSAPI

一、什么是JSAPI支付 JSAPI支付是指商户通过调用微信支付提供的JSAPI接口&#xff0c;在支付场景中调起微信支付模块完成收款。 应用场景有&#xff1a; 线下场所&#xff1a;调用接口生成二维码&#xff0c;用户扫描二维码后在微信浏览器中打开页面后完成支付 公众号场景&…

微信支付之JSAPI支付开发流程

JSAPI支付 前言准备开发1.流程说明2.下单&#xff08;预支付&#xff09;3.前端调起支付4.支付结果异步通知5.退款申请6.退款结果异步通知 结语 前言 最近项目涉及到微信支付的功能&#xff0c;在这里简单分享下整体的开发流程,这里要介绍的是JSAPI支付。 JSAPI网页支付&#…

FME是一个好东东

FME产品分为三个层次&#xff1a; 一、入门级 1、特点&#xff1a;支持常见的GIS软件的数据交换&#xff0c;如 MapInfo TAB, DGN, DXF, DWG, SDTS, SHP, and TIGER&#xff1b;可以运行大部分函数&#xff08;Funtion和Factory&#xff09;&#xff1b;不支持由Plug-in开发的第…

黑马程序员Maven学习笔记

前言 这里是黑马程序员Maven学习笔记分享&#xff0c;这是视频链接。 我还有其它前端内容的笔记&#xff0c;有需要可以查看。 文章目录 前言基础Maven简介Maven是什么Maven的作用 Maven的下载Maven的基础概念仓库坐标本地仓库配置远程仓库的配置 第一个Maven项目Maven的项目…

MAEKDOWN

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

谷粒商城前端笔记

前端笔记 JavaScript ES6 ECMAScript6.0&#xff08;以下简称ES6&#xff0c;ECMAScript是一种由Ecma国际通过ECMA-262标准化的脚本&#xff09;&#xff0c;是JavaScript语言的下一代标准&#xff0c;2015年6月正式发布&#xff0c;从ES6开始的版本号采用年号&#xff0c;如…

谷粒商城-分布式基础【业务编写】

谷粒商城-分布式基础篇【环境准备】谷粒商城-分布式基础【业务编写】谷粒商城-分布式高级篇【业务编写】持续更新谷粒商城-分布式高级篇-ElasticSearch谷粒商城-分布式高级篇-分布式锁与缓存项目托管于gitee 一、三级分类 此处三级分类最起码得启动renren-fast、nacos、gate…

1. 谷粒商城架构

架构图 解析 客户通过任意客户端&#xff08;app/Web&#xff09;向服务器发送请求&#xff0c; 请求首先来到Nginx集群&#xff0c;Nginx将请求转交给Api网关&#xff08;SpringCloud Gateway&#xff09;, Api网关&#xff1a; 可以根据当前请求&#xff0c;动态路由到指…

谷粒商城详细笔记

前言 mysql安装在腾讯云 redis安装在本地虚拟机master上 运行时&#xff0c;renren-fast这个项目要到单独开个idea窗口打开。 一、项目简介 1、项目微服务架构图 微服务&#xff1a;拒绝大型单体应用&#xff0c;基于业务边界进行服务微化拆分&#xff0c;各个服务独立部…

谷粒商城之分布式基础(二)

6 商品服务 6.1 三级分类 商城的商品页面展示是一个三级分类的。有一级分类、二级分类、三级分类。这就是我们接下来要进行的操作。 6.1.1 数据库 首先我们在gulimall_pms这个数据库中的pms_category这个表下插入数据 商品三级分类SQL代码 6.1.2 查出所有分类及其子分类 1…

麦克

品牌&#xff1a;InvenSense Kingstate RS PRO 灵敏度&#xff1a;-27到-44db之间 方向性&#xff1a;全方位、单向性、噪声消除 标准操作电压&#xff1a;1.5V到3.3V均有 安装方式&#xff1a;导线、表面贴装、通孔 输出阻抗大小&#xff1a;1.8K、2.2K、200欧、350欧…

Kubeedge Beehive 模块源码分析

文章目录 概述结构Model --- 消息模型Header --- 消息头Router --- 消息路由资源操作资源类型 Context --- 上下文ModuleContext --- 模块上下文MessageContext --- 消息上下文GlobalContext --- 全局上下文方法 Channel Context数据结构方法ModuleContext 接口实现AddModuleAd…