code: def register_product_key(self, key):
          
          resp = self.send_job_and_wait(MsgProto(EMsg.ClientRegisterKey),
                                        {'key': key},
                                        timeout=30,
                                        )
  
          if resp:
              details = vdf.binary_loads(resp.purchase_receipt_info).get('MessageObject', None)
              return EResult(resp.eresult), resp.purchase_result_details, details
          else:
              return EResult.Timeout, None, None
docs: Register/Redeem a CD-Key
  
          :param key: CD-Key
          :type  key: :class:`str`
          :return: format ``(eresult, result_details, receipt_info)``
          :rtype: :class:`tuple`
  
          Example ``receipt_info``:
  
          .. code:: python
  
              {'BasePrice': 0,
                'CurrencyCode': 0,
                'ErrorHeadline': '',
                'ErrorLinkText': '',
                'ErrorLinkURL': '',
                'ErrorString': '',
                'LineItemCount': 1,
                'PaymentMethod': 1,
                'PurchaseStatus': 1,
                'ResultDetail': 0,
                'Shipping': 0,
                'Tax': 0,
                'TotalDiscount': 0,
                'TransactionID': UINT_64(111111111111111111),
                'TransactionTime': 1473000000,
                'lineitems': {'0': {'ItemDescription': 'Half-Life 3',
                  'TransactionID': UINT_64(11111111111111111),
                  'packageid': 1234}},
                'packageid': -1}