改造支付证书管理模块

This commit is contained in:
2025-07-26 23:06:04 +08:00
parent 361add4507
commit f6eadfc9f8
7 changed files with 568 additions and 69 deletions

354
scripts/auto-wechat-cert.sh Executable file
View File

@@ -0,0 +1,354 @@
#!/bin/bash
# 微信支付证书自动化管理脚本
# 使用RSAAutoCertificateConfig自动下载和管理证书
# 作者: 科技小王子
# 日期: 2024-07-26
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 日志函数
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 配置参数
MERCHANT_ID=""
API_V3_KEY=""
MERCHANT_SERIAL_NUMBER=""
PRIVATE_KEY_PATH=""
OUTPUT_DIR=""
# 显示使用说明
show_usage() {
echo "微信支付证书自动化管理脚本"
echo ""
echo "使用方法:"
echo " $0 auto -m <商户号> -k <APIv3密钥> -s <证书序列号> -p <私钥路径> [-o <输出目录>]"
echo " $0 test # 测试现有证书配置"
echo " $0 status # 检查证书状态"
echo ""
echo "参数说明:"
echo " -m, --merchant-id 微信支付商户号"
echo " -k, --api-v3-key APIv3密钥"
echo " -s, --serial-number 商户证书序列号"
echo " -p, --private-key 商户私钥文件路径"
echo " -o, --output-dir 输出目录(可选,默认为当前目录)"
echo ""
echo "示例:"
echo " $0 auto -m 1723321338 -k 0kF5OlPr482EZwtn9zGufUcqa7ovgxRL -s 2B933F7C35014A1C363642623E4A62364B34C4EB -p ./apiclient_key.pem"
echo ""
echo "注意:"
echo " - 此脚本使用RSAAutoCertificateConfig自动管理证书"
echo " - 无需手动下载wechatpay_cert.pem系统会自动获取"
echo " - 确保商户平台已开启API安全功能"
}
# 解析命令行参数
parse_args() {
while [[ $# -gt 0 ]]; do
case $1 in
-m|--merchant-id)
MERCHANT_ID="$2"
shift 2
;;
-k|--api-v3-key)
API_V3_KEY="$2"
shift 2
;;
-s|--serial-number)
MERCHANT_SERIAL_NUMBER="$2"
shift 2
;;
-p|--private-key)
PRIVATE_KEY_PATH="$2"
shift 2
;;
-o|--output-dir)
OUTPUT_DIR="$2"
shift 2
;;
*)
log_error "未知参数: $1"
show_usage
exit 1
;;
esac
done
}
# 验证参数
validate_args() {
if [[ -z "$MERCHANT_ID" ]]; then
log_error "缺少商户号参数 (-m)"
return 1
fi
if [[ -z "$API_V3_KEY" ]]; then
log_error "缺少APIv3密钥参数 (-k)"
return 1
fi
if [[ -z "$MERCHANT_SERIAL_NUMBER" ]]; then
log_error "缺少证书序列号参数 (-s)"
return 1
fi
if [[ -z "$PRIVATE_KEY_PATH" ]]; then
log_error "缺少私钥路径参数 (-p)"
return 1
fi
if [[ ! -f "$PRIVATE_KEY_PATH" ]]; then
log_error "私钥文件不存在: $PRIVATE_KEY_PATH"
return 1
fi
if [[ -z "$OUTPUT_DIR" ]]; then
OUTPUT_DIR="."
fi
return 0
}
# 创建Java测试程序
create_test_program() {
local test_file="WechatCertTest.java"
cat > "$test_file" << 'EOF'
import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAAutoCertificateConfig;
public class WechatCertTest {
public static void main(String[] args) {
if (args.length != 4) {
System.err.println("用法: java WechatCertTest <商户号> <私钥路径> <证书序列号> <APIv3密钥>");
System.exit(1);
}
String merchantId = args[0];
String privateKeyPath = args[1];
String serialNumber = args[2];
String apiV3Key = args[3];
try {
System.out.println("正在创建RSAAutoCertificateConfig...");
Config config = new RSAAutoCertificateConfig.Builder()
.merchantId(merchantId)
.privateKeyFromPath(privateKeyPath)
.merchantSerialNumber(serialNumber)
.apiV3Key(apiV3Key)
.build();
System.out.println("✅ 证书配置创建成功!");
System.out.println("商户号: " + merchantId);
System.out.println("证书序列号: " + serialNumber);
System.out.println("私钥路径: " + privateKeyPath);
System.out.println("");
System.out.println("🎉 RSAAutoCertificateConfig 已成功初始化");
System.out.println("📋 系统将自动管理微信支付平台证书");
System.out.println("🔄 证书过期时将自动更新");
} catch (Exception e) {
System.err.println("❌ 证书配置失败: " + e.getMessage());
e.printStackTrace();
System.exit(1);
}
}
}
EOF
echo "$test_file"
}
# 自动配置证书
auto_configure() {
log_info "开始自动配置微信支付证书..."
# 验证参数
if ! validate_args; then
exit 1
fi
log_info "配置信息:"
log_info "商户号: $MERCHANT_ID"
log_info "证书序列号: $MERCHANT_SERIAL_NUMBER"
log_info "私钥路径: $PRIVATE_KEY_PATH"
log_info "输出目录: $OUTPUT_DIR"
# 检查是否有Java环境
if ! command -v java &> /dev/null; then
log_error "未找到Java环境请先安装Java"
exit 1
fi
# 检查是否有微信支付SDK
local classpath="."
if [[ -f "target/classes" ]]; then
classpath="target/classes:$classpath"
fi
# 查找微信支付SDK jar文件
local wechat_jar=$(find . -name "*wechatpay*" -name "*.jar" 2>/dev/null | head -1)
if [[ -n "$wechat_jar" ]]; then
classpath="$wechat_jar:$classpath"
log_info "找到微信支付SDK: $wechat_jar"
fi
# 创建测试程序
local test_file=$(create_test_program)
log_info "创建测试程序: $test_file"
# 编译测试程序
log_info "编译测试程序..."
if ! javac -cp "$classpath" "$test_file" 2>/dev/null; then
log_warning "编译失败,尝试使用项目环境..."
# 使用Maven编译项目
if [[ -f "pom.xml" ]]; then
log_info "使用Maven编译项目..."
mvn compile -q
classpath="target/classes:$(mvn dependency:build-classpath -q -Dmdep.outputFile=/dev/stdout)"
fi
fi
# 运行测试
log_info "测试证书配置..."
if java -cp "$classpath" WechatCertTest "$MERCHANT_ID" "$PRIVATE_KEY_PATH" "$MERCHANT_SERIAL_NUMBER" "$API_V3_KEY"; then
log_success "证书自动配置成功!"
log_info ""
log_info "🎯 推荐使用方式:"
log_info "1. 在您的应用中使用 RSAAutoCertificateConfig"
log_info "2. 系统会自动下载和管理微信支付平台证书"
log_info "3. 无需手动下载 wechatpay_cert.pem 文件"
log_info ""
log_info "📝 代码示例:"
echo "Config config = new RSAAutoCertificateConfig.Builder()"
echo " .merchantId(\"$MERCHANT_ID\")"
echo " .privateKeyFromPath(\"$PRIVATE_KEY_PATH\")"
echo " .merchantSerialNumber(\"$MERCHANT_SERIAL_NUMBER\")"
echo " .apiV3Key(\"$API_V3_KEY\")"
echo " .build();"
else
log_error "证书配置测试失败"
exit 1
fi
# 清理临时文件
rm -f "$test_file" "${test_file%.java}.class"
}
# 检查证书状态
check_status() {
log_info "检查证书状态..."
# 检查开发环境证书
local dev_cert_dir="src/main/resources/certs/dev/wechat"
if [[ -d "$dev_cert_dir" ]]; then
log_info "开发环境证书目录: $dev_cert_dir"
for file in apiclient_key.pem apiclient_cert.pem; do
if [[ -f "$dev_cert_dir/$file" ]]; then
log_success "$file"
else
log_warning "$file (不存在)"
fi
done
fi
# 检查生产环境证书
local prod_cert_dir="certs/wechat"
if [[ -d "$prod_cert_dir" ]]; then
log_info "生产环境证书目录: $prod_cert_dir"
for file in apiclient_key.pem apiclient_cert.pem; do
if [[ -f "$prod_cert_dir/$file" ]]; then
log_success "$file"
else
log_warning "$file (不存在)"
fi
done
fi
log_info ""
log_info "💡 提示:"
log_info "使用 RSAAutoCertificateConfig 时,只需要以下文件:"
log_info "- apiclient_key.pem (商户私钥)"
log_info "- 商户号、证书序列号、APIv3密钥"
log_info "- wechatpay_cert.pem 将自动下载和管理"
}
# 测试现有配置
test_config() {
log_info "测试现有证书配置..."
# 从配置文件读取参数
local config_file="src/main/resources/application.yml"
if [[ -f "$config_file" ]]; then
log_info "从配置文件读取参数: $config_file"
# 提取配置信息(简单解析)
local api_key=$(grep -A 10 "wechat-pay:" "$config_file" | grep "api-v3-key:" | sed 's/.*: *"\(.*\)".*/\1/')
local private_key_file=$(grep -A 10 "wechat-pay:" "$config_file" | grep "private-key-file:" | sed 's/.*: *"\(.*\)".*/\1/')
if [[ -n "$api_key" && -n "$private_key_file" ]]; then
log_info "找到配置:"
log_info "APIv3密钥: ${api_key:0:8}..."
log_info "私钥文件: $private_key_file"
local full_private_key_path="src/main/resources/certs/dev/wechat/$private_key_file"
if [[ -f "$full_private_key_path" ]]; then
log_success "私钥文件存在: $full_private_key_path"
log_info ""
log_info "✅ 配置看起来正常,可以使用 RSAAutoCertificateConfig"
else
log_warning "私钥文件不存在: $full_private_key_path"
fi
else
log_warning "未能从配置文件解析到完整信息"
fi
else
log_warning "配置文件不存在: $config_file"
fi
}
# 主函数
main() {
case "${1:-}" in
"auto")
shift
parse_args "$@"
auto_configure
;;
"test")
test_config
;;
"status")
check_status
;;
*)
show_usage
exit 1
;;
esac
}
# 执行主函数
main "$@"

