@nevermined-io/payments 1.3.2 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -3
- package/dist/api/base-payments.d.ts.map +1 -1
- package/dist/api/base-payments.js +12 -10
- package/dist/api/base-payments.js.map +1 -1
- package/dist/api/nvm-api.d.ts +0 -1
- package/dist/api/nvm-api.d.ts.map +1 -1
- package/dist/api/nvm-api.js +0 -1
- package/dist/api/nvm-api.js.map +1 -1
- package/dist/api/plans-api.d.ts +9 -30
- package/dist/api/plans-api.d.ts.map +1 -1
- package/dist/api/plans-api.js +11 -46
- package/dist/api/plans-api.js.map +1 -1
- package/dist/common/types.d.ts +23 -15
- package/dist/common/types.d.ts.map +1 -1
- package/dist/common/types.js.map +1 -1
- package/dist/environments.d.ts +0 -7
- package/dist/environments.d.ts.map +1 -1
- package/dist/environments.js +0 -13
- package/dist/environments.js.map +1 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +1 -1
- package/dist/mcp/http/session-manager.d.ts.map +1 -1
- package/dist/mcp/http/session-manager.js +15 -1
- package/dist/mcp/http/session-manager.js.map +1 -1
- package/dist/payments.d.ts +17 -1
- package/dist/payments.d.ts.map +1 -1
- package/dist/payments.js +2 -10
- package/dist/payments.js.map +1 -1
- package/dist/plans.d.ts +1 -1
- package/dist/plans.js +6 -6
- package/dist/plans.js.map +1 -1
- package/dist/x402/delegation-api.d.ts +34 -7
- package/dist/x402/delegation-api.d.ts.map +1 -1
- package/dist/x402/delegation-api.js +15 -3
- package/dist/x402/delegation-api.js.map +1 -1
- package/dist/x402/facilitator-api.d.ts +5 -6
- package/dist/x402/facilitator-api.d.ts.map +1 -1
- package/dist/x402/facilitator-api.js +17 -5
- package/dist/x402/facilitator-api.js.map +1 -1
- package/dist/x402/index.d.ts +2 -6
- package/dist/x402/index.d.ts.map +1 -1
- package/dist/x402/index.js +1 -4
- package/dist/x402/index.js.map +1 -1
- package/package.json +23 -21
- package/dist/x402/visa-facilitator-api.d.ts +0 -150
- package/dist/x402/visa-facilitator-api.d.ts.map +0 -1
- package/dist/x402/visa-facilitator-api.js +0 -206
- package/dist/x402/visa-facilitator-api.js.map +0 -1
- package/dist/x402/visa-token-api.d.ts +0 -60
- package/dist/x402/visa-token-api.d.ts.map +0 -1
- package/dist/x402/visa-token-api.js +0 -99
- package/dist/x402/visa-token-api.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nevermined-io/payments",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Typescript SDK to interact with the Nevermined Payments Protocol",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -40,22 +40,22 @@
|
|
|
40
40
|
"scripts": {
|
|
41
41
|
"clean": "rm -rf ./dist/ ./doc/ ./.nyc_output",
|
|
42
42
|
"build": "tsc",
|
|
43
|
-
"build:all": "
|
|
43
|
+
"build:all": "pnpm build && pnpm cli:build",
|
|
44
44
|
"lint": "eslint ./src",
|
|
45
45
|
"test": "jest --verbose --config ./tests/jest.config.json",
|
|
46
46
|
"test:unit": "jest --verbose --config ./tests/jest.config.json --testPathPattern=tests/unit",
|
|
47
47
|
"test:integration": "jest --verbose --config ./tests/jest.config.json --testPathPattern=tests/integration",
|
|
48
|
-
"test:e2e": "jest --verbose --config ./tests/jest.config.
|
|
48
|
+
"test:e2e": "jest --verbose --config ./tests/jest.e2e.config.cjs --testPathPattern=tests/e2e --runInBand",
|
|
49
49
|
"format": "prettier --check ./src",
|
|
50
|
-
"prepublishOnly": "
|
|
50
|
+
"prepublishOnly": "pnpm build",
|
|
51
51
|
"doc": "typedoc --out docs ./src",
|
|
52
|
-
"cli:build": "cd cli &&
|
|
53
|
-
"cli:dev": "cd cli &&
|
|
54
|
-
"cli:test": "cd cli &&
|
|
55
|
-
"cli:install": "cd cli &&
|
|
52
|
+
"cli:build": "cd cli && pnpm build",
|
|
53
|
+
"cli:dev": "cd cli && pnpm dev",
|
|
54
|
+
"cli:test": "cd cli && pnpm test",
|
|
55
|
+
"cli:install": "cd cli && pnpm install"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
|
-
"@anthropic-ai/sdk": "^0.
|
|
58
|
+
"@anthropic-ai/sdk": "^0.91.1",
|
|
59
59
|
"@aws-sdk/client-bedrock-runtime": "^3.972.0",
|
|
60
60
|
"@babel/core": "^7.27.4",
|
|
61
61
|
"@babel/preset-env": "^7.27.2",
|
|
@@ -76,19 +76,19 @@
|
|
|
76
76
|
"eslint-config-nevermined": "^0.3.0",
|
|
77
77
|
"eslint-config-next": "^15.1.5",
|
|
78
78
|
"eslint-config-prettier": "^9.1.0",
|
|
79
|
-
"eslint-plugin-tsdoc": "^0.2
|
|
79
|
+
"eslint-plugin-tsdoc": "^0.5.2",
|
|
80
80
|
"jest": "^29.7.0",
|
|
81
81
|
"langchain": "^0.3.37",
|
|
82
82
|
"openai": "^6.2.0",
|
|
83
83
|
"prettier": "^3.2.5",
|
|
84
84
|
"source-map-support": "^0.5.21",
|
|
85
85
|
"supertest": "^7.1.4",
|
|
86
|
-
"together-ai": "^0.
|
|
86
|
+
"together-ai": "^0.39.0",
|
|
87
87
|
"ts-jest": "^29.2.5",
|
|
88
88
|
"ts-node": "^10.9.2",
|
|
89
89
|
"tsconfig-paths": "^4.2.0",
|
|
90
90
|
"tslib": "^2.6.2",
|
|
91
|
-
"typedoc": "0.
|
|
91
|
+
"typedoc": "0.28.19",
|
|
92
92
|
"typescript": "^5.3.3"
|
|
93
93
|
},
|
|
94
94
|
"peerDependencies": {
|
|
@@ -111,8 +111,8 @@
|
|
|
111
111
|
"@a2a-js/sdk": "^0.3.4",
|
|
112
112
|
"@helicone/helpers": "^1.6.0",
|
|
113
113
|
"@opentelemetry/api": "^1.9.0",
|
|
114
|
-
"@opentelemetry/exporter-trace-otlp-http": "^0.
|
|
115
|
-
"@traceloop/node-server-sdk": "^0.
|
|
114
|
+
"@opentelemetry/exporter-trace-otlp-http": "^0.215.0",
|
|
115
|
+
"@traceloop/node-server-sdk": "^0.26.0",
|
|
116
116
|
"axios": "^1.13.1",
|
|
117
117
|
"express": "4.21.2",
|
|
118
118
|
"jose": "^5.2.4",
|
|
@@ -121,12 +121,14 @@
|
|
|
121
121
|
"zod": "^4.0.17",
|
|
122
122
|
"zod-to-json-schema": "^3.25.0"
|
|
123
123
|
},
|
|
124
|
-
"packageManager": "
|
|
125
|
-
"
|
|
126
|
-
"
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
124
|
+
"packageManager": "pnpm@10.33.0",
|
|
125
|
+
"pnpm": {
|
|
126
|
+
"overrides": {
|
|
127
|
+
"qs": ">=6.14.1",
|
|
128
|
+
"jws": ">=4.0.1",
|
|
129
|
+
"js-yaml": ">=4.1.1",
|
|
130
|
+
"@langchain/core": ">=0.3.80",
|
|
131
|
+
"@smithy/config-resolver": ">=4.4.0"
|
|
132
|
+
}
|
|
131
133
|
}
|
|
132
134
|
}
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Visa Facilitator API — verifies and settles payments via the Visa x402 backend.
|
|
3
|
-
*
|
|
4
|
-
* Unlike the base FacilitatorAPI (which sends JSON bodies to the NVM backend),
|
|
5
|
-
* the Visa flow uses the PAYMENT-SIGNATURE HTTP header to transport a base64-encoded
|
|
6
|
-
* PaymentPayload to the Visa backend's /verify and /settle endpoints.
|
|
7
|
-
*
|
|
8
|
-
* @example
|
|
9
|
-
* ```typescript
|
|
10
|
-
* import { Payments } from '@nevermined-io/payments'
|
|
11
|
-
*
|
|
12
|
-
* const payments = Payments.getInstance({
|
|
13
|
-
* nvmApiKey: 'your-nvm-api-key',
|
|
14
|
-
* environment: 'sandbox',
|
|
15
|
-
* scheme: 'visa',
|
|
16
|
-
* })
|
|
17
|
-
*
|
|
18
|
-
* const paymentRequired = buildVisaPaymentRequired({
|
|
19
|
-
* amount: '2.00',
|
|
20
|
-
* asset: 'USD',
|
|
21
|
-
* payTo: 'merchant-id',
|
|
22
|
-
* endpoint: '/tools/random-article',
|
|
23
|
-
* })
|
|
24
|
-
*
|
|
25
|
-
* // The PAYMENT-SIGNATURE header from the client request
|
|
26
|
-
* const paymentSignature = req.headers['payment-signature'] as string
|
|
27
|
-
*
|
|
28
|
-
* const verification = await payments.facilitator.verifyPermissions({
|
|
29
|
-
* paymentRequired,
|
|
30
|
-
* x402AccessToken: paymentSignature,
|
|
31
|
-
* })
|
|
32
|
-
*
|
|
33
|
-
* if (verification.isValid) {
|
|
34
|
-
* const settlement = await payments.facilitator.settlePermissions({
|
|
35
|
-
* paymentRequired,
|
|
36
|
-
* x402AccessToken: paymentSignature,
|
|
37
|
-
* })
|
|
38
|
-
* }
|
|
39
|
-
* ```
|
|
40
|
-
*/
|
|
41
|
-
import { FacilitatorAPI } from './facilitator-api.js';
|
|
42
|
-
import type { VerifyPermissionsParams, VerifyPermissionsResult, SettlePermissionsParams, SettlePermissionsResult, X402Resource } from './facilitator-api.js';
|
|
43
|
-
import { PaymentOptions } from '../common/types.js';
|
|
44
|
-
/**
|
|
45
|
-
* Visa-specific extra fields in PaymentRequirements
|
|
46
|
-
*/
|
|
47
|
-
export interface VisaPaymentExtra {
|
|
48
|
-
/** Visa Token Service provisioned token ID */
|
|
49
|
-
vProvisionedTokenID: string;
|
|
50
|
-
/** VIC instruction ID from mandate creation */
|
|
51
|
-
instructionId: string;
|
|
52
|
-
/** Maximum number of times this payment can be used */
|
|
53
|
-
maxUsage: number;
|
|
54
|
-
/** Merchant name */
|
|
55
|
-
merchantName?: string;
|
|
56
|
-
/** Merchant URL */
|
|
57
|
-
merchantUrl?: string;
|
|
58
|
-
/** Merchant country code */
|
|
59
|
-
merchantCountryCode?: string;
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Visa payment requirements (x402 v2 with scheme: "visa")
|
|
63
|
-
*/
|
|
64
|
-
export interface VisaPaymentRequirements {
|
|
65
|
-
scheme: 'visa';
|
|
66
|
-
network: 'visa:vts';
|
|
67
|
-
amount: string;
|
|
68
|
-
asset: string;
|
|
69
|
-
payTo: string;
|
|
70
|
-
maxTimeoutSeconds: number;
|
|
71
|
-
extra: VisaPaymentExtra;
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Visa-specific PaymentRequired response
|
|
75
|
-
*/
|
|
76
|
-
export interface VisaPaymentRequired {
|
|
77
|
-
x402Version: 2;
|
|
78
|
-
error?: string;
|
|
79
|
-
resource: X402Resource;
|
|
80
|
-
accepts: VisaPaymentRequirements[];
|
|
81
|
-
extensions?: Record<string, unknown>;
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Visa verify response
|
|
85
|
-
*/
|
|
86
|
-
export interface VisaVerifyResponse {
|
|
87
|
-
isValid: boolean;
|
|
88
|
-
payer?: string;
|
|
89
|
-
invalidReason?: string;
|
|
90
|
-
remainingUsage?: number;
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Visa settlement response
|
|
94
|
-
*/
|
|
95
|
-
export interface VisaSettlementResponse {
|
|
96
|
-
success: boolean;
|
|
97
|
-
transaction: string;
|
|
98
|
-
network: 'visa:vts';
|
|
99
|
-
payer?: string;
|
|
100
|
-
errorReason?: string;
|
|
101
|
-
}
|
|
102
|
-
export declare const VISA_X402_HEADERS: {
|
|
103
|
-
readonly PAYMENT_REQUIRED: "PAYMENT-REQUIRED";
|
|
104
|
-
readonly PAYMENT_SIGNATURE: "PAYMENT-SIGNATURE";
|
|
105
|
-
readonly PAYMENT_RESPONSE: "PAYMENT-RESPONSE";
|
|
106
|
-
};
|
|
107
|
-
/**
|
|
108
|
-
* Build a Visa-flavored X402PaymentRequired object.
|
|
109
|
-
*
|
|
110
|
-
* This is the Visa counterpart of `buildPaymentRequired` (which builds NVM-flavored ones).
|
|
111
|
-
*/
|
|
112
|
-
export declare function buildVisaPaymentRequired(options: {
|
|
113
|
-
amount: string;
|
|
114
|
-
asset?: string;
|
|
115
|
-
payTo: string;
|
|
116
|
-
endpoint?: string;
|
|
117
|
-
description?: string;
|
|
118
|
-
maxTimeoutSeconds?: number;
|
|
119
|
-
merchantName?: string;
|
|
120
|
-
merchantUrl?: string;
|
|
121
|
-
merchantCountryCode?: string;
|
|
122
|
-
}): VisaPaymentRequired;
|
|
123
|
-
/**
|
|
124
|
-
* Visa Facilitator API — sends PAYMENT-SIGNATURE header to the Visa backend
|
|
125
|
-
* for verify and settle operations.
|
|
126
|
-
*/
|
|
127
|
-
export declare class VisaFacilitatorAPI extends FacilitatorAPI {
|
|
128
|
-
protected visaBackendUrl: string;
|
|
129
|
-
constructor(options: PaymentOptions);
|
|
130
|
-
static getInstance(options: PaymentOptions): VisaFacilitatorAPI;
|
|
131
|
-
/**
|
|
132
|
-
* Verify a Visa payment authorization.
|
|
133
|
-
*
|
|
134
|
-
* Sends the base64-encoded PaymentPayload as a PAYMENT-SIGNATURE header
|
|
135
|
-
* to the Visa backend's POST /verify endpoint.
|
|
136
|
-
*
|
|
137
|
-
* @param params - contains x402AccessToken, the base64-encoded PaymentPayload from the client
|
|
138
|
-
*/
|
|
139
|
-
verifyPermissions(params: VerifyPermissionsParams): Promise<VerifyPermissionsResult>;
|
|
140
|
-
/**
|
|
141
|
-
* Settle a Visa payment transaction.
|
|
142
|
-
*
|
|
143
|
-
* Sends the base64-encoded PaymentPayload as a PAYMENT-SIGNATURE header
|
|
144
|
-
* to the Visa backend's POST /settle endpoint.
|
|
145
|
-
*
|
|
146
|
-
* @param params - contains x402AccessToken, the base64-encoded PaymentPayload from the client
|
|
147
|
-
*/
|
|
148
|
-
settlePermissions(params: SettlePermissionsParams): Promise<SettlePermissionsResult>;
|
|
149
|
-
}
|
|
150
|
-
//# sourceMappingURL=visa-facilitator-api.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"visa-facilitator-api.d.ts","sourceRoot":"","sources":["../../src/x402/visa-facilitator-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,KAAK,EACV,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,YAAY,EACb,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAOnD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,8CAA8C;IAC9C,mBAAmB,EAAE,MAAM,CAAA;IAC3B,+CAA+C;IAC/C,aAAa,EAAE,MAAM,CAAA;IACrB,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAA;IAChB,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,mBAAmB;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,4BAA4B;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,UAAU,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,iBAAiB,EAAE,MAAM,CAAA;IACzB,KAAK,EAAE,gBAAgB,CAAA;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,YAAY,CAAA;IACtB,OAAO,EAAE,uBAAuB,EAAE,CAAA;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,UAAU,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAMD,eAAO,MAAM,iBAAiB;;;;CAIpB,CAAA;AAMV;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE;IAChD,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC7B,GAAG,mBAAmB,CAsCtB;AAMD;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,cAAc;IACpD,SAAS,CAAC,cAAc,EAAE,MAAM,CAAA;gBAEpB,OAAO,EAAE,cAAc;WAKnB,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,kBAAkB;IAIxE;;;;;;;OAOG;IACY,iBAAiB,CAC9B,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,uBAAuB,CAAC;IA6CnC;;;;;;;OAOG;IACY,iBAAiB,CAC9B,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,uBAAuB,CAAC;CA8CpC"}
|
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Visa Facilitator API — verifies and settles payments via the Visa x402 backend.
|
|
3
|
-
*
|
|
4
|
-
* Unlike the base FacilitatorAPI (which sends JSON bodies to the NVM backend),
|
|
5
|
-
* the Visa flow uses the PAYMENT-SIGNATURE HTTP header to transport a base64-encoded
|
|
6
|
-
* PaymentPayload to the Visa backend's /verify and /settle endpoints.
|
|
7
|
-
*
|
|
8
|
-
* @example
|
|
9
|
-
* ```typescript
|
|
10
|
-
* import { Payments } from '@nevermined-io/payments'
|
|
11
|
-
*
|
|
12
|
-
* const payments = Payments.getInstance({
|
|
13
|
-
* nvmApiKey: 'your-nvm-api-key',
|
|
14
|
-
* environment: 'sandbox',
|
|
15
|
-
* scheme: 'visa',
|
|
16
|
-
* })
|
|
17
|
-
*
|
|
18
|
-
* const paymentRequired = buildVisaPaymentRequired({
|
|
19
|
-
* amount: '2.00',
|
|
20
|
-
* asset: 'USD',
|
|
21
|
-
* payTo: 'merchant-id',
|
|
22
|
-
* endpoint: '/tools/random-article',
|
|
23
|
-
* })
|
|
24
|
-
*
|
|
25
|
-
* // The PAYMENT-SIGNATURE header from the client request
|
|
26
|
-
* const paymentSignature = req.headers['payment-signature'] as string
|
|
27
|
-
*
|
|
28
|
-
* const verification = await payments.facilitator.verifyPermissions({
|
|
29
|
-
* paymentRequired,
|
|
30
|
-
* x402AccessToken: paymentSignature,
|
|
31
|
-
* })
|
|
32
|
-
*
|
|
33
|
-
* if (verification.isValid) {
|
|
34
|
-
* const settlement = await payments.facilitator.settlePermissions({
|
|
35
|
-
* paymentRequired,
|
|
36
|
-
* x402AccessToken: paymentSignature,
|
|
37
|
-
* })
|
|
38
|
-
* }
|
|
39
|
-
* ```
|
|
40
|
-
*/
|
|
41
|
-
import { FacilitatorAPI } from './facilitator-api.js';
|
|
42
|
-
import { PaymentsError } from '../common/payments.error.js';
|
|
43
|
-
import { VisaBackendUrls } from '../environments.js';
|
|
44
|
-
// ---------------------------------------------------------------------------
|
|
45
|
-
// Visa x402 header names
|
|
46
|
-
// ---------------------------------------------------------------------------
|
|
47
|
-
export const VISA_X402_HEADERS = {
|
|
48
|
-
PAYMENT_REQUIRED: 'PAYMENT-REQUIRED',
|
|
49
|
-
PAYMENT_SIGNATURE: 'PAYMENT-SIGNATURE',
|
|
50
|
-
PAYMENT_RESPONSE: 'PAYMENT-RESPONSE',
|
|
51
|
-
};
|
|
52
|
-
// ---------------------------------------------------------------------------
|
|
53
|
-
// Helper: build a Visa PaymentRequired
|
|
54
|
-
// ---------------------------------------------------------------------------
|
|
55
|
-
/**
|
|
56
|
-
* Build a Visa-flavored X402PaymentRequired object.
|
|
57
|
-
*
|
|
58
|
-
* This is the Visa counterpart of `buildPaymentRequired` (which builds NVM-flavored ones).
|
|
59
|
-
*/
|
|
60
|
-
export function buildVisaPaymentRequired(options) {
|
|
61
|
-
const { amount, asset = 'USD', payTo, endpoint = '', description, maxTimeoutSeconds = 3600, merchantName, merchantUrl, merchantCountryCode, } = options;
|
|
62
|
-
return {
|
|
63
|
-
x402Version: 2,
|
|
64
|
-
resource: {
|
|
65
|
-
url: endpoint,
|
|
66
|
-
...(description && { description }),
|
|
67
|
-
},
|
|
68
|
-
accepts: [
|
|
69
|
-
{
|
|
70
|
-
scheme: 'visa',
|
|
71
|
-
network: 'visa:vts',
|
|
72
|
-
amount,
|
|
73
|
-
asset,
|
|
74
|
-
payTo,
|
|
75
|
-
maxTimeoutSeconds,
|
|
76
|
-
extra: {
|
|
77
|
-
vProvisionedTokenID: '',
|
|
78
|
-
instructionId: '',
|
|
79
|
-
maxUsage: 1,
|
|
80
|
-
...(merchantName && { merchantName }),
|
|
81
|
-
...(merchantUrl && { merchantUrl }),
|
|
82
|
-
...(merchantCountryCode && { merchantCountryCode }),
|
|
83
|
-
},
|
|
84
|
-
},
|
|
85
|
-
],
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
// ---------------------------------------------------------------------------
|
|
89
|
-
// VisaFacilitatorAPI
|
|
90
|
-
// ---------------------------------------------------------------------------
|
|
91
|
-
/**
|
|
92
|
-
* Visa Facilitator API — sends PAYMENT-SIGNATURE header to the Visa backend
|
|
93
|
-
* for verify and settle operations.
|
|
94
|
-
*/
|
|
95
|
-
export class VisaFacilitatorAPI extends FacilitatorAPI {
|
|
96
|
-
constructor(options) {
|
|
97
|
-
super(options);
|
|
98
|
-
this.visaBackendUrl = VisaBackendUrls[this.environmentName];
|
|
99
|
-
}
|
|
100
|
-
static getInstance(options) {
|
|
101
|
-
return new VisaFacilitatorAPI(options);
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Verify a Visa payment authorization.
|
|
105
|
-
*
|
|
106
|
-
* Sends the base64-encoded PaymentPayload as a PAYMENT-SIGNATURE header
|
|
107
|
-
* to the Visa backend's POST /verify endpoint.
|
|
108
|
-
*
|
|
109
|
-
* @param params - contains x402AccessToken, the base64-encoded PaymentPayload from the client
|
|
110
|
-
*/
|
|
111
|
-
async verifyPermissions(params) {
|
|
112
|
-
const { x402AccessToken } = params;
|
|
113
|
-
const url = new URL('verify', this.visaBackendUrl);
|
|
114
|
-
try {
|
|
115
|
-
const response = await fetch(url, {
|
|
116
|
-
method: 'POST',
|
|
117
|
-
headers: {
|
|
118
|
-
[VISA_X402_HEADERS.PAYMENT_SIGNATURE]: x402AccessToken,
|
|
119
|
-
},
|
|
120
|
-
});
|
|
121
|
-
if (!response.ok) {
|
|
122
|
-
let errorMessage = 'Visa payment verification failed';
|
|
123
|
-
try {
|
|
124
|
-
const errorData = await response.json();
|
|
125
|
-
errorMessage = errorData.invalidReason || errorData.message || errorMessage;
|
|
126
|
-
}
|
|
127
|
-
catch {
|
|
128
|
-
// Use default error message
|
|
129
|
-
}
|
|
130
|
-
throw PaymentsError.fromBackend(errorMessage, {
|
|
131
|
-
message: errorMessage,
|
|
132
|
-
code: `HTTP ${response.status}`,
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
const visaResult = await response.json();
|
|
136
|
-
// Map Visa response to the standard VerifyPermissionsResult shape
|
|
137
|
-
return {
|
|
138
|
-
isValid: visaResult.isValid,
|
|
139
|
-
payer: visaResult.payer,
|
|
140
|
-
invalidReason: visaResult.invalidReason,
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
catch (error) {
|
|
144
|
-
if (error instanceof PaymentsError) {
|
|
145
|
-
throw error;
|
|
146
|
-
}
|
|
147
|
-
throw PaymentsError.fromBackend('Network error during Visa payment verification', {
|
|
148
|
-
message: error instanceof Error ? error.message : String(error),
|
|
149
|
-
code: 'network_error',
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Settle a Visa payment transaction.
|
|
155
|
-
*
|
|
156
|
-
* Sends the base64-encoded PaymentPayload as a PAYMENT-SIGNATURE header
|
|
157
|
-
* to the Visa backend's POST /settle endpoint.
|
|
158
|
-
*
|
|
159
|
-
* @param params - contains x402AccessToken, the base64-encoded PaymentPayload from the client
|
|
160
|
-
*/
|
|
161
|
-
async settlePermissions(params) {
|
|
162
|
-
const { x402AccessToken } = params;
|
|
163
|
-
const url = new URL('settle', this.visaBackendUrl);
|
|
164
|
-
try {
|
|
165
|
-
const response = await fetch(url, {
|
|
166
|
-
method: 'POST',
|
|
167
|
-
headers: {
|
|
168
|
-
[VISA_X402_HEADERS.PAYMENT_SIGNATURE]: x402AccessToken,
|
|
169
|
-
},
|
|
170
|
-
});
|
|
171
|
-
if (!response.ok) {
|
|
172
|
-
let errorMessage = 'Visa payment settlement failed';
|
|
173
|
-
try {
|
|
174
|
-
const errorData = await response.json();
|
|
175
|
-
errorMessage = errorData.errorReason || errorData.message || errorMessage;
|
|
176
|
-
}
|
|
177
|
-
catch {
|
|
178
|
-
// Use default error message
|
|
179
|
-
}
|
|
180
|
-
throw PaymentsError.fromBackend(errorMessage, {
|
|
181
|
-
message: errorMessage,
|
|
182
|
-
code: `HTTP ${response.status}`,
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
const visaResult = await response.json();
|
|
186
|
-
// Map Visa response to the standard SettlePermissionsResult shape
|
|
187
|
-
return {
|
|
188
|
-
success: visaResult.success,
|
|
189
|
-
transaction: visaResult.transaction,
|
|
190
|
-
network: visaResult.network,
|
|
191
|
-
payer: visaResult.payer,
|
|
192
|
-
errorReason: visaResult.errorReason,
|
|
193
|
-
};
|
|
194
|
-
}
|
|
195
|
-
catch (error) {
|
|
196
|
-
if (error instanceof PaymentsError) {
|
|
197
|
-
throw error;
|
|
198
|
-
}
|
|
199
|
-
throw PaymentsError.fromBackend('Network error during Visa payment settlement', {
|
|
200
|
-
message: error instanceof Error ? error.message : String(error),
|
|
201
|
-
code: 'network_error',
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
//# sourceMappingURL=visa-facilitator-api.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"visa-facilitator-api.js","sourceRoot":"","sources":["../../src/x402/visa-facilitator-api.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Visa Facilitator API — verifies and settles payments via the Visa x402 backend.\n *\n * Unlike the base FacilitatorAPI (which sends JSON bodies to the NVM backend),\n * the Visa flow uses the PAYMENT-SIGNATURE HTTP header to transport a base64-encoded\n * PaymentPayload to the Visa backend's /verify and /settle endpoints.\n *\n * @example\n * ```typescript\n * import { Payments } from '@nevermined-io/payments'\n *\n * const payments = Payments.getInstance({\n * nvmApiKey: 'your-nvm-api-key',\n * environment: 'sandbox',\n * scheme: 'visa',\n * })\n *\n * const paymentRequired = buildVisaPaymentRequired({\n * amount: '2.00',\n * asset: 'USD',\n * payTo: 'merchant-id',\n * endpoint: '/tools/random-article',\n * })\n *\n * // The PAYMENT-SIGNATURE header from the client request\n * const paymentSignature = req.headers['payment-signature'] as string\n *\n * const verification = await payments.facilitator.verifyPermissions({\n * paymentRequired,\n * x402AccessToken: paymentSignature,\n * })\n *\n * if (verification.isValid) {\n * const settlement = await payments.facilitator.settlePermissions({\n * paymentRequired,\n * x402AccessToken: paymentSignature,\n * })\n * }\n * ```\n */\n\nimport { FacilitatorAPI } from './facilitator-api.js'\nimport type {\n VerifyPermissionsParams,\n VerifyPermissionsResult,\n SettlePermissionsParams,\n SettlePermissionsResult,\n X402Resource,\n} from './facilitator-api.js'\nimport { PaymentsError } from '../common/payments.error.js'\nimport { PaymentOptions } from '../common/types.js'\nimport { VisaBackendUrls } from '../environments.js'\n\n// ---------------------------------------------------------------------------\n// Visa-specific x402 types\n// ---------------------------------------------------------------------------\n\n/**\n * Visa-specific extra fields in PaymentRequirements\n */\nexport interface VisaPaymentExtra {\n /** Visa Token Service provisioned token ID */\n vProvisionedTokenID: string\n /** VIC instruction ID from mandate creation */\n instructionId: string\n /** Maximum number of times this payment can be used */\n maxUsage: number\n /** Merchant name */\n merchantName?: string\n /** Merchant URL */\n merchantUrl?: string\n /** Merchant country code */\n merchantCountryCode?: string\n}\n\n/**\n * Visa payment requirements (x402 v2 with scheme: \"visa\")\n */\nexport interface VisaPaymentRequirements {\n scheme: 'visa'\n network: 'visa:vts'\n amount: string\n asset: string\n payTo: string\n maxTimeoutSeconds: number\n extra: VisaPaymentExtra\n}\n\n/**\n * Visa-specific PaymentRequired response\n */\nexport interface VisaPaymentRequired {\n x402Version: 2\n error?: string\n resource: X402Resource\n accepts: VisaPaymentRequirements[]\n extensions?: Record<string, unknown>\n}\n\n/**\n * Visa verify response\n */\nexport interface VisaVerifyResponse {\n isValid: boolean\n payer?: string\n invalidReason?: string\n remainingUsage?: number\n}\n\n/**\n * Visa settlement response\n */\nexport interface VisaSettlementResponse {\n success: boolean\n transaction: string\n network: 'visa:vts'\n payer?: string\n errorReason?: string\n}\n\n// ---------------------------------------------------------------------------\n// Visa x402 header names\n// ---------------------------------------------------------------------------\n\nexport const VISA_X402_HEADERS = {\n PAYMENT_REQUIRED: 'PAYMENT-REQUIRED',\n PAYMENT_SIGNATURE: 'PAYMENT-SIGNATURE',\n PAYMENT_RESPONSE: 'PAYMENT-RESPONSE',\n} as const\n\n// ---------------------------------------------------------------------------\n// Helper: build a Visa PaymentRequired\n// ---------------------------------------------------------------------------\n\n/**\n * Build a Visa-flavored X402PaymentRequired object.\n *\n * This is the Visa counterpart of `buildPaymentRequired` (which builds NVM-flavored ones).\n */\nexport function buildVisaPaymentRequired(options: {\n amount: string\n asset?: string\n payTo: string\n endpoint?: string\n description?: string\n maxTimeoutSeconds?: number\n merchantName?: string\n merchantUrl?: string\n merchantCountryCode?: string\n}): VisaPaymentRequired {\n const {\n amount,\n asset = 'USD',\n payTo,\n endpoint = '',\n description,\n maxTimeoutSeconds = 3600,\n merchantName,\n merchantUrl,\n merchantCountryCode,\n } = options\n\n return {\n x402Version: 2,\n resource: {\n url: endpoint,\n ...(description && { description }),\n },\n accepts: [\n {\n scheme: 'visa',\n network: 'visa:vts',\n amount,\n asset,\n payTo,\n maxTimeoutSeconds,\n extra: {\n vProvisionedTokenID: '',\n instructionId: '',\n maxUsage: 1,\n ...(merchantName && { merchantName }),\n ...(merchantUrl && { merchantUrl }),\n ...(merchantCountryCode && { merchantCountryCode }),\n },\n },\n ],\n }\n}\n\n// ---------------------------------------------------------------------------\n// VisaFacilitatorAPI\n// ---------------------------------------------------------------------------\n\n/**\n * Visa Facilitator API — sends PAYMENT-SIGNATURE header to the Visa backend\n * for verify and settle operations.\n */\nexport class VisaFacilitatorAPI extends FacilitatorAPI {\n protected visaBackendUrl: string\n\n constructor(options: PaymentOptions) {\n super(options)\n this.visaBackendUrl = VisaBackendUrls[this.environmentName]\n }\n\n static override getInstance(options: PaymentOptions): VisaFacilitatorAPI {\n return new VisaFacilitatorAPI(options)\n }\n\n /**\n * Verify a Visa payment authorization.\n *\n * Sends the base64-encoded PaymentPayload as a PAYMENT-SIGNATURE header\n * to the Visa backend's POST /verify endpoint.\n *\n * @param params - contains x402AccessToken, the base64-encoded PaymentPayload from the client\n */\n override async verifyPermissions(\n params: VerifyPermissionsParams,\n ): Promise<VerifyPermissionsResult> {\n const { x402AccessToken } = params\n const url = new URL('verify', this.visaBackendUrl)\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n [VISA_X402_HEADERS.PAYMENT_SIGNATURE]: x402AccessToken,\n },\n })\n\n if (!response.ok) {\n let errorMessage = 'Visa payment verification failed'\n try {\n const errorData = await response.json()\n errorMessage = errorData.invalidReason || errorData.message || errorMessage\n } catch {\n // Use default error message\n }\n throw PaymentsError.fromBackend(errorMessage, {\n message: errorMessage,\n code: `HTTP ${response.status}`,\n })\n }\n\n const visaResult: VisaVerifyResponse = await response.json()\n\n // Map Visa response to the standard VerifyPermissionsResult shape\n return {\n isValid: visaResult.isValid,\n payer: visaResult.payer,\n invalidReason: visaResult.invalidReason,\n }\n } catch (error) {\n if (error instanceof PaymentsError) {\n throw error\n }\n throw PaymentsError.fromBackend('Network error during Visa payment verification', {\n message: error instanceof Error ? error.message : String(error),\n code: 'network_error',\n })\n }\n }\n\n /**\n * Settle a Visa payment transaction.\n *\n * Sends the base64-encoded PaymentPayload as a PAYMENT-SIGNATURE header\n * to the Visa backend's POST /settle endpoint.\n *\n * @param params - contains x402AccessToken, the base64-encoded PaymentPayload from the client\n */\n override async settlePermissions(\n params: SettlePermissionsParams,\n ): Promise<SettlePermissionsResult> {\n const { x402AccessToken } = params\n const url = new URL('settle', this.visaBackendUrl)\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n [VISA_X402_HEADERS.PAYMENT_SIGNATURE]: x402AccessToken,\n },\n })\n\n if (!response.ok) {\n let errorMessage = 'Visa payment settlement failed'\n try {\n const errorData = await response.json()\n errorMessage = errorData.errorReason || errorData.message || errorMessage\n } catch {\n // Use default error message\n }\n throw PaymentsError.fromBackend(errorMessage, {\n message: errorMessage,\n code: `HTTP ${response.status}`,\n })\n }\n\n const visaResult: VisaSettlementResponse = await response.json()\n\n // Map Visa response to the standard SettlePermissionsResult shape\n return {\n success: visaResult.success,\n transaction: visaResult.transaction,\n network: visaResult.network,\n payer: visaResult.payer,\n errorReason: visaResult.errorReason,\n }\n } catch (error) {\n if (error instanceof PaymentsError) {\n throw error\n }\n throw PaymentsError.fromBackend('Network error during Visa payment settlement', {\n message: error instanceof Error ? error.message : String(error),\n code: 'network_error',\n })\n }\n }\n}\n"]}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Visa Token API — generates x402 payment payloads via the Visa backend.
|
|
3
|
-
*
|
|
4
|
-
* Instead of generating a cryptographic NVM access token (which requires session keys
|
|
5
|
-
* and smart accounts), this API calls the Visa backend's /access-token endpoint
|
|
6
|
-
* with a vProvisionedTokenID + instructionId + amount to get a base64-encoded
|
|
7
|
-
* PaymentPayload suitable for the PAYMENT-SIGNATURE header.
|
|
8
|
-
*/
|
|
9
|
-
import { X402TokenAPI } from './token.js';
|
|
10
|
-
import { PaymentOptions } from '../common/types.js';
|
|
11
|
-
/**
|
|
12
|
-
* Response from the Visa backend's /access-token endpoint
|
|
13
|
-
*/
|
|
14
|
-
export interface VisaPaymentPayloadResponse {
|
|
15
|
-
success: boolean;
|
|
16
|
-
payload?: unknown;
|
|
17
|
-
payloadEncoded?: string;
|
|
18
|
-
error?: string;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Visa Token API — generates payment payloads for Visa x402 flow.
|
|
22
|
-
*/
|
|
23
|
-
export declare class VisaTokenAPI extends X402TokenAPI {
|
|
24
|
-
protected visaBackendUrl: string;
|
|
25
|
-
constructor(options: PaymentOptions);
|
|
26
|
-
static getInstance(options: PaymentOptions): VisaTokenAPI;
|
|
27
|
-
/**
|
|
28
|
-
* Generate a Visa x402 payment payload.
|
|
29
|
-
*
|
|
30
|
-
* When called with only `amount`, the Visa backend resolves the user's Visa
|
|
31
|
-
* credentials from the NVM API key sent in the Authorization header.
|
|
32
|
-
*
|
|
33
|
-
* When called with explicit Visa credentials (`vProvisionedTokenID` and
|
|
34
|
-
* `instructionId`), those are sent directly to the Visa backend.
|
|
35
|
-
*
|
|
36
|
-
* @param amount - The payment amount (e.g. "1.00")
|
|
37
|
-
* @param vProvisionedTokenID - The Visa Token Service provisioned token ID (optional)
|
|
38
|
-
* @param instructionId - The VIC mandate instruction ID (optional)
|
|
39
|
-
* @returns A promise resolving to an object with `accessToken` (the base64-encoded PaymentPayload)
|
|
40
|
-
*
|
|
41
|
-
* @example
|
|
42
|
-
* ```typescript
|
|
43
|
-
* // Using NVM API key (credentials resolved by backend)
|
|
44
|
-
* const result = await payments.x402.getVisaAccessToken('1.00')
|
|
45
|
-
*
|
|
46
|
-
* // Using explicit Visa credentials
|
|
47
|
-
* const result = await payments.x402.getVisaAccessToken(
|
|
48
|
-
* '2.00',
|
|
49
|
-
* 'token-id-from-visa',
|
|
50
|
-
* 'instruction-id-from-mandate',
|
|
51
|
-
* )
|
|
52
|
-
* // Use result.accessToken as the PAYMENT-SIGNATURE header value
|
|
53
|
-
* ```
|
|
54
|
-
*/
|
|
55
|
-
getVisaAccessToken(amount: string, vProvisionedTokenID?: string, instructionId?: string): Promise<{
|
|
56
|
-
accessToken: string;
|
|
57
|
-
[key: string]: any;
|
|
58
|
-
}>;
|
|
59
|
-
}
|
|
60
|
-
//# sourceMappingURL=visa-token-api.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"visa-token-api.d.ts","sourceRoot":"","sources":["../../src/x402/visa-token-api.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAGnD;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAC5C,SAAS,CAAC,cAAc,EAAE,MAAM,CAAA;gBAEpB,OAAO,EAAE,cAAc;WAKnB,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,YAAY;IAIlE;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACG,kBAAkB,CACtB,MAAM,EAAE,MAAM,EACd,mBAAmB,CAAC,EAAE,MAAM,EAC5B,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;CAuDxD"}
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Visa Token API — generates x402 payment payloads via the Visa backend.
|
|
3
|
-
*
|
|
4
|
-
* Instead of generating a cryptographic NVM access token (which requires session keys
|
|
5
|
-
* and smart accounts), this API calls the Visa backend's /access-token endpoint
|
|
6
|
-
* with a vProvisionedTokenID + instructionId + amount to get a base64-encoded
|
|
7
|
-
* PaymentPayload suitable for the PAYMENT-SIGNATURE header.
|
|
8
|
-
*/
|
|
9
|
-
import { X402TokenAPI } from './token.js';
|
|
10
|
-
import { PaymentsError } from '../common/payments.error.js';
|
|
11
|
-
import { VisaBackendUrls } from '../environments.js';
|
|
12
|
-
/**
|
|
13
|
-
* Visa Token API — generates payment payloads for Visa x402 flow.
|
|
14
|
-
*/
|
|
15
|
-
export class VisaTokenAPI extends X402TokenAPI {
|
|
16
|
-
constructor(options) {
|
|
17
|
-
super(options);
|
|
18
|
-
this.visaBackendUrl = VisaBackendUrls[this.environmentName];
|
|
19
|
-
}
|
|
20
|
-
static getInstance(options) {
|
|
21
|
-
return new VisaTokenAPI(options);
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Generate a Visa x402 payment payload.
|
|
25
|
-
*
|
|
26
|
-
* When called with only `amount`, the Visa backend resolves the user's Visa
|
|
27
|
-
* credentials from the NVM API key sent in the Authorization header.
|
|
28
|
-
*
|
|
29
|
-
* When called with explicit Visa credentials (`vProvisionedTokenID` and
|
|
30
|
-
* `instructionId`), those are sent directly to the Visa backend.
|
|
31
|
-
*
|
|
32
|
-
* @param amount - The payment amount (e.g. "1.00")
|
|
33
|
-
* @param vProvisionedTokenID - The Visa Token Service provisioned token ID (optional)
|
|
34
|
-
* @param instructionId - The VIC mandate instruction ID (optional)
|
|
35
|
-
* @returns A promise resolving to an object with `accessToken` (the base64-encoded PaymentPayload)
|
|
36
|
-
*
|
|
37
|
-
* @example
|
|
38
|
-
* ```typescript
|
|
39
|
-
* // Using NVM API key (credentials resolved by backend)
|
|
40
|
-
* const result = await payments.x402.getVisaAccessToken('1.00')
|
|
41
|
-
*
|
|
42
|
-
* // Using explicit Visa credentials
|
|
43
|
-
* const result = await payments.x402.getVisaAccessToken(
|
|
44
|
-
* '2.00',
|
|
45
|
-
* 'token-id-from-visa',
|
|
46
|
-
* 'instruction-id-from-mandate',
|
|
47
|
-
* )
|
|
48
|
-
* // Use result.accessToken as the PAYMENT-SIGNATURE header value
|
|
49
|
-
* ```
|
|
50
|
-
*/
|
|
51
|
-
async getVisaAccessToken(amount, vProvisionedTokenID, instructionId) {
|
|
52
|
-
const hasExplicitCredentials = vProvisionedTokenID && instructionId;
|
|
53
|
-
const url = hasExplicitCredentials
|
|
54
|
-
? new URL('access-token', this.visaBackendUrl)
|
|
55
|
-
: new URL('access-token/from-nvm-key', this.visaBackendUrl);
|
|
56
|
-
const body = hasExplicitCredentials
|
|
57
|
-
? { vProvisionedTokenID, instructionId, amount }
|
|
58
|
-
: { amount };
|
|
59
|
-
const fetchOptions = hasExplicitCredentials
|
|
60
|
-
? {
|
|
61
|
-
method: 'POST',
|
|
62
|
-
headers: {
|
|
63
|
-
Accept: 'application/json',
|
|
64
|
-
'Content-Type': 'application/json',
|
|
65
|
-
},
|
|
66
|
-
body: JSON.stringify(body),
|
|
67
|
-
}
|
|
68
|
-
: this.getBackendHTTPOptions('POST', body);
|
|
69
|
-
try {
|
|
70
|
-
const response = await fetch(url, fetchOptions);
|
|
71
|
-
if (!response.ok) {
|
|
72
|
-
let errorMessage = 'Failed to generate Visa payment payload';
|
|
73
|
-
try {
|
|
74
|
-
const errorData = await response.json();
|
|
75
|
-
errorMessage = errorData.error || errorData.message || errorMessage;
|
|
76
|
-
}
|
|
77
|
-
catch {
|
|
78
|
-
// Use default error message
|
|
79
|
-
}
|
|
80
|
-
throw PaymentsError.internal(`${errorMessage} (HTTP ${response.status})`);
|
|
81
|
-
}
|
|
82
|
-
const result = await response.json();
|
|
83
|
-
if (!result.success || !result.payloadEncoded) {
|
|
84
|
-
throw PaymentsError.internal(result.error || 'Failed to generate Visa payment payload');
|
|
85
|
-
}
|
|
86
|
-
return {
|
|
87
|
-
accessToken: result.payloadEncoded,
|
|
88
|
-
payload: result.payload,
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
catch (error) {
|
|
92
|
-
if (error instanceof PaymentsError) {
|
|
93
|
-
throw error;
|
|
94
|
-
}
|
|
95
|
-
throw PaymentsError.internal(`Network error while generating Visa payment payload: ${error instanceof Error ? error.message : String(error)}`);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
//# sourceMappingURL=visa-token-api.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"visa-token-api.js","sourceRoot":"","sources":["../../src/x402/visa-token-api.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Visa Token API — generates x402 payment payloads via the Visa backend.\n *\n * Instead of generating a cryptographic NVM access token (which requires session keys\n * and smart accounts), this API calls the Visa backend's /access-token endpoint\n * with a vProvisionedTokenID + instructionId + amount to get a base64-encoded\n * PaymentPayload suitable for the PAYMENT-SIGNATURE header.\n */\n\nimport { X402TokenAPI } from './token.js'\nimport { PaymentsError } from '../common/payments.error.js'\nimport { PaymentOptions } from '../common/types.js'\nimport { VisaBackendUrls } from '../environments.js'\n\n/**\n * Response from the Visa backend's /access-token endpoint\n */\nexport interface VisaPaymentPayloadResponse {\n success: boolean\n payload?: unknown\n payloadEncoded?: string\n error?: string\n}\n\n/**\n * Visa Token API — generates payment payloads for Visa x402 flow.\n */\nexport class VisaTokenAPI extends X402TokenAPI {\n protected visaBackendUrl: string\n\n constructor(options: PaymentOptions) {\n super(options)\n this.visaBackendUrl = VisaBackendUrls[this.environmentName]\n }\n\n static override getInstance(options: PaymentOptions): VisaTokenAPI {\n return new VisaTokenAPI(options)\n }\n\n /**\n * Generate a Visa x402 payment payload.\n *\n * When called with only `amount`, the Visa backend resolves the user's Visa\n * credentials from the NVM API key sent in the Authorization header.\n *\n * When called with explicit Visa credentials (`vProvisionedTokenID` and\n * `instructionId`), those are sent directly to the Visa backend.\n *\n * @param amount - The payment amount (e.g. \"1.00\")\n * @param vProvisionedTokenID - The Visa Token Service provisioned token ID (optional)\n * @param instructionId - The VIC mandate instruction ID (optional)\n * @returns A promise resolving to an object with `accessToken` (the base64-encoded PaymentPayload)\n *\n * @example\n * ```typescript\n * // Using NVM API key (credentials resolved by backend)\n * const result = await payments.x402.getVisaAccessToken('1.00')\n *\n * // Using explicit Visa credentials\n * const result = await payments.x402.getVisaAccessToken(\n * '2.00',\n * 'token-id-from-visa',\n * 'instruction-id-from-mandate',\n * )\n * // Use result.accessToken as the PAYMENT-SIGNATURE header value\n * ```\n */\n async getVisaAccessToken(\n amount: string,\n vProvisionedTokenID?: string,\n instructionId?: string,\n ): Promise<{ accessToken: string; [key: string]: any }> {\n const hasExplicitCredentials = vProvisionedTokenID && instructionId\n\n const url = hasExplicitCredentials\n ? new URL('access-token', this.visaBackendUrl)\n : new URL('access-token/from-nvm-key', this.visaBackendUrl)\n\n const body = hasExplicitCredentials\n ? { vProvisionedTokenID, instructionId, amount }\n : { amount }\n\n const fetchOptions = hasExplicitCredentials\n ? {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n }\n : this.getBackendHTTPOptions('POST', body)\n\n try {\n const response = await fetch(url, fetchOptions)\n\n if (!response.ok) {\n let errorMessage = 'Failed to generate Visa payment payload'\n try {\n const errorData = await response.json()\n errorMessage = errorData.error || errorData.message || errorMessage\n } catch {\n // Use default error message\n }\n throw PaymentsError.internal(`${errorMessage} (HTTP ${response.status})`)\n }\n\n const result: VisaPaymentPayloadResponse = await response.json()\n\n if (!result.success || !result.payloadEncoded) {\n throw PaymentsError.internal(result.error || 'Failed to generate Visa payment payload')\n }\n\n return {\n accessToken: result.payloadEncoded,\n payload: result.payload,\n }\n } catch (error) {\n if (error instanceof PaymentsError) {\n throw error\n }\n throw PaymentsError.internal(\n `Network error while generating Visa payment payload: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n }\n}\n"]}
|