def make_402_payment(self, response, max_price):
"""Make an on-chain payment."""
# Retrieve payment headers
headers = response.headers
price = headers.get(OnChainRequests.HTTP_BITCOIN_PRICE)
payee_address = headers.get(OnChainRequests.HTTP_BITCOIN_ADDRESS)
# Verify that the payment method is supported
if price is None or payee_address is None:
raise UnsupportedPaymentMethodError(
'Resource does not support that payment method.')
# Convert string headers into correct data types
price = int(price)
# Verify resource cost against our budget
if max_price and price > max_price:
max_price_err = 'Resource price ({}) exceeds max price ({}).'
raise ResourcePriceGreaterThanMaxPriceError(max_price_err.format(price, max_price))
# Create the signed transaction
onchain_payment = self.wallet.make_signed_transaction_for(
payee_address, price, use_unconfirmed=True)[0].get('txn').to_hex()
return_address = self.wallet.current_address
logger.debug('[OnChainRequests] Signed transaction: {}'.format(
onchain_payment))
return {
'Bitcoin-Transaction': onchain_payment,
'Return-Wallet-Address': return_address,
OnChainRequests.HTTP_BITCOIN_PRICE: str(price),
OnChainRequests.HTTP_PAYER_21USERNAME: urllib.parse.quote(self.username) if self.username else None
}
评论列表
文章目录