Continue a Flutterwave v4 campaign charge
Submits PIN or OTP authorization for a previously initialized campaign charge. The controller validates the Redis charge state against client, program, charge id, and optional session id before sending the normalized authorization payload to Flutterwave. It stores the updated charge state and returns the same charge response shape as initialization.
curl --request PUT \
--url https://api.gratona.com/v1/frontend/flutterwave-v4/campaign-charge/{client_id}/{program_id}/{charge_id}/{session_id} \
--header 'Content-Type: application/json' \
--data '
{
"authorization": {
"type": "otp",
"pin": {
"value": "1234"
},
"otp": {
"value": "123456"
}
}
}
'import requests
url = "https://api.gratona.com/v1/frontend/flutterwave-v4/campaign-charge/{client_id}/{program_id}/{charge_id}/{session_id}"
payload = { "authorization": {
"type": "otp",
"pin": { "value": "1234" },
"otp": { "value": "123456" }
} }
headers = {"Content-Type": "application/json"}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({authorization: {type: 'otp', pin: {value: '1234'}, otp: {value: '123456'}}})
};
fetch('https://api.gratona.com/v1/frontend/flutterwave-v4/campaign-charge/{client_id}/{program_id}/{charge_id}/{session_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.gratona.com/v1/frontend/flutterwave-v4/campaign-charge/{client_id}/{program_id}/{charge_id}/{session_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'authorization' => [
'type' => 'otp',
'pin' => [
'value' => '1234'
],
'otp' => [
'value' => '123456'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.gratona.com/v1/frontend/flutterwave-v4/campaign-charge/{client_id}/{program_id}/{charge_id}/{session_id}"
payload := strings.NewReader("{\n \"authorization\": {\n \"type\": \"otp\",\n \"pin\": {\n \"value\": \"1234\"\n },\n \"otp\": {\n \"value\": \"123456\"\n }\n }\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.gratona.com/v1/frontend/flutterwave-v4/campaign-charge/{client_id}/{program_id}/{charge_id}/{session_id}")
.header("Content-Type", "application/json")
.body("{\n \"authorization\": {\n \"type\": \"otp\",\n \"pin\": {\n \"value\": \"1234\"\n },\n \"otp\": {\n \"value\": \"123456\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/frontend/flutterwave-v4/campaign-charge/{client_id}/{program_id}/{charge_id}/{session_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"authorization\": {\n \"type\": \"otp\",\n \"pin\": {\n \"value\": \"1234\"\n },\n \"otp\": {\n \"value\": \"123456\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{}{
"message": "Not Found",
"status": "error"
}{
"errors": {},
"status": "error",
"message": "The given data was invalid."
}{
"message": "Something went wrong. Please try again.",
"status": "error",
"error": "invalid_request",
"code": "DONOR_NOT_FOUND"
}{
"message": "Something went wrong. Please try again.",
"status": "error",
"error": "invalid_request",
"code": "DONOR_NOT_FOUND"
}Path Parameters
Client id stored in the Redis charge state.
Program id stored in the Redis charge state.
Flutterwave charge id returned by initialization and used as the Redis state key.
Optional Redis frontend session id. When supplied, it must match the session stored for the charge.
Body
Authorization must match the charge's current next action.
Show child attributes
Show child attributes
Response
Flutterwave charge continued.
The response is of type object.
curl --request PUT \
--url https://api.gratona.com/v1/frontend/flutterwave-v4/campaign-charge/{client_id}/{program_id}/{charge_id}/{session_id} \
--header 'Content-Type: application/json' \
--data '
{
"authorization": {
"type": "otp",
"pin": {
"value": "1234"
},
"otp": {
"value": "123456"
}
}
}
'import requests
url = "https://api.gratona.com/v1/frontend/flutterwave-v4/campaign-charge/{client_id}/{program_id}/{charge_id}/{session_id}"
payload = { "authorization": {
"type": "otp",
"pin": { "value": "1234" },
"otp": { "value": "123456" }
} }
headers = {"Content-Type": "application/json"}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({authorization: {type: 'otp', pin: {value: '1234'}, otp: {value: '123456'}}})
};
fetch('https://api.gratona.com/v1/frontend/flutterwave-v4/campaign-charge/{client_id}/{program_id}/{charge_id}/{session_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.gratona.com/v1/frontend/flutterwave-v4/campaign-charge/{client_id}/{program_id}/{charge_id}/{session_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'authorization' => [
'type' => 'otp',
'pin' => [
'value' => '1234'
],
'otp' => [
'value' => '123456'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.gratona.com/v1/frontend/flutterwave-v4/campaign-charge/{client_id}/{program_id}/{charge_id}/{session_id}"
payload := strings.NewReader("{\n \"authorization\": {\n \"type\": \"otp\",\n \"pin\": {\n \"value\": \"1234\"\n },\n \"otp\": {\n \"value\": \"123456\"\n }\n }\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.gratona.com/v1/frontend/flutterwave-v4/campaign-charge/{client_id}/{program_id}/{charge_id}/{session_id}")
.header("Content-Type", "application/json")
.body("{\n \"authorization\": {\n \"type\": \"otp\",\n \"pin\": {\n \"value\": \"1234\"\n },\n \"otp\": {\n \"value\": \"123456\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/frontend/flutterwave-v4/campaign-charge/{client_id}/{program_id}/{charge_id}/{session_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"authorization\": {\n \"type\": \"otp\",\n \"pin\": {\n \"value\": \"1234\"\n },\n \"otp\": {\n \"value\": \"123456\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{}{
"message": "Not Found",
"status": "error"
}{
"errors": {},
"status": "error",
"message": "The given data was invalid."
}{
"message": "Something went wrong. Please try again.",
"status": "error",
"error": "invalid_request",
"code": "DONOR_NOT_FOUND"
}{
"message": "Something went wrong. Please try again.",
"status": "error",
"error": "invalid_request",
"code": "DONOR_NOT_FOUND"
}