Skip to content

Registrasi

Registrasi

Account binding, registrasi kartu, dan verifikasi OTP — package registration (Service Code 01-10, 81). Ada dua alur di sini: alur account (binding berbasis OAuth, dimulai dari GetOAuthURLAccountBinding) dan alur card (CardRegistration beserta varian Set Limit/Inquiry/Unbinding-nya).

resp, err := registration.AccountBinding(ctx, transport, hb, registration.AccountBindingRequest{
	MerchantID: "...",
})
if err != nil {
	// errors.Is(err, snap.ErrBadRequest), snap.ErrUnauthorized, etc.
}

Setiap fungsi di bawah punya bentuk pemanggilan yang sama: isi hb (semua field kecuali Body — fungsinya sendiri yang marshal request dan mengatur Body), panggil, lalu cek err. Lihat Core Conventions untuk pola lengkapnya.

GetOAuthURL

Memulai alur OAuth account-binding dengan membangun URL otorisasi (Service Code 10). Ini panggilan GET read-only: hb.EndpointURL harus berupa URL http(s) polos tanpa query string atau fragment — kalau tidak, akan error, bukan diam-diam digabung jadi satu.

func GetOAuthURL(ctx context.Context, t *snap.Transport, hb snap.HeaderBuilder, req GetOAuthURLRequest) (GetOAuthURLResponse, error)

Request — GetOAuthURLRequest

Beda dari endpoint lain di sini, ini bukan JSON — GetOAuthURL membangun query string URL langsung dari field-field ini. RedirectURL, Scopes, dan State bersifat Wajib; SeamlessSign bersifat Kondisional (wajib hanya jika SeamlessData diisi); sisanya Opsional.

Query parameterTypePresence
RedirectURLstringWajib
Scopes[]string (digabung dengan ,)Wajib
StatestringWajib
MerchantIDstringOpsional
SubMerchantIDstringOpsional
Langstring (ISO 639-1)Opsional
AllowRegistration*boolOpsional
SeamlessDatastringOpsional
MobileNumberstringOpsional
VerifiedTimestringOpsional
ExternalUIDstringOpsional
DeviceIDstringOpsional
SeamlessSignstringKondisional — wajib jika SeamlessData diisi

Response — GetOAuthURLResponse

Semua field Wajib.

FieldTypePresence
responseCodestringWajib
responseMessagestringWajib
authCodestringWajib
statestringWajib

AccountCreation

Membuat sebuah account (Service Code 06).

Tidak idempotent. Saat retry, pakai X-EXTERNAL-ID yang sama — kalau pakai yang baru, berisiko membuat account kedua.

func AccountCreation(ctx context.Context, t *snap.Transport, hb snap.HeaderBuilder, req AccountCreationRequest) (AccountCreationResponse, error)

Request — AccountCreationRequest

Semua field Opsional — endpoint ini mencakup beberapa alur onboarding (seamless data, redirect OAuth, pembuatan langsung), masing-masing memakai subset field yang berbeda.

FieldTypePresence
partnerReferenceNostringOpsional
countryCodestringOpsional
customerIdstringOpsional
deviceInfo*DeviceInfoOpsional
emailstringOpsional
langstringOpsional
localestringOpsional
namestringOpsional
onboardingPartnerstringOpsional
phoneNostringOpsional
redirectUrlstringOpsional
scopesstringOpsional
seamlessDatastringOpsional
seamlessSignstringOpsional
statestringOpsional
merchantIdstringOpsional
subMerchantIdstringOpsional
terminalTypejson.RawMessageOpsional
additionalInfojson.RawMessageOpsional
DeviceInfo fields

DeviceInfo mendeskripsikan perangkat yang memulai request registrasi.

FieldTypePresence
osstringOpsional
osVersionstringOpsional
modelstringOpsional
manufacturerstringOpsional

Response — AccountCreationResponse

apiKey bertipe json.RawMessage karena standarnya tidak menyebutkan apakah dikirim sebagai string berkutip atau angka polos — tipe ini menerima keduanya tanpa menggagalkan seluruh proses decode.

FieldTypePresence
responseCodestringWajib
responseMessagestringWajib
referenceNostringOpsional
partnerReferenceNostringOpsional
authCodestringOpsional
apiKeyjson.RawMessageOpsional
accountIdstringOpsional
statestringOpsional
additionalInfojson.RawMessageOpsional

AccountBinding

Mengikat (bind) account customer untuk pemakaian B2B2C (Service Code 07).

Tidak idempotent. Saat retry, pakai X-EXTERNAL-ID yang sama — kalau pakai yang baru, berisiko membuat binding ganda atau token terbit dua kali.