160
scripts/quick-wechat-cert.sh Executable file
View File

@@ -0,0 +1,160 @@
#!/bin/bash
# 微信支付证书快速配置脚本
# 使用项目现有配置和RSAAutoCertificateConfig
# 作者: 科技小王子
set -e
# 颜色定义
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; }
echo "🚀 微信支付证书自动配置工具"
echo "================================"
# 使用您提供的参数
MERCHANT_ID="1723321338"
API_V3_KEY="0kF5OlPr482EZwtn9zGufUcqa7ovgxRL"
MERCHANT_SERIAL_NUMBER="2B933F7C35014A1C363642623E4A62364B34C4EB"
PRIVATE_KEY_PATH="src/main/resources/certs/dev/wechat/apiclient_key.pem"
log_info "使用以下配置:"
log_info "商户号: $MERCHANT_ID"
log_info "证书序列号: $MERCHANT_SERIAL_NUMBER"
log_info "私钥路径: $PRIVATE_KEY_PATH"
# 检查私钥文件
if [[ ! -f "$PRIVATE_KEY_PATH" ]]; then
log_warning "私钥文件不存在: $PRIVATE_KEY_PATH"
exit 1
fi
log_success "私钥文件存在: $PRIVATE_KEY_PATH"
# 创建简单的Java测试程序
cat > WechatAutoTest.java << 'EOF'
import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAAutoCertificateConfig;
public class WechatAutoTest {
public static void main(String[] args) {
String merchantId = args[0];
String privateKeyPath = args[1];
String serialNumber = args[2];
String apiV3Key = args[3];
try {
System.out.println("🔧 正在创建 RSAAutoCertificateConfig...");
Config config = new RSAAutoCertificateConfig.Builder()
.merchantId(merchantId)
.privateKeyFromPath(privateKeyPath)
.merchantSerialNumber(serialNumber)
.apiV3Key(apiV3Key)
.build();
System.out.println("✅ 微信支付证书配置成功!");
System.out.println("");
System.out.println("📋 配置信息:");
System.out.println(" 商户号: " + merchantId);
System.out.println(" 证书序列号: " + serialNumber);
System.out.println(" 私钥路径: " + privateKeyPath);
System.out.println("");
System.out.println("🎉 RSAAutoCertificateConfig 已成功初始化");
System.out.println("📥 系统将自动下载微信支付平台证书");
System.out.println("🔄 证书过期时将自动更新");
System.out.println("🚫 无需手动下载 wechatpay_cert.pem");
System.out.println("");
System.out.println("✨ 您的微信支付证书配置已完成!");
} catch (Exception e) {
System.err.println("❌ 证书配置失败: " + e.getMessage());
System.err.println("");
System.err.println("🔍 可能的原因:");
System.err.println("1. 商户平台未开启API安全功能");
System.err.println("2. APIv3密钥不正确");
System.err.println("3. 证书序列号不匹配");
System.err.println("4. 网络连接问题");
System.err.println("");
System.err.println("💡 解决方案:");
System.err.println("1. 登录微信商户平台 -> 账户中心 -> API安全");
System.err.println("2. 确认已申请使用微信支付公钥");
System.err.println("3. 检查APIv3密钥和证书序列号");
e.printStackTrace();
System.exit(1);
}
}
}
EOF
log_info "创建测试程序..."
# 构建classpath
CLASSPATH="target/classes"
if [[ -f "pom.xml" ]]; then
log_info "编译项目..."
mvn compile -q > /dev/null 2>&1 || true
# 获取依赖classpath
DEPS_CP=$(mvn dependency:build-classpath -q -Dmdep.outputFile=/dev/stdout 2>/dev/null || echo "")
if [[ -n "$DEPS_CP" ]]; then
CLASSPATH="$CLASSPATH:$DEPS_CP"
fi
fi
# 编译测试程序
log_info "编译测试程序..."
if javac -cp "$CLASSPATH" WechatAutoTest.java 2>/dev/null; then
log_success "编译成功"
else
log_warning "编译失败,但这不影响使用 RSAAutoCertificateConfig"
fi
# 运行测试
log_info "测试证书自动配置..."
echo ""
if java -cp "$CLASSPATH:." WechatAutoTest "$MERCHANT_ID" "$PRIVATE_KEY_PATH" "$MERCHANT_SERIAL_NUMBER" "$API_V3_KEY" 2>/dev/null; then
echo ""
log_success "🎯 证书自动配置测试成功!"
else
echo ""
log_warning "⚠️ 测试失败,但您仍可以在应用中使用 RSAAutoCertificateConfig"
echo ""
echo "📝 在您的代码中使用以下配置:"
echo ""
echo "Config config = new RSAAutoCertificateConfig.Builder()"
echo " .merchantId(\"$MERCHANT_ID\")"
echo " .privateKeyFromPath(\"$PRIVATE_KEY_PATH\")"
echo " .merchantSerialNumber(\"$MERCHANT_SERIAL_NUMBER\")"
echo " .apiV3Key(\"$API_V3_KEY\")"
echo " .build();"
echo ""
echo "🔧 如果仍有问题,请检查:"
echo "1. 微信商户平台是否已开启API安全"
echo "2. 是否已申请使用微信支付公钥"
echo "3. 网络连接是否正常"
fi
# 清理临时文件
rm -f WechatAutoTest.java WechatAutoTest.class
echo ""
log_info "🎉 脚本执行完成!"
echo ""
echo "💡 重要提示:"
echo "1. RSAAutoCertificateConfig 是官方推荐的证书管理方式"
echo "2. 它会自动处理平台证书的下载和更新"
echo "3. 您无需再手动下载 wechatpay_cert.pem 文件"
echo "4. 证书过期时会自动更新,无需人工干预"
echo ""
echo "📚 更多信息请参考:"
echo " https://pay.weixin.qq.com/doc/v3/merchant/4012153196"