To generate a signed URL:

verifier = ActiveSupport::MessageVerifier.new(ENV['SIGNATURE_SECRET_KEY'])
signed_param = verifier.generate("my-url-param-to-sign", expires_in: 1.hour)
url = callback_url(signed_order_id: signed_param)

To parse the signed URL:

verifier = ActiveSupport::MessageVerifier.new(ENV['SIGNATURE_SECRET_KEY'])
 
begin do
  order_id = verifier.verify(params[:signed_order_id])
rescue ActiveSupport::MessageVerifier::InvalidSignature
  head :not_found
end

verifier.verify(params[:signed_order_id]) returns nil when signature is invalid (instead of throwing an exception).