func AccountBinding(ctx context.Context, t *snap.Transport, hb snap.HeaderBuilder, req AccountBindingRequest) (AccountBindingResponse, error)

Request — AccountBindingRequest

MerchantID satu-satunya field Wajib.

FieldTypePresence
partnerReferenceNostringOpsional
actionstringOpsional
additionalDatajson.RawMessageOpsional
userIdstringOpsional
emailstringOpsional
postalAddressstringOpsional
authCodestringOpsional
grantTypestringOpsional
isBindAndPaystringOpsional
langstringOpsional
localestringOpsional
merchantIdstringWajib
subMerchantIdstringOpsional
msisdnstringOpsional
otpstringOpsional
phoneNostringOpsional
platformTypestringOpsional
redirectUrlstringOpsional
referenceIdstringOpsional
refreshTokenstringOpsional
successParams*BindingSuccessParamsOpsional
additionalInfojson.RawMessageOpsional
BindingSuccessParams fields

Objek successParams di sisi request.

FieldTypePresence
accountIdstringOpsional
terminalIdstringOpsional
tokenRequestorIdstringOpsional

Response — AccountBindingResponse

FieldTypePresence
responseCodestringWajib
responseMessagestringWajib
referenceNostringOpsional
partnerReferenceNostringOpsional
accountTokenstringOpsional
accessTokenInfo*BindingAccessTokenInfoOpsional
linkIdstringOpsional
nextActionstringOpsional
linkageTokenstringOpsional
paramsjson.RawMessageOpsional
pinWebViewUrlstringOpsional
redirectToDeeplinkstringOpsional
redirectUrlstringOpsional
userInfo*BindingUserInfoOpsional
additionalInfojson.RawMessageOpsional
BindingAccessTokenInfo fields

Objek accessTokenInfo di sisi response. expiresIn/reExpiresIn di sini adalah string datetime ISO 8601 — beda bentuk dari Token.ExpiresIn milik endpoint access-token B2B/B2B2C (durasi hasil parsing dari hitungan detik). Nama field sama, endpoint beda, makna beda.

FieldTypePresence
accessTokenstringOpsional
expiresInstringOpsional
refreshTokenstringOpsional
reExpiresInstringOpsional
tokenStatusstringOpsional
BindingUserInfo fields

Objek userInfo di sisi response.

FieldTypePresence
publicUserIdstringOpsional

AccountBindingInquiry

Mencari detail account yang sudah di-bind (Service Code 08).

func AccountBindingInquiry(ctx context.Context, t *snap.Transport, hb snap.HeaderBuilder, req AccountBindingInquiryRequest) (AccountBindingInquiryResponse, error)

Request — AccountBindingInquiryRequest

Standarnya tidak mendefinisikan field identifier account untuk panggilan ini; jika PJP Anda butuh satu, taruh di AdditionalInfo.

FieldTypePresence
partnerReferenceNostringOpsional
additionalInfojson.RawMessageOpsional

Response — AccountBindingInquiryResponse

Lebih flat dibanding AccountBindingResponse — tidak ada nesting accessTokenInfo/userInfo. accountTransactionLimit bertipe json.RawMessage karena standarnya tidak menjamin field ini selalu dikirim sebagai string berkutip di semua PJP.

FieldTypePresence
responseCodestringWajib
responseMessagestringWajib
referenceNostringOpsional
partnerReferenceNostringOpsional
accountCurrencystringOpsional
accountNamestringOpsional
accountNostringOpsional
accountTransactionLimitjson.RawMessageOpsional
endDatePeriodstringOpsional
startDatePeriodstringOpsional
additionalInfojson.RawMessageOpsional

AccountUnbinding

Menghapus sebuah account binding (Service Code 09).

Tidak idempotent. Saat retry, pakai X-EXTERNAL-ID yang sama.

func AccountUnbinding(ctx context.Context, t *snap.Transport, hb snap.HeaderBuilder, req AccountUnbindingRequest) (AccountUnbindingResponse, error)

Request — AccountUnbindingRequest

MerchantID satu-satunya field Wajib. LinkID dan TokenID — yang sebenarnya mengidentifikasi binding mana yang mau dihapus — keduanya Opsional menurut standar; package ini tidak memaksa salah satunya harus diisi, karena itu aturan bisnis, bukan aturan bentuk wire.

FieldTypePresence
partnerReferenceNostringOpsional
linkIdstringOpsional
merchantIdstringWajib
subMerchantIdstringOpsional
tokenIdstringOpsional
additionalInfojson.RawMessageOpsional

Response — AccountUnbindingResponse

