diff --git a/main.go b/main.go index dcd8550..21aa012 100644 --- a/main.go +++ b/main.go @@ -29,7 +29,7 @@ import ( ) const ( - buildVersion = "1.0.13" + buildVersion = "1.0.14" serviceName = "hardlink" customLayout = "2006-01-02 15:04:05 -0700" transactionUrl = "http://127.0.0.1:18181/start-transaction/" @@ -259,7 +259,7 @@ func (app *App) startTransaction(w http.ResponseWriter, r *http.Request) { return } - client := &http.Client{Timeout: 90 * time.Second} + client := &http.Client{Timeout: 300 * time.Second} response, err := client.Post(transactionUrl, "text/xml", r.Body) if err != nil { logging.Error(serviceName, err.Error(), "Payment processing error", string(op), "", "", 0) diff --git a/payment/creditcall.go b/payment/creditcall.go index 2cae8d3..d742009 100644 --- a/payment/creditcall.go +++ b/payment/creditcall.go @@ -218,63 +218,45 @@ func nullableFloatArg(nf sql.NullFloat64) interface{} { } func BuildRedirectURL(result map[string]string) string { - // 1) normalize the result code + var msgType, description string + q := url.Values{} + res := strings.ToLower(result["TRANSACTION_RESULT"]) - // 2) pick base path and optional error params - var basePath string - var msgType, description string - - switch res { - case ResultApproved: - basePath = CheckinSuccessfulEndpoint - - case ResultDeclined: - basePath = CheckinUnsuccessfulEndpoint - msgType = "declined" - description = "payment declined" - - case ResultCancelled: - basePath = CheckinUnsuccessfulEndpoint - msgType = "cancelled" - description = "payment cancelled by customer" - - case ResultPending: - // you could choose to treat pending as unsuccessful or special-case it - basePath = CheckinUnsuccessfulEndpoint - msgType = "pending" - description = "payment pending" - case ResultError: - basePath = CheckinUnsuccessfulEndpoint - msgType = "error" - description = result["ERROR"] - - default: - basePath = CheckinUnsuccessfulEndpoint - msgType = "error" - description = "unknown transaction result" + if res == ResultApproved { + q.Set("TxnReference", result["REFERENCE"]) + q.Set("CardHash", hex.EncodeToString([]byte(result["CARD_HASH"]))) + q.Set("CardReference", hex.EncodeToString([]byte(result["CARD_REFERENCE"]))) + u := url.URL{ + Path: CheckinSuccessfulEndpoint, + RawQuery: q.Encode(), + } + return u.String() } - if msgType != "" { - log.Warnf("Transaction %s: %s - %s", res, msgType, description) + msgType = ResultError + if res != "" { + msgType = res } - // 3) build query params - q := url.Values{} - q.Set("TxnReference", result["REFERENCE"]) - q.Set("CardHash", hex.EncodeToString([]byte(result["CARD_HASH"]))) - q.Set("CardReference", hex.EncodeToString([]byte(result["CARD_REFERENCE"]))) - - // only append these when non-approved - if msgType != "" { - q.Set("MsgType", msgType) - q.Set("Description", description) + errors, ok := result["ERRORS"] + if ok && errors != "" { + description = errors + } + errors, ok = result["ERROR"] + if ok && errors != "" { + description += " " + errors + } + if description == "" { + description = "Transaction failed" } - // 4) assemble final URL - // note: url.URL automatically escapes values in RawQuery + log.Errorf("Transaction %s: %s", msgType, description) + + q.Set("MsgType", msgType) + q.Set("Description", description) u := url.URL{ - Path: basePath, + Path: CheckinUnsuccessfulEndpoint, RawQuery: q.Encode(), } return u.String() diff --git a/release notes.md b/release notes.md index 9227238..9f04fa0 100644 --- a/release notes.md +++ b/release notes.md @@ -2,44 +2,47 @@ builtVersion is a const in main.go +#### 1.0.14 - 21 August 2025 +fixed issue in creditcall payment processing where error description was not properly set + #### 1.0.13 - 21 August 2025 TCP/IP connection to the lock server is now established before encoding the keycard and closedafter the encoding is done. -#### 1.0.12 - 11 August 2024 +#### 1.0.12 - 11 August 2025 added delay before checking dispenser status -#### 1.0.11 - 11 August 2024 +#### 1.0.11 - 11 August 2025 updated Salto key encoding workflow -#### 1.0.10 - 08 August 2024 +#### 1.0.10 - 08 August 2025 updated logging for TLJ locks -#### 1.0.9 - 08 August 2024 +#### 1.0.9 - 08 August 2025 added TLJ lock server and implemented workflow for TLJ locks -#### 1.0.8 - 01 August 2024 +#### 1.0.8 - 01 August 2025 improved error handling and logging in Salto -#### 1.0.7 - 25 July 2024 +#### 1.0.7 - 25 July 2025 added check if the room exists -#### 1.0.6 - 25 July 2024 +#### 1.0.6 - 25 July 2025 updated workflow for Salto locks -#### 1.0.5 - 24 July 2024 +#### 1.0.5 - 24 July 2025 added encoding keycard copy for Salto locks -#### 1.0.4 - 22 July 2024 +#### 1.0.4 - 22 July 2025 added salto lock server and implemented workflow for Salto -#### 1.0.0 - 30 June 2024 +#### 1.0.0 - 30 June 2025 added creditcall payment method `/starttransaction` - API payment endpoint to start a transaction -#### 0.9.1 - 22 May 2024 +#### 0.9.1 - 22 May 2025 added lockserver interface and implemented workflow for Omnitec -#### 0.9.0 - 22 May 2024 +#### 0.9.0 - 22 May 2025 The new API has two new endpoints: - `/issuedoorcard` - encoding the door card for the room. - `/printroomticket` - printing the room ticket. \ No newline at end of file