Page Summary
-
Archived or inactive passes in Google Wallet are moved to the "Expired passes" section.
-
A pass expires when its
object.validTimeInterval.end.datehas passed or itsobject.stateis marked asExpired,Inactive, orCompleted. -
The provided code samples demonstrate how to expire a pass object using the Google Wallet API by setting its state to
Expiredand include examples in Java, PHP, Python, C#, Node.js, and Go.
There's an "Expired passes" section in the Google Wallet app that contains all archived or inactive passes.
A pass is moved to the "Expired passes" section if at least one of the following conditions is true:
- The
object.validTimeInterval.end.datehas passed. The pass moves to "Expired passes" within 24 hours. - The
object.statefield is marked asExpired,Inactive, orCompleted.
The following code sample demonstrates expiring a pass object using the Google Wallet API.
Java
To start your integration in Java, refer to our complete code samples on GitHub .
/** * Expire an object. * * <p>Sets the object's state to Expired. If the valid time interval is already set, the pass will * expire automatically up to 24 hours after. * * @param issuerId The issuer ID being used for this request. * @param objectSuffix Developer-defined unique ID for this pass object. * @return The pass object ID: "{issuerId}.{objectSuffix}" */ public String expireObject ( String issuerId , String objectSuffix ) throws IOException { // Check if the object exists try { service . transitobject (). get ( String . format ( "%s.%s" , issuerId , objectSuffix )). execute (); } catch ( GoogleJsonResponseException ex ) { if ( ex . getStatusCode () == 404 ) { // Object does not exist System . out . printf ( "Object %s.%s not found!%n" , issuerId , objectSuffix ); return String . format ( "%s.%s" , issuerId , objectSuffix ); } else { // Something else went wrong... ex . printStackTrace (); return String . format ( "%s.%s" , issuerId , objectSuffix ); } } // Patch the object, setting the pass as expired TransitObject patchBody = new TransitObject (). setState ( "EXPIRED" ); TransitObject response = service . transitobject () . patch ( String . format ( "%s.%s" , issuerId , objectSuffix ), patchBody ) . execute (); System . out . println ( "Object expiration response" ); System . out . println ( response . toPrettyString ()); return response . getId (); }
PHP
To start your integration in PHP, refer to our complete code samples on GitHub .
/** * Expire an object. * * Sets the object's state to Expired. If the valid time interval is * already set, the pass will expire automatically up to 24 hours after. * * @param string $issuerId The issuer ID being used for this request. * @param string $objectSuffix Developer-defined unique ID for this pass object. * * @return string The pass object ID: "{$issuerId}.{$objectSuffix}" */ public function expireObject(string $issuerId, string $objectSuffix) { // Check if the object exists try { $this->service->transitobject->get("{$issuerId}.{$objectSuffix}"); } catch (Google\Service\Exception $ex) { if (!empty($ex->getErrors()) && $ex->getErrors()[0]['reason'] == 'resourceNotFound') { print("Object {$issuerId}.{$objectSuffix} not found!"); return "{$issuerId}.{$objectSuffix}"; } else { // Something else went wrong... print_r($ex); return "{$issuerId}.{$objectSuffix}"; } } // Patch the object, setting the pass as expired $patchBody = new TransitObject([ 'state' => 'EXPIRED' ]); $response = $this->service->transitobject->patch("{$issuerId}.{$objectSuffix}", $patchBody); print "Object expiration response\n"; print_r($response); return $response->id; }
Python
To start your integration in Python, refer to our complete code samples on GitHub .
def expire_object ( self , issuer_id : str , object_suffix : str ) - > str : """Expire an object. Sets the object's state to Expired. If the valid time interval is already set, the pass will expire automatically up to 24 hours after. Args: issuer_id (str): The issuer ID being used for this request. object_suffix (str): Developer-defined unique ID for the pass object. Returns: The pass object ID: f"{issuer_id}.{object_suffix}" """ # Check if the object exists try : response = self . client . transitobject () . get ( resourceId = f ' { issuer_id } . { object_suffix } ' ) . execute () except HttpError as e : if e . status_code == 404 : print ( f 'Object { issuer_id } . { object_suffix } not found!' ) return f ' { issuer_id } . { object_suffix } ' else : # Something else went wrong... print ( e . error_details ) return f ' { issuer_id } . { object_suffix } ' # Patch the object, setting the pass as expired patch_body = { 'state' : 'EXPIRED' } response = self . client . transitobject () . patch ( resourceId = f ' { issuer_id } . { object_suffix } ' , body = patch_body ) . execute () print ( 'Object expiration response' ) print ( response ) return f ' { issuer_id } . { object_suffix } '
C#
To start your integration in C#, refer to our complete code samples on GitHub .
/// <summary> /// Expire an object. /// <para /> /// Sets the object's state to Expired. If the valid time interval is already /// set, the pass will expire automatically up to 24 hours after. /// </summary> /// <param name="issuerId">The issuer ID being used for this request.</param> /// <param name="objectSuffix">Developer-defined unique ID for this pass object.</param> /// <returns>The pass object ID: "{issuerId}.{objectSuffix}"</returns> public string ExpireObject ( string issuerId , string objectSuffix ) { // Check if the object exists Stream responseStream = service . Transitobject . Get ( $"{issuerId}.{objectSuffix}" ) . ExecuteAsStream (); StreamReader responseReader = new StreamReader ( responseStream ); JObject jsonResponse = JObject . Parse ( responseReader . ReadToEnd ()); if ( jsonResponse . ContainsKey ( "error" )) { if ( jsonResponse [ "error" ]. Value<int> ( "code" ) == 404 ) { // Object does not exist Console . WriteLine ( $"Object {issuerId}.{objectSuffix} not found!" ); return $"{issuerId}.{objectSuffix}" ; } else { // Something else went wrong... Console . WriteLine ( jsonResponse . ToString ()); return $"{issuerId}.{objectSuffix}" ; } } // Patch the object, setting the pass as expired TransitObject patchBody = new TransitObject { State = "EXPIRED" }; responseStream = service . Transitobject . Patch ( patchBody , $"{issuerId}.{objectSuffix}" ) . ExecuteAsStream (); responseReader = new StreamReader ( responseStream ); jsonResponse = JObject . Parse ( responseReader . ReadToEnd ()); Console . WriteLine ( "Object expiration response" ); Console . WriteLine ( jsonResponse . ToString ()); return $"{issuerId}.{objectSuffix}" ; }
Node.js
To start your integration in Node, refer to our complete code samples on GitHub .
/** * Expire an object. * * Sets the object's state to Expired. If the valid time interval is * already set, the pass will expire automatically up to 24 hours after. * * @param {string} issuerId The issuer ID being used for this request. * @param {string} objectSuffix Developer-defined unique ID for the pass object. * * @returns {string} The pass object ID: `${issuerId}.${objectSuffix}` */ async expireObject ( issuerId , objectSuffix ) { let response ; // Check if the object exists try { response = await this . client . transitobject . get ({ resourceId : ` ${ issuerId } . ${ objectSuffix } ` }); } catch ( err ) { if ( err . response && err . response . status === 404 ) { console . log ( `Object ${ issuerId } . ${ objectSuffix } not found!` ); return ` ${ issuerId } . ${ objectSuffix } ` ; } else { // Something else went wrong... console . log ( err ); return ` ${ issuerId } . ${ objectSuffix } ` ; } } // Patch the object, setting the pass as expired let patchBody = { 'state' : 'EXPIRED' }; response = await this . client . transitobject . patch ({ resourceId : ` ${ issuerId } . ${ objectSuffix } ` , requestBody : patchBody }); console . log ( 'Object expiration response' ); console . log ( response ); return ` ${ issuerId } . ${ objectSuffix } ` ; }
Go
To start your integration in Go, refer to our complete code samples on GitHub code samples on Github .
// Expire an object. // // Sets the object's state to Expired. If the valid time interval is // already set, the pass will expire automatically up to 24 hours after. func ( d * demoTransit ) expireObject ( issuerId , objectSuffix string ) { transitObject := & walletobjects . TransitObject { State : "EXPIRED" , } res , err := d . service . Transitobject . Patch ( fmt . Sprintf ( "%s.%s" , issuerId , objectSuffix ), transitObject ). Do () if err != nil { log . Fatalf ( "Unable to patch object: %v" , err ) } else { fmt . Printf ( "Object expiration id:\n%s\n" , res . Id ) } }


