Merge remote-tracking branch 'origin/master' into master

master
土豆兄弟 2 years ago
commit d425666974

@ -0,0 +1 @@
Subproject commit 40177c6c8dc8e542f046e3f6c95c356280035871

@ -0,0 +1 @@
Subproject commit e6e37cef41e56937020347e41b30357e9f1a7196

@ -0,0 +1 @@
Subproject commit 9f51525ef0f7703360f4267642f14e8e0c542bc4

@ -0,0 +1 @@
Subproject commit 0f4860a23607bdbfdf6a28414daa6b7ece0979a2

@ -0,0 +1,25 @@
# 最佳实践
## 目录介绍
- sde(Scaffold Development Evironment) 脚手架整合
- eladmin
- SpringBoot, SpringData Jpa、 JWT、Spring Security、Redis、Vue的前后端分离框架
- fast-boot
- SpringBoot、SpringSecurity、Mybatis-Plus
- guns
- SpringBoot、BootStrap
- renren-security
- SpringBoot、Shiro、MyBatis-Plus
- TODO 未来把 支付模块 广告模块 电商模块
- SCRM CRM CDP 等系统集成进来作为一个Demo级别的项目进行存在

@ -32,8 +32,8 @@
<modules>
<module>sharding-readwrite-splitting-raw-jdbc-example</module>
<module>sharding-readwrite-splitting-spring-boot-jpa-example</module>
<module>sharding-readwrite-splitting-spring-boot-mybatis-example</module>
<module>sharding-readwrite-splitting-spring-namespace-jpa-example</module>
<module>sharding-readwrite-splitting-spring-namespace-mybatis-example</module>
<!-- <module>sharding-readwrite-splitting-spring-boot-mybatis-example</module>-->
<!-- <module>sharding-readwrite-splitting-spring-namespace-jpa-example</module>-->
<!-- <module>sharding-readwrite-splitting-spring-namespace-mybatis-example</module>-->
</modules>
</project>

@ -30,7 +30,7 @@
<packaging>pom</packaging>
<modules>
<module>class-based-sharding-algorithm-example</module>
<!-- <module>class-based-sharding-algorithm-example</module>-->
<module>spi-based-sharding-algorithm-example</module>
</modules>
</project>

@ -30,9 +30,9 @@
<packaging>pom</packaging>
<modules>
<module>spi-based-sharding-raw-jdbc-example</module>
<module>spi-based-sharding-spring-boot-mybatis-example</module>
<module>spi-based-sharding-spring-namespace-jpa-example</module>
<module>spi-based-sharding-spring-boot-jpa-example</module>
<!-- <module>spi-based-sharding-raw-jdbc-example</module>-->
<!-- <module>spi-based-sharding-spring-boot-mybatis-example</module>-->
<!-- <module>spi-based-sharding-spring-namespace-jpa-example</module>-->
<!-- <module>spi-based-sharding-spring-boot-jpa-example</module>-->
</modules>
</project>

@ -0,0 +1,46 @@
### Example user template template
### Example user template
# IntelliJ project files
.idea
*.iml
out
gen
### Maven template
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
# https://github.com/takari/maven-wrapper#usage-without-binary-jar
.mvn/wrapper/maven-wrapper.jar
### Java template
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

@ -1,4 +1,116 @@
## 支付模块的代码示例
# 企业级支付全家桶设计和实战
## 1. 基本概念逻辑
### 1.1 主流支付渠道说明
- 种类
- 微信支付
- 支付宝
- 支付产品逻辑
- 微信支付
- 社交行为进行绑定的,有利于社交行为下的交易促成
- 对北方比较友好,北方人用微信支付的根基比较重
- 微商比较友好
- 对小程序生态的付款比较友好
- 支付宝支付
- 对生活服务类和理财类比较友好
- 对淘系下的支付行为比较友好
- 在南方比较受到欢迎和推崇
- 银联/云闪付
- 线下比较多
- 主要是有优惠相关的场景
- 市场份额
- 支付宝 54%
- 微信支付 40%
- 银联支付 0.4%
- 京东/美团都有0.7%以上
- 不同支付场景使用不同的支付方式
- 在微信小程序里面付款支付, 需要使用小程序支付接口
- 在微信里面打开网页进行付款要使用JSAPI支付接口
- 在手机浏览器上面使用微信付款要用H5支付接口
- 如果选用微信扫码支付,需要调用Native支付接口
### 1.2 补充研究方向
- 各种支付的资质和通道??????
- 有什么好的申请方式
- 收费情况
- 限制
## 2. 环境讲解
- 正常Java环境即可
## 3. 微信支付
### 3.1 微信支付的种类
- 付款码支付场景
- 线下消费的时候,商家通过扫码器(200-300元),扫描你的付款码完成免密支付
- 把显示的付款条码值进行输入,可以类似实现这种功能
- 付款码和收款码的区别?
- 手续费是没有去别的,付款码会有机器设备带来的一些开支
- 付款码可以接入商户系统,而收款码无法接入商户系统
- 付款码支付的接入商户系统,数据会保存在商户的管理系统后台,对交易明细进行一个良好的保存
- 小商贩不需要进行付款码,收款码即可,方便快捷
- JSAPI支付场景
- 如果用户在微信内置的浏览器里面下单支付调用微信的JSAPI支付接口即可
- 使用JS代码检测用户支付的环境
- H5支付场景
- 如果用户在手机内置浏览器里面打开电商网站下单支付需要调用的是H5支付接口
- Native支付场景
- PC端进行对接的方式
- 使用JS代码检测用户支付的环境
- 小程序支付场景
- 如果用户在微信小程序上面下单支付,那么就需要调用微信小程序支付接口
- 或者展示一个收款码,进行转账即可
- APP支付场景
- 如果用户在第三方APP上面下单支付那么就需要调用微信平台的APP支付接口
- 门槛比较高
- 刷脸支付场景
- 大型刷脸设备在(5000-6000左右),小型的在(1500-2000)左右
- 了解即可
### 3.2 开发准备
- 下载开发IDE
- https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html
- 注册微信开发者账号
- https://mp.weixin.qq.com/ (这里可以切换多个你绑定的企业账号主体,)
-
- 注册微信公众平台账号(企业身份的)
-
### 1. 支付宝对接

