Skip to content
Headers & Signing

Headers & Signing

HeaderBuilder menyusun kumpulan header wajib SNAP untuk sebuah request transaksi sekaligus menandatanganinya — ini satu-satunya tipe yang dibutuhkan setiap fungsi pemanggil.

HeaderBuilder

type HeaderBuilder struct {
	Method      string // metode HTTP, mis. "POST"
	EndpointURL string // URL endpoint lengkap yang dipakai dalam string yang ditandatangani
	Body        []byte // byte body request yang sebenarnya

	B2B2C                 bool   // apakah ini request B2B2C
	AccessToken           string // bearer token Authorization
	AuthorizationCustomer string // bearer token Authorization-Customer; wajib bila B2B2C true
	DeviceID              string // X-DEVICE-ID; wajib bila B2B2C true

	ClientKey  string
	PartnerID  string
	ExternalID string
	ChannelID  string

	Origin    string // opsional; header dihilangkan bila kosong
	IPAddress string
	Latitude  string
	Longitude string

	Profile Profile

	Symmetric    bool
	ClientSecret string        // dipakai bila Symmetric true
	Signer       crypto.Signer // dipakai bila Symmetric false
}

Symmetric memilih fungsi signing mana yang dipakai, sesuai parameter BuildStringToSignTransaction sendiri — isi tepat salah satu dari ClientSecret (HMAC) atau Signer (RSA), sesuai kesepakatan integrasi Anda dengan partner saat registrasi.

Fungsi pemanggil di setiap package domain mengatur Body sendiri, dari byte hasil marshal request bertipe — Anda tidak perlu mengaturnya sendiri untuk pemanggilan normal.

Build()

func (b HeaderBuilder) Build() (http.Header, error)

Menyusun http.Header untuk request, menandatanganinya lewat BuildStringToSignTransaction dan SignSymmetric/SignAsymmetric sesuai flag Symmetric. Anda biasanya tidak pernah memanggil ini langsung — snap.Transport.Do yang memanggilnya untuk Anda.

Profile — hook kustomisasi per-PJP

Standar ini menyerahkan dua hal ke masing-masing PJP (Penyedia Jasa Pembayaran): format timestamp dan cara URL path dibangun. Profile adalah interface yang dipakai HeaderBuilder dan TokenManager untuk keduanya:

type Profile interface {
	TimestampLayout() string
	BuildPath(serviceGroup, productType string) string
}

DefaultProfile mengimplementasikan perilaku standar apa adanya:

type DefaultProfile struct {
	Domain  string
	Version string
}
func (p DefaultProfile) TimestampLayout() string
func (p DefaultProfile) BuildPath(serviceGroup, productType string) string

TimestampLayout mengembalikan snap.DefaultTimestampLayout (layout time Go yang setara dengan yyyy-MM-ddTHH:mm:ss.SSSTZD milik standar). BuildPath mengembalikan /{domain}/{version}/{service-group}/{product-type}, dengan Version default ke "v1.0" bila tidak diisi.

Penyimpangan khusus suatu bank diekspresikan sebagai struct kecil yang meng-embed DefaultProfile dan meng-override satu method — bukan dengan fork dari HeaderBuilder.

Selanjutnya