1. 22 Apr, 2026 3 commits
  2. 21 Apr, 2026 2 commits
  3. 20 Apr, 2026 3 commits
    • IanShaw027's avatar
      16be82b9
    • IanShaw027's avatar
      7ef7fd19
    • erio's avatar
      feat(payment): harden wxpay config validation with structured errors · 79192cf6
      erio authored
      Motivation: platform-certificate mode is being phased out by WeChat (2024-10+,
      newly-provisioned merchants already cannot download platform certificates at
      all), and wxpay config errors currently surface only when an order is being
      created — admins have no feedback at save time. Also, errors were returned as
      natural-language strings, leaving the frontend no way to localize them.
      
      Changes:
      
      - backend/internal/payment/provider/wxpay.go
        - Replace fmt.Errorf with structured infraerrors.BadRequest errors:
          - WXPAY_CONFIG_MISSING_KEY    (metadata: key)
          - WXPAY_CONFIG_INVALID_KEY_LENGTH  (metadata: key, expected, actual)
          - WXPAY_CONFIG_INVALID_KEY    (metadata: key) for malformed PEMs
        - Parse privateKey and publicKey PEMs in NewWxpay so malformed keys fail
          at save time instead of at order creation.
        - Keep the pubkey verifier (NewSHA256WithRSAPubkeyVerifier) as the single
          supported verifier; no more loadKeyPair helper.
      
      - backend/internal/service/payment_order.go invokeProvider
        - If CreateProvider or CreatePayment returns a structured ApplicationError,
          pass it through (optionally enriching metadata with provider/instance_id)
          instead of wrapping it as generic PAYMENT_GATEWAY_ERROR — so clients see
          the actual reason code (e.g. WXPAY_CONFIG_MISSING_KEY) and can localize.
        - Simplify a few messages (TOO_MANY_PENDING, DAILY_LIMIT_EXCEEDED,
          PAYMENT_GATEWAY_ERROR, NO_AVAILABLE_INSTANCE) to keyword form with
          metadata for template variables.
      
      - backend/internal/service/payment_config_providers.go
        - New helper validateProviderConfig calls provider.CreateProvider at save
          time. Enabled instances are validated on both Create and Update so admins
          see config errors immediately in the dialog, not later at order creation.
        - Disabled instances are not validated (half-filled drafts are allowed).
      
      - backend/internal/payment/provider/wxpay_test.go
        - Add generateTestKeyPair helper that produces valid RSA-2048 PKCS8/PKIX
          PEMs per test, used by the valid-config baseline (prior fake strings no
          longer pass the eager PEM check).
        - Cover each structured-error branch (missing/invalid-length/malformed PEM).
      79192cf6
  4. 14 Apr, 2026 1 commit
    • erio's avatar
      fix(payment): fix Alipay/Wxpay direct provider type mapping and enable... · 0e2a3901
      erio authored and 陈曦's avatar 陈曦 committed
      fix(payment): fix Alipay/Wxpay direct provider type mapping and enable cross-provider load balancing
      
      Two issues fixed:
      
      1. Alipay.SupportedTypes() returned ["alipay_direct"] and Wxpay returned
         ["wxpay_direct"], but the frontend sends payment_type="alipay"/"wxpay".
         The registry lookup failed with "payment method (alipay) is not
         configured". Fix: return the base types ["alipay"]/["wxpay"].
      
      2. When multiple providers support the same payment type (e.g. EasyPay
         and Alipay direct both handle "alipay"), only the last-registered
         provider's instances were reachable — the registry mapped one type to
         one provider key, and SelectInstance queried by that single key.
      
         Fix: bypass the registry in invokeProvider and let SelectInstance
         query across all providers when providerKey is empty. The selected
         instance's own ProviderKey (now included in InstanceSelection) is
         used to create the correct provider, enabling true cross-provider
         load balancing.
      
      Closes #1592
      0e2a3901
  5. 13 Apr, 2026 1 commit
    • erio's avatar
      fix(payment): fix Alipay/Wxpay direct provider type mapping and enable... · f498eb8f
      erio authored
      fix(payment): fix Alipay/Wxpay direct provider type mapping and enable cross-provider load balancing
      
      Two issues fixed:
      
      1. Alipay.SupportedTypes() returned ["alipay_direct"] and Wxpay returned
         ["wxpay_direct"], but the frontend sends payment_type="alipay"/"wxpay".
         The registry lookup failed with "payment method (alipay) is not
         configured". Fix: return the base types ["alipay"]/["wxpay"].
      
      2. When multiple providers support the same payment type (e.g. EasyPay
         and Alipay direct both handle "alipay"), only the last-registered
         provider's instances were reachable — the registry mapped one type to
         one provider key, and SelectInstance queried by that single key.
      
         Fix: bypass the registry in invokeProvider and let SelectInstance
         query across all providers when providerKey is empty. The selected
         instance's own ProviderKey (now included in InstanceSelection) is
         used to create the correct provider, enabling true cross-provider
         load balancing.
      
      Closes #1592
      f498eb8f
  6. 11 Apr, 2026 1 commit