ec51e87d2d
A generic multi-client payment gateway so FlatRender, meezi.ir and bargevasat.ir can all pay through ZarinPal's single verified callback domain (pay.flatrender.ir). New Go service services/payment (clones the notification skeleton + vendored deps): - migration 31_payment_broker.sql — `payment` schema: client_apps, transactions, webhook_deliveries. - ZarinPal v4 client ported from the proven identity PaymentService (request.json -> StartPay -> verify.json; codes 100/101). - client API: POST /v1/pay/request + /v1/pay/inquiry, authed by X-Api-Key + HMAC body signature; GET /callback/zarinpal (the single verified endpoint) verifies, then 302s the user back to the site's return_url (signed) and fires a signed, retried webhook. - per-client ZarinPal merchant override (default = shared merchant); amount stored canonically in Rial, unit to ZarinPal env-configurable. - admin API /v1/admin/* (FlatRender admin JWT): client-app CRUD + key issue/rotate + transactions list. Deploy wiring: payment-svc in docker-compose.v2.yml (host port 1607), pay.flatrender.ir server block in mirror-nginx conf, ENV_FILE + README updates (cert SAN + manual migration note). Admin UI: src/components/admin/PaymentsAdmin.tsx (client apps with one-time key reveal + rotate, transactions table) + /admin/payments page + nav link + fa/en strings; pay-admin proxy route to payment-svc. Docs/SDK: deploy/PAYMENTS.md (integration contract) + deploy/sdk/flatpay.js (zero-dep Node client + webhook verifier) for meezi/any site. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
79 lines
2.0 KiB
Makefile
79 lines
2.0 KiB
Makefile
GO ?= go
|
|
GOFMT ?= gofmt "-s"
|
|
GO_VERSION=$(shell $(GO) version | cut -c 14- | cut -d' ' -f1 | cut -d'.' -f2)
|
|
PACKAGES ?= $(shell $(GO) list ./...)
|
|
VETPACKAGES ?= $(shell $(GO) list ./... | grep -v /examples/)
|
|
GOFILES := $(shell find . -name "*.go")
|
|
TESTFOLDER := $(shell $(GO) list ./... | grep -E 'gin$$|binding$$|render$$' | grep -v examples)
|
|
TESTTAGS ?= ""
|
|
|
|
.PHONY: test
|
|
test:
|
|
echo "mode: count" > coverage.out
|
|
for d in $(TESTFOLDER); do \
|
|
$(GO) test $(TESTTAGS) -v -covermode=count -coverprofile=profile.out $$d > tmp.out; \
|
|
cat tmp.out; \
|
|
if grep -q "^--- FAIL" tmp.out; then \
|
|
rm tmp.out; \
|
|
exit 1; \
|
|
elif grep -q "build failed" tmp.out; then \
|
|
rm tmp.out; \
|
|
exit 1; \
|
|
elif grep -q "setup failed" tmp.out; then \
|
|
rm tmp.out; \
|
|
exit 1; \
|
|
fi; \
|
|
if [ -f profile.out ]; then \
|
|
cat profile.out | grep -v "mode:" >> coverage.out; \
|
|
rm profile.out; \
|
|
fi; \
|
|
done
|
|
|
|
.PHONY: fmt
|
|
fmt:
|
|
$(GOFMT) -w $(GOFILES)
|
|
|
|
.PHONY: fmt-check
|
|
fmt-check:
|
|
@diff=$$($(GOFMT) -d $(GOFILES)); \
|
|
if [ -n "$$diff" ]; then \
|
|
echo "Please run 'make fmt' and commit the result:"; \
|
|
echo "$${diff}"; \
|
|
exit 1; \
|
|
fi;
|
|
|
|
.PHONY: vet
|
|
vet:
|
|
$(GO) vet $(VETPACKAGES)
|
|
|
|
.PHONY: lint
|
|
lint:
|
|
@hash golint > /dev/null 2>&1; if [ $$? -ne 0 ]; then \
|
|
$(GO) get -u golang.org/x/lint/golint; \
|
|
fi
|
|
for PKG in $(PACKAGES); do golint -set_exit_status $$PKG || exit 1; done;
|
|
|
|
.PHONY: misspell-check
|
|
misspell-check:
|
|
@hash misspell > /dev/null 2>&1; if [ $$? -ne 0 ]; then \
|
|
$(GO) get -u github.com/client9/misspell/cmd/misspell; \
|
|
fi
|
|
misspell -error $(GOFILES)
|
|
|
|
.PHONY: misspell
|
|
misspell:
|
|
@hash misspell > /dev/null 2>&1; if [ $$? -ne 0 ]; then \
|
|
$(GO) get -u github.com/client9/misspell/cmd/misspell; \
|
|
fi
|
|
misspell -w $(GOFILES)
|
|
|
|
.PHONY: tools
|
|
tools:
|
|
@if [ $(GO_VERSION) -gt 15 ]; then \
|
|
$(GO) install golang.org/x/lint/golint@latest; \
|
|
$(GO) install github.com/client9/misspell/cmd/misspell@latest; \
|
|
elif [ $(GO_VERSION) -lt 16 ]; then \
|
|
$(GO) install golang.org/x/lint/golint; \
|
|
$(GO) install github.com/client9/misspell/cmd/misspell; \
|
|
fi
|