Payvol Verify
Never ask a payer to trust a green tick.
Verify checks a payment request against its profile before a wallet shows it, and names the rule behind every refusal. What it cannot establish, such as whether a signature is genuine, it reports as not checked rather than as a pass.
Add Verify to a wallet Try it in the app
@payvol/coreruns offlinefails closed
What it does
One checkmark hides the question that matters.
A request can have perfect bytes and a perfect signature and still come from the wrong company. Collapse every check into a single green state and the payer cannot tell which part was actually established. Verify keeps the answers apart.
Unknown is a rejection, not a shrug
Fails closed
An unrecognised profile, a malformed field, an expired request. Each one stops the request before a pay button can render, with the reason code of the rule it broke.
A valid signature is not a verified merchant
Identity kept separate
Cryptography proves the bytes were not altered by someone without the key. It does not prove whose key it is. Verify keeps those two facts apart and refuses to let the second borrow confidence from the first.
The request declares, the wallet checks
Checked at pay time
A request states what the receiving side needs. It never carries a claim that those conditions are met, because a request created on Monday cannot know what is true on Thursday.
Two implementations, one verdict
Same answer everywhere
The conformance vectors decide what is correct. They are published in @payvol/conformance with a runner, so a second implementation can check that it agrees with this one.
// same request, two independent readers
reader A -> 9f2c...41a7
reader B -> 9f2c...41a7
// a disagreement is a failing test, not a bug report How it works
Read, check, answer.
01
Read
- Take the canton: URI from a QR code, a link or an NFC tap
- Refuse input that is too large or does not parse
- Refuse a profile version it does not implement
02
Check
- Check every field against the profile's rules
- Check the expiry against the time you evaluate at
- Report the signature as absent or not checked
- Warn about a request that is well formed but unpayable as written
03
Answer
- Refuse with the reason code of the rule that failed
- Return a valid request with its warnings
- Leave the decision to your own policy
Scope
What Verify leaves to the wallet.
Who it is for
Wallet teams, and any application that shows a payer a request before they sign it.
Verify is part of these situations.
Get started
Check a request before you show it.
Install the package, pass validate the URI you scanned, and act on the answer. It runs inside the wallet: no network calls, no keys, no account.
import { validate } from '@payvol/core';
// the canton: URI read from a QR code, a link or an NFC tap
const result = validate(scanned);
if (result.valid) {
result.warnings; // what is questionable, never a refusal
result.signatureVerified; // 'absent' | 'not-checked': no signature was verified
wallet.present(result.payvol);
} else {
wallet.refuse(result.code); // the rule that refused it, for example 'EXPIRED'
}