server: port: 8001 servlet: context-path: /api/v1 spring: threads: virtual: enabled: true application: name: payment-platform profiles: active: dev servlet: multipart: max-file-size: 10MB max-request-size: 20MB jackson: time-zone: Asia/Shanghai datasource: type: com.alibaba.druid.pool.DruidDataSource druid: driver-class-name: org.postgresql.Driver url: jdbc:postgresql://localhost:5432/payment_platform_java?currentSchema=public&stringtype=unspecified username: admin password: 'xjz#123321' initial-size: 5 min-idle: 5 max-active: 20 max-wait: 60000 validation-query: SELECT 1 test-while-idle: true test-on-borrow: false test-on-return: false # 每个物理连接建立后立刻把会话时区钉成北京时间。 # # 为什么必须有这一行:本项目所有 timestamp without time zone 列一律存北京墙钟 # (由 ShanghaiOffsetDateTimeTypeHandler 保证),那部分与会话时区无关; # 但业务表里另有 4 个 timestamptz 列存的是「瞬间」,读出来是会话时区的墙钟 —— # sys_invitation_code.used_time / created_time / updated_time、sys_user.last_login # 这几列的正确性完全押在会话时区上,所以在这里显式钉死,不依赖服务端配置。 # # 已核对 druid-spring-boot-3-starter 1.2.20 的 spring-configuration-metadata.json: # 属性名就是 connection-init-sqls(Collection); # 并已反编译 DruidAbstractDataSource 确认它在建连后逐条 # connection.createStatement() + Statement.execute(sql)。 connection-init-sqls: - SET TIME ZONE 'Asia/Shanghai' data: redis: host: redis port: 6379 database: 1 password: '123456#xjz' timeout: 10s lettuce: pool: max-active: 20 max-idle: 10 min-idle: 5 mybatis-plus: mapper-locations: classpath*:/mapper/**/*.xml type-aliases-package: com.payment.platform.module configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl # JWT jwt: secret: vgb0tnl9d58+6n-6h-ea&u^1#1sccp!794=krylxcjq75vzps$ algorithm: HmacSHA256 access-token-expire: 3600 refresh-token-expire: 7200 token-type: bearer sliding-expire: true # 验证码 captcha: enable: true expire-seconds: 60 # Knife4j springdoc: swagger-ui: path: /swagger-ui.html api-docs: path: /v3/api-docs knife4j: enable: true setting: language: zh_cn # Alipay(仅作 fallback — 正常运行时使用 pay_service_provider 表配置) alipay: app-id: "" app-private-key: "" alipay-public-key: "" server-url: https://openapi.alipay.com/gateway.do format: JSON charset: UTF-8 sign-type: RSA2 sandbox: false notify-url: "" return-url: "" # OAuth 授权回调完成后的前端跳转地址(如 http://localhost:5180)— openid 授权 URL 生成时校验非空 oauth-front-url: "https://qcsj88888.com" # OAuth 授权回调地址(完整 URL)— 支付宝开放平台「授权回调地址」白名单只能配一个,与当面付 app_auth_code 授权共用(按参数分流),须与白名单完全一致 oauth-redirect-uri: "https://qcsj88888.com/api/v1/payment/aplipay/auth" max-retries: 3 request-timeout: 30 rate-limit: 100 # 汇安融(HAR)支付宝通道 # 我们是二级服务商,上游汇安融是一级,实际支付能力由上游提供。 # 密钥未配好前 enabled 保持 false —— 定时轮询据此跳过,不会带着空密钥发起调用。 har: enabled: false # 上游根地址(不含 context-path,代码里固定拼 /kf-alipay-api) base-url: "" # 上游分配的应用编号,联调时确定 app-id: "" version: "2.0" # 我方私钥,PKCS#8 纯 Base64(换行自行去掉) our-private-key: "" # 汇安融公钥,X.509 纯 Base64(通知验签用,必须配) platform-public-key: "" callback-pool-size: 4 connect-timeout-ms: 5000 read-timeout-ms: 15000 # Alibaba Cloud (OSS等) alibaba-cloud: access-key-id: LTAI5t5jHkQMY2T7V5n4ofMr access-key-secret: RYaofbQBRc93LC1oxCbgJGTVMCzNW4 # File upload (OSS) file: upload-path: static/upload allowed-extensions: .gif,.jpg,.jpeg,.png,.ico,.svg,.xls,.xlsx,.pdf,.doc,.docx max-size: 10485760 # Aliyun OSS aliyun: oss: endpoint: "oss-cn-beijing.aliyuncs.com" bucket: "hunanxiaojunzioss" access-key-id: "LTAI5t5jHkQMY2T7V5n4ofMr" access-key-secret: "RYaofbQBRc93LC1oxCbgJGTVMCzNW4" custom-domain: "" # Logging logging: file: path: ./logs level: com.payment.platform: info org.springframework.security: info # 乐收赢支付通道 leshouying: base-url: https://test.gdyfsk.com/yfpay # 默认值是**文档给的测试机构**,开发期开箱即用;正式机构号进件后由环境变量注入 inst-no: ${LESHOUYING_INST_NO:900112} # 机构密钥同样用环境变量占位:本文件被 git 跟踪,写死正式密钥 = 把机构密钥提交进仓库 key: ${LESHOUYING_KEY:1c4d83f0c3c24a7d9fcaa1fed2682076} notify-url: ${LESHOUYING_NOTIFY_URL:https://qcsj88888.com/api/v1/payment/collection/notify/pay} sync-poll-times: 3 sync-poll-interval-ms: 2000 barcode-poll-max-times: 15 barcode-poll-interval-ms: 5000 default-qr-expire-minutes: 15 h5-expire-minutes: 30 reconcile-delay-seconds: 60 absolute-expire-hours: 24 downstream-notify-max-retries: 8 # ── 三-B 进件参数(spec §6.3 的 1-5,由客户经理提供)── # ★ 默认值必须留空:Global Constraint 3/4(spec §6.4 逐字)禁止「测试用假值」, # 也不许把凭据提交进仓库。缺失由 LeshouyingProperties.missingOnboardingCredentials() # 在进件服务入口挡下并**一次列全**,**不进 validate()**(理由见该方法 javadoc)。 channel-id: ${LESHOUYING_CHANNEL_ID:} bd-id: ${LESHOUYING_BD_ID:} channel-type: ${LESHOUYING_CHANNEL_TYPE:} rate-code: ${LESHOUYING_RATE_CODE:} # 进件审核通知地址(我方固定地址,spec §6.5)。★ 与上面 notify-url 不是同一个地址。 onboarding-notify-url: ${LESHOUYING_ONBOARDING_NOTIFY_URL:}