@ -70,7 +70,22 @@
- 可以集成控制台,修改控制台即可
- 集成SpringBoot也在这里
## 2. RocketMQ 生产者核心研究
## 2. RocketMQ 基本入门
### 2.1 生产者的使用及使用控制台查消息
1. 创建生产者对象 DefaultMQProducer (必须要对生产者组的名称进行配置)
2. 设置 NamesrvAddr
3. 设置一些需要配置的参数
4. 启动生产者服务
5. 创建消息并发送
### 2.2 消费者的使用及Broker重试机制
1. 创建消费者对象 DefaultMQPushConsumer
2. 设置NamesrvAddr及其消费位置ConsumerFromWhere
3. 进行订阅主题 subscribe
4. 注册监听并消费 registerMessageListener
### 2.3 RocketMQ - 四种集群环境构建详解

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>dev-protocol</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>rocket-api</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<!-- 指定 RocketMQ 版本 -->
<rocketmq.version>4.3.0</rocketmq.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>${rocketmq.version}</version>
</dependency>
</dependencies>
</project>

@ -0,0 +1,9 @@
package com.baiye.constants;
public class Const {
/**
* namesrv
*/
public static final String NAMESRV_ADDR = "127.0.0.1:9876";
}

@ -0,0 +1,72 @@
package com.baiye.consumer;
import com.baiye.constants.Const;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.MessageExt;
import java.nio.charset.StandardCharsets;
/**
* Demo
*/
public class Consumer {
public static void main(String[] args) throws MQClientException {
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("test_consumer_name");
consumer.setNamesrvAddr(Const.NAMESRV_ADDR);
// 设置从什么地方开始消费
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);
consumer.subscribe(
"test-topic",
"*"
);
consumer.registerMessageListener((MessageListenerConcurrently) (msgs, consumeConcurrentlyContext) -> {
MessageExt messageExt = msgs.get(0);
try {
String topic = messageExt.getTopic();
String tags = messageExt.getTags();
String keys = messageExt.getKeys();
// FIXME: 2022/7/21 模拟消息消费出现异常的情况
if ("key1".equals(keys)) {
System.out.println(" 消息消费失败 ... ");
int a = 1 / 0;
}
String msgBody = new String(messageExt.getBody(), StandardCharsets.UTF_8);
System.out.println("topic = " + topic);
System.out.println("tags = " + tags);
System.out.println("keys = " + keys);
System.out.println("msgBody = " + msgBody);
} catch (Exception e) {
e.printStackTrace();
// FIXME: 2022/7/21 允许消息最大重试次数是多少次,我这里指定为3次
int reconsumeTimes = messageExt.getReconsumeTimes();
System.out.println("reconsumeTimes = " + reconsumeTimes);
if (3 == reconsumeTimes) {
// FIXME: 2022/7/21 记录日志,做补偿处理
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
return ConsumeConcurrentlyStatus.RECONSUME_LATER;
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
});
consumer.start();
System.out.println(" consumer start ... ");
}
}

@ -0,0 +1,49 @@
package com.baiye.producer;
import com.baiye.constants.Const;
import org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.exception.RemotingException;
import java.nio.charset.StandardCharsets;
/**
* Demo
*/
public class Producer {
public static void main(String[] args) throws MQClientException, MQBrokerException, RemotingException, InterruptedException {
DefaultMQProducer producer = new DefaultMQProducer("test_producer_name");
producer.setNamesrvAddr(Const.NAMESRV_ADDR);
producer.start();
for (int i = 0; i < 10; i++) {
// 创建消息
Message message = new Message(
// 主题
"test-topic",
// 过滤
"TAG-A",
// 用户自定义的key, 唯一标识
"TAG-a",
// 消息内容
("Hello RocketMQ" + i).getBytes(StandardCharsets.UTF_8)
);
// 发送消息
SendResult sendResult = producer.send(message);
// 消息发送结果
System.out.println(sendResult);
}
// 发送消息完毕进行关闭
producer.shutdown();
}
}

@ -33,6 +33,7 @@
<module>longpolling/demo/demo1/dev-protocol-disruptor-netty-common</module>
<module>utils/dev-protocol-id</module>
<module>database/shardingsphere/dev-protocol-shardingsphere-base</module>
<module>mq/rocketmq/rocket-api</module>
</modules>
<properties>

Loading…
Cancel
Save