Use all fields except sign, sort them alphabetically, and concatenate as key1=value1key2=value2.... Then use the app secret as a salt for MD5 encryption. The sign should be in lowercase.
timestamp
Yes
long
Timestamp of the transaction.
amount
Yes
string
Amount (minimum 50000, no decimals).
tradeNo
Yes
string
Unique transaction ID (recommended format: yyyymmddhhmmss+random number).
bankName
Yes
string
Fixed value "VietQR".
remark
No
string
Additional remarks (will be returned as is).
notifyUrl
Yes
string
Asynchronous callback URL, e.g., https://www.abc.com/. If not provided, the system will redirect to the default success page.
Request result (only indicates the success of the current request, not for merchant-side logic).
code
Yes
string
Response code (only indicates the success of the current request, not for merchant-side logic). For specific error codes, refer to the business error code enumeration.
timestamp
Yes
string
Transaction timestamp.
success
Yes
string
Transaction result.
data
Yes
Object
Returned object.
data.platFormTradeNo
Yes
string
Unique platform transaction number.
data.status
Yes
string
Request result. "0000" indicates success, "0015" indicates processing, and other values indicate error codes for failure handling.