yeg
2026-09-17 75e20ed49063feac161beca13aba24147424d5a7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
server:
  port: ${SERVER_PORT:8080}
 
spring:
  application:
    name: talent-card-server
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 10MB
  datasource:
    ## 默认连共享开发库(局域网 192.168.110.13,MySQL 5.7,flyway 关闭)。
    ## 要连别的库时用 MYSQL_URL 覆盖,例如本机 8134 上的那份副本:
    ##   jdbc:mysql://127.0.0.1:8134/talent_card?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useSSL=false
    url: ${MYSQL_URL:jdbc:mysql://192.168.110.13:3306/talent_card?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useSSL=false}
    username: ${MYSQL_USERNAME:root}
    password: ${MYSQL_PASSWORD:123456}
    driver-class-name: com.mysql.cj.jdbc.Driver
    hikari:
      # 池只有 10 条连接,任何一条被长期占用都足以让整个后台排队到超时
      # (2026-09-15 的事故:一个空闲未提交事务持着元数据锁,ALTER 无限等锁,
      # 该表所有查询跟着排队,10 条连接很快被借光,健康检查都超时)。
      # 超过这个时间还没归还的连接,Hikari 会连调用栈一起打进日志——
      # 这是定位「谁在长事务里等外部 HTTP」最直接的手段。
      leak-detection-threshold: 10000
  data:
    redis:
      host: ${REDIS_HOST:localhost}
      port: ${REDIS_PORT:6368}
      password: ${REDIS_PASSWORD:123456}
      database: ${REDIS_DATABASE:0}
      timeout: 3s
      repositories:
        enabled: false
  flyway:
    enabled: false
    locations: classpath:db/migration
    baseline-on-migrate: true
  jpa:
    hibernate:
      ddl-auto: validate
    open-in-view: false
    properties:
      hibernate:
        format_sql: true
        jdbc:
          time_zone: Asia/Shanghai
 
app:
  cors:
    # 后台管理端(vite dev,默认 5273)与 HBuilderX Web 调试来源;部署时用 CORS_ALLOWED_ORIGINS 覆盖为真实域名。
    # localhost 与局域网地址都要列:换网段后局域网 IP 会变,localhost 是最稳的调试入口。
    allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:5273,http://127.0.0.1:5273,http://localhost:7893,http://localhost:7894,http://127.0.0.1:7893,http://127.0.0.1:7894,http://192.168.110.26:5273,http://192.168.110.26:,http://192.168.110.15:5273,http://192.168.110.15:5173,http://192.168.110.13:5273,http://192.168.110.13:5173}
    # 本机调试来源的端口是随机的:微信开发者工具每次启动都换一个端口(见过 42665),
    # HBuilderX 内置浏览器同理。写死端口必然漏,所以按 origin 通配匹配任意端口。
    # 只放行 localhost / 127.0.0.1,不对公网来源开口子;真实域名请加进上面的精确白名单。
    allowed-origin-patterns: ${CORS_ALLOWED_ORIGIN_PATTERNS:http://localhost:[*],http://127.0.0.1:[*]}
  # 核销后把延迟入账的钱确认给商户;确认失败或超时时由这个补偿任务重试,避免钱永远冻在延迟户。
  privacy:
    # Production must provide APP_PRIVACY_ENCRYPTION_KEY through the deployment secret store.
    encryption-key: ${APP_PRIVACY_ENCRYPTION_KEY:talent-card-local-development-key}
  upload:
    directory: ${UPLOAD_DIR:uploads}
  external-web:
    # Only URLs on these operator-approved HTTPS hosts can be returned to the mini-program.
    allowed-hosts: ${EXTERNAL_WEB_ALLOWED_HOSTS:${CAR_WASH_ALLOWED_WEB_HOSTS:}}
  development-session:
    # Local payment debugging only. Set false before any shared or production deployment.
    enabled: false
    talent-id: 2
  payment:
    # 核销后把延迟入账的钱确认给商户;确认失败或超时时由补偿任务重试,避免钱永远冻在延迟户。
    # enabled 的默认值与代码里的默认值一致(都是开):删掉这一行不会让补偿静默消失。
    fund-confirmation-retry:
      enabled: ${FUND_CONFIRMATION_RETRY_ENABLED:true}
      fixed-delay-ms: ${FUND_CONFIRMATION_RETRY_FIXED_DELAY_MS:300000}
    # 悬账(订单已取消、通道却确认收了钱)的自动退款:退回付款人;通道拒绝则升级告警转人工。
    stranded-refund:
      enabled: ${STRANDED_REFUND_ENABLED:true}
      fixed-delay-ms: ${STRANDED_REFUND_FIXED_DELAY_MS:300000}
    huifu:
      # Keep disabled until the Huifu test/production product, merchant and keys are provisioned.
      enabled: true
      environment: prod
      system-id: 6666000220591054
      product-id: KAZX
      merchant-id: 6666000220591054
      mini-program-app-id: wxcfee477acb54d179
      private-key: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCSEpJD4Z62cb+g82jGY+d87noMrXkoHlw4CCCTtna1whTed5haEqGH3B6czSC7E2c9d/QdMP4Vt67uhS9OK0IgFdLG+r1uH6K4snV/CW4rMN7f9EZOJyzjfZ8gJeuwpGZHozfUeEoBwE6XTq9/2Us9moDQfRpEX3Q4MYF5dl/r35b8m0wdGndDq4aBugJf0+VXZ9bev8v6tQBm/VkGePpX9EeynQB7YxH7Bl3JW9LsHD+GJalO+Vmzo32o72YquryR9qmNmoC4mc9yFO4FSg6k6Bc2+CDBjwk4u//Y2jtccXHNNjJ/2JUA3EBNF4JpHl2lGt47DGXqgByASgHXF11NAgMBAAECggEAYpminauYhLK3lZ94pCIfyhb3z8LxO4Fy4meqBctuyjXd/GViM7rLyndtOo7Ef0MTt0xXPbUqbeJ1dI/2ZJ+SnTHd+26Zm9JC9sWPxlbJROJSL34mTu7mwBC17u9p7uyqFcU5FHS2EASNiFkW4gf9X/IA7brkli6QtrXEHgcnrIFVihAkLdI/MCrvD9RUa5QYHG0DqXT8RGwfVz4D/VHpjkqN3Tt8lEks56GRaZmNjWSZJmaeboKZC7jLDwUx07WSab7ZWAYU72X8NlY3t34NCBVPRAyrVW/UOIRGCHW/OibrMn4O7qOvHFgsNUWtd3ewSZkpZEt1oLc+cuXkt95bSQKBgQDKGHIxo3cllsCtrLedM5cAR75yy0MT+miL4TUvljTZ25JoUX+G1nmxeDrFhS0/pUJojjn+rSBqLkzsBOrisJ+7tmGKMWaUwikl0KOCHVXuKvzGWsPFdr7093Va9E/AgM2zFJf9S3VgF/FK4c0sBCra6NB5TXDjV92uXKjaDbRtqwKBgQC5CL8/l6hn2S+xMvf6NWmy1vGZXt0Dl8MfTwTBRFgiAy5nNdJLCbhypG/+d6sCe8nXddgr55LHLzf/gvA4SeGP4+WQvkVG3bCn/DyZOwgK0irKRcrUpHrFWssRYYQDEfRWPJYZE4yYjFT1pGhVF2ly3zwnHagjMUJoVwPY2uE45wKBgEJgVxlQnDB/XBdu0/vQ1vajmbywX/6uzymqNULE7eTkBik3I1CRHvUYDQ2U2TC/QZl/pTKtgCj/vgoC73a3Fi+cDltKMGwJfWRLK3jv06pe+hjX9NblUoC4yhWuiocqhuUbjXQHFa0TEBBNK4sab0zpDJfaxIoW8Nt02YyM1cbzAoGACykk6AAMz17BSq3pWTU5j+j5H6giKqJPyaapgcLOkhahCOatLYuDjZ6vhqjPLtIqpY1dIaDRMKR/ezD5rlt+eIBli2p+oTyj+C31tcRiwsxUemjlSBg3s4m7b+vy24CMvVrgLtkIBPeJ9FsbU+6alKw0Y6OdTaod+E8vUzg4l4cCgYEAsukZsL2AdMqjIZyeuitO0CPnvmRTCihuWi18M1Vun2RaCFSUavlLrmDt9i9v+eI5fRCGz8YgIMEyAp8T+xHX/tLTlXcWh9JS30RT+r3yQAOLnr4KG4LBBLgK64EOjhlo38gV6th7nvoi2R7rlPRBl3qW3bbgQyaAz2cZ0iHIoXo=
      platform-public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiuRE4WR7SQqRs+3xNHpneFSU0YkftkBFRec7x1KQP9xCtOoySt/9pyjk+OyKypHnAHWGijpMRyd3AnJGzwgHS7PQ0Fj1yawbb94zYaNjsHsVg0py15vsvZexxLUttrY6s3F17hcMXHTqTutRR1zk9bsYehNkoooj09r9+5x6c5hIyWDXB7UQ+frnLBxhG8SQkeYnm1DqsRs4yB4qvDTb++h3X24bN7AaYcujL2ju3HI+eh4PrgWw9DZKtGpjNc+4imayE+of+nebkTQ4W2gtt+5gECmYEL6jcc06ZGzd8pi4MkASqER+PYt9zIFdavkHGCT8PDMRCl7AiwDkP6VVUQIDAQAB
      notify-url: ${HUIFU_NOTIFY_URL:http://221.182.45.100:11451/api/payments/huifu/notify}
      # 绑卡(业务开通)回调地址。这个键原来在配置里根本不存在:它靠 notify-url 推导出一个值,
      # 于是「通道侧到底注册了哪个地址」取决于另一个配置。显式写出来,缺一个都能一眼看见。
      merchant-business-notify-url: ${HUIFU_MERCHANT_BUSINESS_NOTIFY_URL:http://221.182.45.100:11451/api/payments/huifu/merchant-business-notify}
      # 回调到不了时(通道重发失败、本地或内网环境)靠查单把已经收下钱的订单捞回来:支付挂起超过
      # pending-after-minutes 就问一次通道,通道确认收款就落成本地已支付,对不上账的记一条问题记录。
      # 关掉它就只剩「有人点了取消/重申支付」这一个补救入口,回调一丢订单会一直停在待支付。
      # fixed-delay-ms 写进配置(注解里也有同样的默认值):间隔不该只靠注解默认值生效。
      # 默认一分钟:它同时是关单补偿的重试间隔——通道答「关单处理中」的那笔尝试要靠扫描才会被重试,
      # 扫描慢了,「关单每分钟重试一次、最多三次」就变成十几分钟,用户在前台看到的就是一直卡着。
      # 慢车道每行另有 pending-after-minutes 与 last_reconciled_at 退避,调快不会重复打通道。
      # 要更慢(例如生产上想省通道调用)用 HUIFU_RECONCILIATION_FIXED_DELAY_MS 覆盖;
      # 要立刻收敛,在后台订单列表点「立即对账」——它跑的是同一套真实对账逻辑,不是模拟支付。
      reconciliation:
        enabled: ${HUIFU_RECONCILIATION_ENABLED:true}
        pending-after-minutes: ${HUIFU_RECONCILIATION_PENDING_AFTER_MINUTES:5}
        fixed-delay-ms: ${HUIFU_RECONCILIATION_FIXED_DELAY_MS:60000}
      merchant-onboarding-notify-url: ${HUIFU_MERCHANT_ONBOARDING_NOTIFY_URL:http://221.182.45.100:11451/api/payments/huifu/merchant-onboarding-notify}
      merchant-wechat-config-notify-url: ${HUIFU_MERCHANT_WECHAT_CONFIG_NOTIFY_URL:http://221.182.45.100:11451/api/payments/huifu/merchant-wechat-config-notify}
      merchant-business-open-notify-url: ${HUIFU_MERCHANT_BUSINESS_OPEN_NOTIFY_URL:http://221.182.45.100:11451/api/payments/huifu/merchant-business-open-notify}
      onboarding-upper-huifu-id: ${HUIFU_ONBOARDING_UPPER_HUIFU_ID:6666000220591054}
      # 进件只做「渠道商 → 普通商户」两级:不再用 head_office_flag=0 + head_huifu_id 把商户
      # 建成平台自己的下级商户。实测那条路没有收益(建完照样 20002 数据权限认证失败),
      # 还会按总部客群类型索要 F725/F726/F727 材料。
      # 是否复用上级(渠道商)的微信商户号:1=微信+支付宝,2=不使用,3=仅微信,4=支付宝;留空=不下发。
      # 渠道商 6666000220591054 本身没有商户级微信配置(查询返回「huifuId不存在」),实测下发 3 会被拒:
      # 「失败:复用交易信息,上级商户号为空」。不下发时,子商户在渠道 00016904 下拿到自己的微信
      # 子商户号(实测 sub_mer_id=W15737921333057628112,sub_mer_name 即商户注册名)。
      merchant-use-chains-flag: ${HUIFU_MERCHANT_USE_CHAINS_FLAG:}
      merchant-wechat-fee-rate: ${HUIFU_MERCHANT_WECHAT_FEE_RATE:0.70}
      # 企业微信业务的费率规则号(cid)。756 是汇付《微信费率规则ID》表里「企业 + fee_type=01(线上)」
      # 唯一的一条规则,细分行业含「就业信息平台/其他信息服务平台」,与本平台业务对应;
      # 场景 12 在该表没有独立行,与线上公众号/小程序共用这一条。留空则退回 mcc 兼容路径。
      merchant-wechat-fee-rule-id: ${HUIFU_MERCHANT_WECHAT_FEE_RULE_ID:756}
      # 同一张表按**主体类型**分行:线上(类型 01)下企业 756、个体工商户 761、小微 775。
      # 小微拿企业的 756 会被通道回「微信费率规则号填写不正确,请检查!」,所以必须分开配。
      merchant-wechat-fee-rule-id-individual: ${HUIFU_MERCHANT_WECHAT_FEE_RULE_ID_INDIVIDUAL:775}
      merchant-wechat-fee-rule-id-sole-proprietor: ${HUIFU_MERCHANT_WECHAT_FEE_RULE_ID_SOLE_PROPRIETOR:761}
      merchant-online-business-type: ${HUIFU_MERCHANT_ONLINE_BUSINESS_TYPE:H5311L}
      # 运营媒介(online_media_info_list)。文档写明它只在开通快捷/网银/余额支付Pro/分账/
      # 大额转账/代扣时才需要,且是「基本信息入驻接口」的必填项,不是「商户业务开通」的必填项;
      # 本平台只开线上微信,所以默认留空即不下发。要下发时再配媒介名称。
      merchant-online-media-name: ${HUIFU_MERCHANT_ONLINE_MEDIA_NAME:}
      # 媒介主体与商户主体是否一致;它是 online_media_info_list 的**元素字段**,不是顶层参数。
      # 声明 N(不一致)时通道会一并索要授权或开发证明材料,因此不下发媒介时它也用不上。
      merchant-media-subject-same: ${HUIFU_MERCHANT_MEDIA_SUBJECT_SAME:N}
      # 小微经营类型,个人商户开通微信业务时必填;三种取值都要求 F22 门头照 + F24 内景照。
      merchant-micro-business-type: ${HUIFU_MERCHANT_MICRO_BUSINESS_TYPE:MICRO_TYPE_ONLINE}
      merchant-agreement-url: ${HUIFU_MERCHANT_AGREEMENT_URL:https://cloudpnrcdn.oss-cn-shanghai.aliyuncs.com/opps/api/prod/download_file/PaymentServiceAgreement.htm}
      # 收款能力只要求「斗拱子商户正常 + 取现可用」:未核销的钱由延迟户兜住,
      # 自动结算开着不再影响收款。设 false 仅用于刻意跳过通道能力确认的部署。
      merchant-capability-required: ${HUIFU_MERCHANT_CAPABILITY_REQUIRED:true}
      capability-refresh:
        enabled: ${HUIFU_CAPABILITY_REFRESH_ENABLED:true}
        stale-hours: ${HUIFU_CAPABILITY_STALE_HOURS:6}
        fixed-delay-ms: ${HUIFU_CAPABILITY_REFRESH_FIXED_DELAY_MS:1800000}
  wechat:
    mini-program:
      # The app id must be the same mini-program that invokes uni.login and uni.requestPayment.
      app-id: ${WECHAT_MINI_PROGRAM_APP_ID:wxcfee477acb54d179}
      # Keep this only in the deployment environment. It is required to exchange a wx.login code for an OpenID.
      app-secret: ${WECHAT_MINI_PROGRAM_APP_SECRET:716aae42f04d3c5f17904e894f1c1ee9}
 
management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics
  endpoint:
    health:
      probes:
        enabled: true
 
logging:
  level:
    com.talentcard.server: debug