// On non-conflict errors, retry cancelling the order later func (order *Order) doCancel(success bool, log string) error { cancelLog := log // Try to cancel the shipment, if necessary shipment, err := catalogApi.GetShipment(order.shop.catalogEndpoint, order.ShipmentId) if err != nil { return err } if !success && shipment.Status != catalogApi.ShipmentCancelled { err := catalogApi.CancelShipment(order.shop.catalogEndpoint, order.ShipmentId) if err != nil { if isConflictError(err) { cancelLog += fmt.Sprintf("\nError cancelling shipment: %v", err) } else { return err } } else { cancelLog += "\nShipment cancelled" } } else { cancelLog += "\nShipment " + string(shipment.Status) } // Try to cancel the payment, if necessary payment, err := paymentApi.FetchPayment(order.shop.paymentEndpoint, order.PaymentId) if err != nil { return err } if !success && payment.Status != paymentApi.PaymentFailed { err := paymentApi.CancelPayment(order.shop.paymentEndpoint, order.PaymentId) if err != nil { if isConflictError(err) { cancelLog += fmt.Sprintf("\nError cancelling payment: %v", err) } else { return err } } else { cancelLog += "\nPayment cancelled" } } cancelLog += "\nPayment was " + payment.Status if payment.Error != "" { cancelLog += ", error: " + payment.Error } // Remove the order from the list of open orders & store cancel log return order.shop.redis.Transaction(func(redis services.Redis) error { order.Status = cancelLog err := redis.Cmd("srem", open_orders_key, order.id).Err() if err != nil { return err } return order.SaveIn(redis) }) }
func (order *Order) commitPayment() bool { payment, err := paymentApi.FetchPayment(order.shop.paymentEndpoint, order.PaymentId) if order.checkError(err) { return false } switch payment.Status { case paymentApi.PaymentCreated, paymentApi.PaymentPending: err := paymentApi.CommitPayment(order.shop.paymentEndpoint, order.PaymentId) _ = order.checkError(err) // TODO maybe check that state changed to committed? return false case paymentApi.PaymentCommitted: // Waiting for payment to be processed return false case paymentApi.PaymentProcessed: return true default: order.Cancel(fmt.Errorf("Payment has status %v", payment.Status)) return false } }