async def build_payment_req(wallet_handle: int,
                            submitter_did: str,
                            inputs_json: str,
                            outputs_json: str,
                            extra: Optional[str]) -> (str, str):
    """
    Builds Indy request for doing payment
    according to this payment method.
   
    This method consumes set of inputs and outputs.
   
    Format of inputs is specific for payment method. Usually it should reference payment transaction
    with at least one output that corresponds to payment address that user owns.

    :param wallet_handle: wallet handle (created by open_wallet).
    :param submitter_did : (Option) DID of request sender
    :param inputs_json: The list of payment sources as json array:
      ["source1", ...]
      Note that each source should reference payment address    
    :param outputs_json: The list of outputs as json array:
      [{
        recipient: <str>, // payment address of recipient
        amount: <int>, // amount
      }]
    :param extra: // optional information for payment operation

    :return: payment_req_json: Indy request for doing payment
             payment_method: used payment method
    """

    logger = logging.getLogger(__name__)
    logger.debug("build_payment_req: >>> wallet_handle: %r, submitter_did: %r, inputs_json: %r, outputs_json: %r,"
                 " extra: %r",
                 wallet_handle,
                 submitter_did,
                 inputs_json,
                 outputs_json,
                 extra)

    if not hasattr(build_payment_req, "cb"):
        logger.debug("build_payment_req: Creating callback")
        build_payment_req.cb = create_cb(CFUNCTYPE(None, c_int32, c_int32, c_char_p, c_char_p))

    c_wallet_handle = c_int32(wallet_handle)
    c_submitter_did = c_char_p(submitter_did.encode('utf-8')) if submitter_did is not None else None
    c_inputs_json = c_char_p(inputs_json.encode('utf-8'))
    c_outputs_json = c_char_p(outputs_json.encode('utf-8'))
    c_extra = c_char_p(extra.encode('utf-8')) if extra is not None else None

    (payment_req_json, payment_method) = await do_call('indy_build_payment_req',
                                                       c_wallet_handle,
                                                       c_submitter_did,
                                                       c_inputs_json,
                                                       c_outputs_json,
                                                       c_extra,
                                                       build_payment_req.cb)
    res = (payment_req_json.decode(), payment_method.decode())

    logger.debug("build_payment_req: <<< res: %r", res)
    return res
Builds Indy request for doing payment
    according to this payment method.
   
    This method consumes set of inputs and outputs.
   
    Format of inputs is specific for payment method. Usually it should reference payment transaction
    with at least one output that corresponds to payment address that user owns.

    :param wallet_handle: wallet handle (created by open_wallet).
    :param submitter_did : (Option) DID of request sender
    :param inputs_json: The list of payment sources as json array:
      ["source1", ...]
      Note that each source should reference payment address    
    :param outputs_json: The list of outputs as json array:
      [{
        recipient: <str>, // payment address of recipient
        amount: <int>, // amount
      }]
    :param extra: // optional information for payment operation

    :return: payment_req_json: Indy request for doing payment
             payment_method: used payment method