b2c method

Future<Map<String, String>> b2c(
  1. String initiatorName,
  2. String securityCredential,
  3. String? commandid,
  4. int amount,
  5. String partyA,
  6. String partyB,
  7. String remarks,
  8. Uri queueTimeOutURL,
  9. Uri resultURL, {
  10. String? occasion,
})

Implementation

Future<Map<String, String>> b2c(String initiatorName, String securityCredential, String? commandid,
    int amount, String partyA, String partyB, String remarks, Uri queueTimeOutURL, Uri resultURL,
    {String? occasion}) async {
  await setAccessToken();

  // this values can be got from; https://developer.safaricom.co.ke/test_credentials
  final b2cPayload = {
    "InitiatorName": initiatorName,
    "SecurityCredential": securityCredential,
    "CommandID": commandid,
    "Amount": amount,
    "PartyA": partyA,
    "PartyB": partyB,
    "Remarks": remarks,
    "QueueTimeOutURL": queueTimeOutURL.toString(),
    "ResultURL": resultURL.toString(),
    "Occasion": occasion
  };
  final Map<String, String> result = Map<String, String>();

  // todo: handle exceptions
  HttpClient client = HttpClient();
  HttpClientRequest req = await client.postUrl(getB2cUrl());
  req.headers.add("Content-Type", "application/json");
  req.headers.add("Authorization", "Bearer " + access_token);
  req.write(jsonEncode(b2cPayload)); // write is non-blocking
  HttpClientResponse res = await req.close();

  await utf8.decoder.bind(res).forEach((bodyString) {
    dynamic jsondecodeBody = jsonDecode(bodyString);

    if (res.statusCode == 200) {
      result["ConversationID"] = jsondecodeBody["ConversationID"].toString();
      result["OriginatorConversationID"] = jsondecodeBody["OriginatorConversationID"].toString();
      result["ResponseCode"] = jsondecodeBody["ResponseCode"].toString();
      result["ResponseDescription"] = jsondecodeBody["ResponseDescription"].toString();
    } else {
      result["requestId"] = jsondecodeBody["requestId"].toString();
      result["errorCode"] = jsondecodeBody["errorCode"].toString();
      result["errorMessage"] = jsondecodeBody["errorMessage"].toString();
    }
  });
  return result;
}