FieldTypePresence
responseCodestringWajib
responseMessagestringWajib
referenceNostringOpsional
partnerReferenceNostringOpsional
merchantIdstringOpsional
subMerchantIdstringOpsional
linkIdstringOpsional
unlinkResultstringOpsional
additionalInfojson.RawMessageOpsional

OTP

Memicu pengiriman OTP, misalnya lewat SMS (Service Code 81).

Memicu efek samping nyata di luar sistem. Saat retry, pakai X-EXTERNAL-ID yang sama — kalau pakai yang baru, berisiko OTP terkirim dua kali.

func OTP(ctx context.Context, t *snap.Transport, hb snap.HeaderBuilder, req OTPRequest) (OTPResponse, error)

Request — OTPRequest

JourneyID satu-satunya field Wajib. Untuk panggilan bentuk B2B2C, atur HeaderBuilder.B2B2C (dan AuthorizationCustomer/DeviceID) sama seperti endpoint B2B2C lainnya — tidak ada field khusus di sini. BankCardToken bersifat Kondisional.

FieldTypePresence
partnerReferenceNostringOpsional
journeyIdstringWajib
merchantIdstringOpsional
subMerchantstringOpsional
externalStoreIdstringOpsional
trxDateTimestringOpsional
bankCardTokenstringKondisional
otpTrxCodestringOpsional
otpReasonCodestringOpsional
otpReasonMessagestringOpsional
additionalInfojson.RawMessageOpsional

Response — OTPResponse

chargeToken bersifat Wajib di sini (padahal Opsional di CardRegistrationResponse — nama field sama, endpoint beda).

FieldTypePresence
responseCodestringWajib
responseMessagestringWajib
referenceNostringOpsional
partnerReferenceNostringOpsional
chargeTokenstringWajib
additionalInfojson.RawMessageOpsional

VerifyOTP

Memverifikasi OTP yang sudah diterbitkan sebelumnya (Service Code 04, Direct Integration).

Tidak idempotent — verifikasi mengonsumsi state di sisi server (membatalkan OTP, kemungkinan terhitung sebagai satu percobaan). Saat retry, pakai X-EXTERNAL-ID yang sama — kalau pakai yang baru, berisiko membakar percobaan ekstra atau memproses ulang panggilan yang sudah selesai.

func VerifyOTP(ctx context.Context, t *snap.Transport, hb snap.HeaderBuilder, req VerifyOTPRequest) (VerifyOTPResponse, error)

Request — VerifyOTPRequest

Semua field Opsional.

FieldTypePresence
originalPartnerReferenceNostringOpsional
originalReferenceNostringOpsional
actionstringOpsional
merchantIdstringOpsional
otpstringOpsional
chargeTokenstringOpsional
typestringOpsional
additionalInfojson.RawMessageOpsional

Response — VerifyOTPResponse

FieldTypePresence
responseCodestringWajib
responseMessagestringWajib
originalReferenceNostringOpsional
originalPartnerReferenceNostringOpsional
accountNostringOpsional
bankCardTokenstringOpsional
cardPanstringOpsional
customerIdstringOpsional
emailstringOpsional
expiredDatetimestringOpsional
expiryDatestringOpsional
identificationNostringOpsional
linkageTokenstringOpsional
phoneNostringOpsional
qParamsURLstringOpsional
qParamsjson.RawMessageOpsional
sendOtpFlagstringOpsional
subscribeDatetimestringOpsional
tokenExpiryTimestringOpsional
transactionTimestampstringOpsional
additionalInfojson.RawMessageOpsional

CardRegistration

Mendaftarkan kartu dan menerbitkan BankCardToken (Service Code 01).

Tidak idempotent — setiap panggilan menerbitkan token baru. Saat retry, pakai X-EXTERNAL-ID yang sama — kalau pakai yang baru, berisiko membuat bind kartu ganda.

func CardRegistration(ctx context.Context, t *snap.Transport, hb snap.HeaderBuilder, req CardRegistrationRequest) (CardRegistrationResponse, error)

Request — CardRegistrationRequest

BankCardNo dan CustIDMerchant adalah dua field Wajib. CardData dan Limit bertipe json.RawMessage — standarnya mengizinkan bentuk JSON non-string (objek polos atau angka) untuk keduanya. Kalau Anda mengisi dari string Go, kutip dulu sendiri (contoh: json.RawMessage(“1000000”), bukan json.RawMessage(limitStr)) supaya sesuai bentuk wire yang diharapkan.

