From 3d29a1cf144c785c8a210c1e85061968446b2433 Mon Sep 17 00:00:00 2001 From: Shulhan Date: Thu, 9 Mar 2023 18:47:08 +0700 Subject: all: export the CallbackUrl, ReturnUrl, and Signature in MerchantInquiry This is to allow the MerchantInquiry API to be more customize able instead of fixed, using specific merchant configuration. While at it change the MerchantInquiry method parameter to pointer, because to allow the caller receive filled Signature for audit. --- client.go | 11 ++++----- client_test.go | 2 +- merchant_inquiry.go | 64 ++++++++++++++++++++++++++--------------------------- 3 files changed, 37 insertions(+), 40 deletions(-) diff --git a/client.go b/client.go index 0933840..68790b1 100644 --- a/client.go +++ b/client.go @@ -265,20 +265,17 @@ func (cl *Client) ListBank() (banks []Bank, err error) { // numbers, QRIS, e-wallet, and so on). // // Ref: https://docs.duitku.com/api/en/#request-transaction -func (cl *Client) MerchantInquiry(req MerchantInquiry) (resp *MerchantInquiryResponse, err error) { +func (cl *Client) MerchantInquiry(req *MerchantInquiry) (resp *MerchantInquiryResponse, err error) { var ( - logp = `MerchantInquiry` - inreq = merchantInquiry{ - MerchantInquiry: req, - } + logp = `MerchantInquiry` httpRes *http.Response resBody []byte ) - inreq.sign(cl.opts) + req.sign(cl.opts) - httpRes, resBody, err = cl.PostJSON(PathMerchantInquiry, nil, inreq) + httpRes, resBody, err = cl.PostJSON(PathMerchantInquiry, nil, req) if err != nil { return nil, fmt.Errorf(`%s: %w`, logp, err) } diff --git a/client_test.go b/client_test.go index 2c58db5..109712d 100644 --- a/client_test.go +++ b/client_test.go @@ -228,7 +228,7 @@ func TestClient_MerchantInquiry(t *testing.T) { t.Fatal(err) } - resp, err = testClientMerchant.MerchantInquiry(*req) + resp, err = testClientMerchant.MerchantInquiry(req) if err != nil { t.Fatal(err) } diff --git a/merchant_inquiry.go b/merchant_inquiry.go index 9c8495a..622c764 100644 --- a/merchant_inquiry.go +++ b/merchant_inquiry.go @@ -11,6 +11,15 @@ import ( // MerchantInquiry define request data for payment using merchant. type MerchantInquiry struct { + // [REQ] MerchantCode is a project that use Duitku. + // + // You can get this code on every project you register on the + // [merchant portal]. + // Default to ClientOptions.MerchantCode. + // + // [merchant portal]: https://passport.duitku.com/merchant/Project + MerchantCode string `json:"merchantCode"` + // [REQ] Transaction number from merchant. // Every request for a new transaction must use a new ID. MerchantOrderId string `json:"merchantOrderId"` @@ -36,6 +45,19 @@ type MerchantInquiry struct { // [REQ] The name that would be shown at bank payment system. CustomerVaName string `json:"customerVaName"` + // [REQ] A link that is used for redirect after exit payment page, + // being paid or not. + // Default to ClientOptions.MerchantReturnUrl. + ReturnUrl string `json:"returnUrl"` + + // [REQ] A link for callback transaction. + // Default to ClientOptions.MerchantCallbackUrl. + CallbackUrl string `json:"callbackUrl"` + + // [REQ] Transaction security identification code. + // Formula: MD5(merchantCode + merchantOrderId + paymentAmount + apiKey). + Signature string `json:"signature"` + // [OPT] Additional parameter to be used by merchant. // If its set, the value must be URL encoded. AdditionalParam string `json:"additionalParam,omitempty"` @@ -73,40 +95,18 @@ type MerchantInquiry struct { ExpiryPeriod int `json:"expiryPeriod,omitempty"` } -// merchantInquiry contains internal fields that will be set by client -// during Sign. -type merchantInquiry struct { - // [REQ] A link for callback transaction. - // Default to ClientOptions.MerchantCallbackUrl. - CallbackUrl string `json:"callbackUrl"` - - // [REQ] MerchantCode is a project that use Duitku. - // - // You can get this code on every project you register on the - // [merchant portal]. - // Default to ClientOptions.MerchantCode. - // - // [merchant portal]: https://passport.duitku.com/merchant/Project - MerchantCode string `json:"merchantCode"` - - // [REQ] A link that is used for redirect after exit payment page, - // being paid or not. - // Default to ClientOptions.MerchantReturnUrl. - ReturnUrl string `json:"returnUrl"` - - // [REQ] Transaction security identification code. - // Formula: MD5(merchantCode + merchantOrderId + paymentAmount + apiKey). - Signature string `json:"signature"` - - MerchantInquiry -} - -func (inq *merchantInquiry) sign(opts ClientOptions) { +func (inq *MerchantInquiry) sign(opts ClientOptions) { var merchant = opts.Merchant(inq.PaymentMethod) - inq.CallbackUrl = merchant.CallbackUrl - inq.MerchantCode = merchant.Code - inq.ReturnUrl = merchant.ReturnUrl + if len(inq.MerchantCode) == 0 { + inq.MerchantCode = merchant.Code + } + if len(inq.CallbackUrl) == 0 { + inq.CallbackUrl = merchant.CallbackUrl + } + if len(inq.ReturnUrl) == 0 { + inq.ReturnUrl = merchant.ReturnUrl + } var ( plain = fmt.Sprintf(`%s%s%d%s`, inq.MerchantCode, inq.MerchantOrderId, inq.PaymentAmount, merchant.ApiKey) -- cgit v1.3