Skip to main content

Troubleshooting and Support Evidence

This page maps common failures to the checks you should run first and the evidence AppInChina needs to help efficiently. The goal is a path that is neither dismissive nor open-ended.

Do not classify a failure as a wallet defect before checking whether an AppInChina order exists and reviewing the relevant client-side evidence. A payment attempt that never created an order is, by default, a client-side preflight matter until the evidence identifies the cause.

Failure classification

Use the observed state to classify the problem, run the client-side checks first, and — only if unresolved — send the listed evidence.

Observed stateInitial classificationClient checks firstWhat to send AppInChina if unresolved
Wallet cannot be installed, registered, verified, or linked to a cardWallet / card readinessWallet prompts; country/phone/ID/card eligibility; card issuer response.Wallet name/version; redacted screenshots; country; card brand/issuer only if the tester is comfortable sharing; exact error and time.
Payment attempt does not create an AppInChina orderClient-side preflightWallet readiness; SDK invocation parameters; app logs; build/version; callback/result configuration.APK/AAB build ID; device/OS; payment method; timestamp and time zone; sanitized logs around the attempt; screenshots; user/bizNo if generated.
Order exists but is not paidTransaction state investigationOrder status; displayed wallet outcome; retry/duplicate behavior; network/app logs.Order/bizNo; method; timestamp; sanitized logs; exact UI state; confirmation that the app build matches the test build.
Order is paid but app reports failure or does not return correctlyClient post-payment handlingResult Activity/callback implementation; release merged manifest; crash/error logs; app navigation.Order/bizNo; APK build; exact stack/log excerpt; manifest / result-Activity verification; screen capture only if needed.
Order is paid, but entitlement/access is missingClient backend / entitlementBackend verification response; idempotency logic; user-to-customerIdentity mapping; entitlement update and app refresh.Order/bizNo; sanitized verification records; entitlement audit trail; current client account state; timestamps.
Access was granted but history/refund state is wrongClient history / reconciliationCanonical history call/method; pagination; latest verified status; refund reconciliation job.Request/response redacted of secrets; endpoint/method; user/bizNo; expected vs actual record; timestamps.

Understanding SDK error 99999

99999 means the Android SDK caught an unexpected local exception while processing the request or payment flow. It can result from a missing Activity, a dependency/configuration problem, a JSON parsing error, or another unhandled runtime failure.

99999 is not a payment decline

99999 is not enough to identify the cause and does not, by itself, show that AppInChina's backend or a payment provider rejected the transaction. Obtain the underlying Android exception and surrounding logs, then classify the failure.

Evidence to collect for 99999:

  • Exact timestamp and time zone.
  • Application ID, app version, version code, and whether the build is debug or release.
  • Device brand/model, Android version, and wallet-app version where relevant.
  • The complete exception and surrounding Android log — not only the error code.
  • Whether an AppInChina order was created, plus bizNo if available.
  • Which wallet/channel was selected.
  • Gradle dependency report for FastJSON/FastJSON2 if the exception concerns class loading, JSON parsing, or a compatibility change (see FastJSON dependency issues).
  • Final merged manifest for Activity/callback errors.

Triage rule:

  • If an order was created or paid, investigate the post-payment callback, verification, and entitlement path in parallel with any client crash.
  • If no order reached AppInChina, first inspect the local exception, SDK setup, wallet readiness, and request parameters. Do not label it a backend payment failure without supporting evidence.

WeChat-specific failures

SymptomFirst checksEvidence for support
WeChat option appears but no wallet handoff occursConfirm initPayTools() succeeded in the same process before startPayment(); confirm WeChat is installed and the configured channel is returned.Timestamp; SDK log; initPayTools() result/error; app version/build; device/Android version.
Wallet completes but app does not refresh accessConfirm WXPayEntryActivity is correctly packaged and declared; trace its route to backend verification and entitlement refresh.Callback logs; merged manifest; order bizNo; backend verification record; current entitlement response.

See the WeChat payment lifecycle for the full init → callback → verification path.

FastJSON dependency issues

The SDK requires legacy FastJSON 1.x (com.alibaba:fastjson), which is a different dependency family from FastJSON2 (com.alibaba.fastjson2:fastjson2). See Prerequisites §3.2.

SituationWhat to do
ClassNotFoundException, NoClassDefFoundError, or a crash identifying com.alibaba.fastjsonConfirm the approved FastJSON 1.x dependency is declared and resolved into the release build. Provide the full exception and dependencyInsight output.
Another library resolves a different FastJSON 1.x versionResolve to one Engineering-approved FastJSON 1.x version for that module family; retest the release artifact. Do not pick a version solely because it is newer.
The app also includes FastJSON2Keep FastJSON2 versioning explicit and test the whole app. Do not describe it as a replacement for FastJSON 1.x.
Device/Android-specific JSON crashCapture device/OS, app build, SDK artifact version, full exception, and both FastJSON/FastJSON2 resolved versions before escalating.

Privacy rule

Never request sensitive data

Never ask a client — and never send AppInChina — passwords, card numbers, wallet authentication codes, full device dumps, access tokens, or production secrets. Request an excerpt of a sanitized log covering the attempt, not an unbounded full log, unless Engineering specifically needs it under a secure process.

Example of a sanitized log excerpt

Send the window around the attempt with secrets removed:

2026-08-03 14:30:01.220 +0800  ACP/pay  startPayment channel=WECHAT bizNo=ORDER_20260803_0001 customerIdentity=user_12345
2026-08-03 14:30:02.880 +0800 ACP/pay wallet launched
2026-08-03 14:30:19.104 +0800 ACP/pay return-to-app; querySingleOrder bizNo=ORDER_20260803_0001
2026-08-03 14:30:19.550 +0800 ACP/pay paymentStatus=PAID pmtDt=1754203818000
2026-08-03 14:30:19.560 +0800 APP/entitlement grant productId=pro_3m result=OK

Redact APP_SECRET, tokens, phone numbers, and card data before sharing. Include the timestamp and time zone so the attempt can be correlated with the backend order record.