FieldTypePresence
partnerReferenceNostringOpsional
accountNamestringOpsional
cardDatajson.RawMessageOpsional
bankAccountNostringOpsional
bankCardNostringWajib
bankCardTypestringOpsional
dateOfBirthstringOpsional
emailstringOpsional
expiredDatetimestringOpsional
expiryDatestringOpsional
identificationNostringOpsional
identificationTypestringOpsional
custIdMerchantstringWajib
isBindAndPaystringOpsional
merchantIdstringOpsional
terminalIdstringOpsional
journeyIdstringOpsional
subMerchantIdstringOpsional
externalStoreIdstringOpsional
limitjson.RawMessageOpsional
merchantLogoUrlstringOpsional
phoneNostringOpsional
sendOtpFlagstringOpsional
typestringOpsional
additionalInfojson.RawMessageOpsional

Response — CardRegistrationResponse

FieldTypePresence
responseCodestringWajib
responseMessagestringWajib
referenceNostringOpsional
partnerReferenceNostringOpsional
bankCardTokenstringWajib
chargeTokenstringOpsional
randomStringstringOpsional
tokenExpiryTimestringOpsional
additionalInfojson.RawMessageOpsional

CardRegistrationInquiry

Mencari account kartu terdaftar berdasarkan ID customer merchant (Service Code 03). Ini satu-satunya endpoint GET read-only di package ini; custIDMerchant dikirim sebagai segmen path URL, sudah divalidasi dan digabung dengan aman ke hb.EndpointURL.

func CardRegistrationInquiry(ctx context.Context, t *snap.Transport, hb snap.HeaderBuilder, custIDMerchant string) (CardRegistrationInquiryResponse, error)

Endpoint ini tidak punya request body bertipe selain parameter panggilan di atas.

Response — CardRegistrationInquiryResponse

FieldTypePresence
responseCodestringWajib
responseMessagestringWajib
accountList[]CardRegistrationInquiryAccountOpsional
additionalInfojson.RawMessageOpsional
CardRegistrationInquiryAccount fields

Satu entri di accountList, membungkus objek accountData di dalamnya.

FieldTypePresence
accountDataCardRegistrationInquiryAccountDataWajib
CardRegistrationInquiryAccountData fields

Objek accountData di dalamnya. maxLimit dan credentialNo adalah string tampilan yang sudah di-mask/diformat (contoh: "************0750"), bukan nilai mentah.

FieldTypePresence
accountIdstringOpsional
createdDatestringOpsional
credentialNostringOpsional
credentialTypestringOpsional
maxLimitstringOpsional
statusstringOpsional

CardRegistrationSetLimit

Mengatur limit transaksi pada kartu terdaftar (Service Code 02).

func CardRegistrationSetLimit(ctx context.Context, t *snap.Transport, hb snap.HeaderBuilder, req CardRegistrationSetLimitRequest) (CardRegistrationSetLimitResponse, error)

Request — CardRegistrationSetLimitRequest

BankCardToken satu-satunya field Wajib. Limit bertipe json.RawMessage dengan alasan sama seperti di CardRegistrationRequest — kutip dulu string Go-nya sebelum diisikan (contoh: json.RawMessage(“1000000”)).

FieldTypePresence
partnerReferenceNostringOpsional
bankAccountNostringOpsional
bankCardNostringOpsional
limitjson.RawMessageOpsional
bankCardTokenstringWajib
otpstringOpsional
additionalInfojson.RawMessageOpsional

Response — CardRegistrationSetLimitResponse

FieldTypePresence
responseCodestringWajib
responseMessagestringWajib
referenceNostringOpsional
partnerReferenceNostringOpsional
additionalInfojson.RawMessageOpsional

CardRegistrationUnbinding

Menghapus registrasi kartu (Service Code 05).

Tidak idempotent. Saat retry, pakai X-EXTERNAL-ID yang sama.

func CardRegistrationUnbinding(ctx context.Context, t *snap.Transport, hb snap.HeaderBuilder, req CardRegistrationUnbindingRequest) (CardRegistrationUnbindingResponse, error)

Request — CardRegistrationUnbindingRequest

Token satu-satunya field Wajib.

FieldTypePresence
partnerReferenceNostringOpsional
tokenstringWajib
bankCardNostringOpsional
typestringOpsional
partstringOpsional
merchantIdstringOpsional
subMerchantIdstringOpsional
terminalIdstringOpsional
tokenRequestorIdstringOpsional
journeyIdstringOpsional
transactionDatestringOpsional
additionalInfojson.RawMessageOpsional

Response — CardRegistrationUnbindingResponse

FieldTypePresence
responseCodestringWajib
responseMessagestringWajib
referenceNostringOpsional
partnerReferenceNostringOpsional
messagestringOpsional
customerIdstringOpsional
unsubscribeDatestringOpsional
additionalInfojson.RawMessageOpsional