Repository navigation
Expand file tree
/
Copy path001_init_pay_tables.sql
More file actions
111 lines (100 loc) · 3.82 KB
/
Copy path001_init_pay_tables.sql
File metadata and controls
111 lines (100 loc) · 3.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
-- Pay Plugin Database Schema
-- Initial table creation with auto-update triggers for updated_at
-- 1. Create the trigger function first
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ language 'plpgsql';
-- 2. Create tables
CREATE TABLE IF NOT EXISTS pay_order (
id BIGSERIAL PRIMARY KEY,
order_no VARCHAR(64) UNIQUE NOT NULL,
user_id BIGINT NOT NULL,
amount VARCHAR(32) NOT NULL,
currency VARCHAR(8) NOT NULL DEFAULT 'CNY',
status VARCHAR(32) NOT NULL DEFAULT 'CREATED',
channel VARCHAR(32) NOT NULL DEFAULT 'alipay',
title VARCHAR(512),
expire_at TIMESTAMP,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS pay_payment (
id BIGSERIAL PRIMARY KEY,
payment_no VARCHAR(64) UNIQUE NOT NULL,
order_no VARCHAR(64) NOT NULL REFERENCES pay_order(order_no),
status VARCHAR(32) NOT NULL DEFAULT 'INIT',
amount VARCHAR(32) NOT NULL,
request_payload TEXT,
response_payload TEXT,
channel_trade_no VARCHAR(64),
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS pay_refund (
id BIGSERIAL PRIMARY KEY,
refund_no VARCHAR(64) UNIQUE NOT NULL,
order_no VARCHAR(64) NOT NULL REFERENCES pay_order(order_no),
payment_no VARCHAR(64) NOT NULL REFERENCES pay_payment(payment_no),
status VARCHAR(32) NOT NULL DEFAULT 'REFUND_INIT',
amount VARCHAR(32) NOT NULL,
channel_refund_no VARCHAR(64),
request_payload TEXT,
response_payload TEXT,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS pay_callback (
id BIGSERIAL PRIMARY KEY,
payment_no VARCHAR(64) NOT NULL REFERENCES pay_payment(payment_no),
raw_body TEXT NOT NULL,
signature VARCHAR(512),
serial_no VARCHAR(64),
verified BOOLEAN NOT NULL DEFAULT FALSE,
processed BOOLEAN NOT NULL DEFAULT FALSE,
received_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
-- Note: callbacks are generally insert-only, so no updated_at needed here
);
CREATE TABLE IF NOT EXISTS pay_idempotency (
idempotency_key VARCHAR(128) PRIMARY KEY,
request_hash VARCHAR(64) NOT NULL,
response_snapshot TEXT,
expire_at TIMESTAMP,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS pay_ledger (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL,
order_no VARCHAR(64) NOT NULL,
payment_no VARCHAR(64),
entry_type VARCHAR(32) NOT NULL,
amount VARCHAR(32) NOT NULL,
balance VARCHAR(32),
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
-- Note: ledger entries are immutable (append-only), so no updated_at needed here
);
-- 3. Attach triggers to tables that have updated_at
DROP TRIGGER IF EXISTS update_pay_order_modtime ON pay_order;
CREATE TRIGGER update_pay_order_modtime
BEFORE UPDATE ON pay_order
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();
DROP TRIGGER IF EXISTS update_pay_payment_modtime ON pay_payment;
CREATE TRIGGER update_pay_payment_modtime
BEFORE UPDATE ON pay_payment
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();
DROP TRIGGER IF EXISTS update_pay_refund_modtime ON pay_refund;
CREATE TRIGGER update_pay_refund_modtime
BEFORE UPDATE ON pay_refund
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();
DROP TRIGGER IF EXISTS update_pay_idempotency_modtime ON pay_idempotency;
CREATE TRIGGER update_pay_idempotency_modtime
BEFORE UPDATE ON pay_idempotency
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();