Skip to content

Instantly share code, notes, and snippets.

@nocrates
Last active September 18, 2025 20:26
Show Gist options
  • Select an option

  • Save nocrates/e3f2cd647a4472837664e2a5cf8d8b31 to your computer and use it in GitHub Desktop.

Select an option

Save nocrates/e3f2cd647a4472837664e2a5cf8d8b31 to your computer and use it in GitHub Desktop.
import requests
import json
import uuid
# Some identifiers for ONE particular store and product
# Replace for your own testing
class GuestShopper:
def __init__(self):
self.cart_id = None
self.default_product_id = '01tKa00000AibL5IAJ'
self.store_id = '0ZEKa000000Czme'
self.site_id = '0DMKa00000144an'
self.delivery_method_id = '2DmKa000000x8opKAA'
self.sf_ver = "v64.0"
self.store_url = 'https://st1755790183381.my.site.com/d2cenhanced'
self.guest_base_url = f"{self.store_url}/webruntime/api/services/data/{self.sf_ver}/commerce/webstores/{self.store_id}"
# Generate a unique session key and id for this guest user
# Use these on all calls as a cookie
self.session_request_key = f'guest_uuid_essential_{self.site_id}'
self.session_request_id = str(uuid.uuid4())
self.cookies = {
self.session_request_key: self.session_request_id
}
self.guest_cart_session_key = f'GuestCartSessionId_{self.store_id}'
self.guest_cart_session_id = None
self.params = {
'includeCartData': 'true',
'currencyIsoCode': 'USD',
'language': 'en-US',
'asGuest': 'true',
'htmlEncode': 'false'
}
self.headers = {
'Content-Type': 'application/json; charset=utf-8'
}
self.delivery_group_id = None
self.checkout_id = None
self.orderReferenceNumber = None
self.payment_token = None
def add_to_cart(self, product_id):
# implicit cart creation, if this is first item with this session
add_to_cart_url = f"{self.guest_base_url}/carts/current/cart-items"
add_to_cart_payload = json.dumps({
'quantity': 1,
'productId': product_id,
'type': 'Product'
})
response = requests.request(
"POST",
add_to_cart_url,
headers=self.headers,
data=add_to_cart_payload,
cookies=self.cookies,
params=self.params
)
# Use the session_request_key amd the guest_cart_session_id on any follow up calls as a cookies
guest_cart_session_id = response.cookies.get_dict().get(self.guest_cart_session_key)
print(f"Guest Cart Session ID: {guest_cart_session_id}")
self.cookies = {
self.session_request_key: self.session_request_id,
self.guest_cart_session_key: guest_cart_session_id
}
# Parse the CartItem response
cart_item = response.json()
self.cart_id = cart_item.get('cartId')
# print('"cartItem": ' + json.dumps(cart_item, indent=4))
print(f'Added Product ID: {cart_item.get("productId")} to Cart ID: {cart_item.get("cartId")}, New Quantity: {cart_item.get("quantity")}')
#
# Fetch the new cart details, based on the cartId returned from the add to cart call
#
def get_cart(self):
fetch_cart_url = f"{self.guest_base_url}/carts/{self.cart_id}"
response = requests.request(
"GET",
fetch_cart_url,
headers=self.headers,
cookies=self.cookies,
params=self.params
)
cart = response.json()
print('"cart": ' + json.dumps(cart, indent=4))
print(f'Cart ID: {cart["cartId"]}, Total Amount: {cart["grandTotalAmount"]}, Total Items: {cart["totalProductLineItemCount"]}')
def get_cart_items(self):
fetch_cart_items_url = f"{self.guest_base_url}/carts/{self.cart_id}/cart-items"
response = requests.request(
"GET",
fetch_cart_items_url,
headers=self.headers,
cookies=self.cookies,
params=self.params
)
data = response.json()
cart_summary = data['cartSummary']
print(f'Cart ID: {cart_summary["cartId"]}, Total Amount: {cart_summary["grandTotalAmount"]}, Total Items: {cart_summary["totalProductLineItemCount"]}')
def start_checkout(self):
start_checkout_url = f"{self.guest_base_url}/checkouts"
response = requests.request(
"POST",
start_checkout_url,
headers=self.headers,
cookies=self.cookies,
data=json.dumps({
'cartId': self.cart_id
}),
)
if response.status_code != 202:
raise Exception(f'Error starting checkout: {response.status_code} {response.text}')
checkout_info = response.json()
# print('"checkout_info": ' + json.dumps(checkout_info, indent=4))
self.checkout_id = checkout_info.get('checkoutId')
self.orderReferenceNumber = checkout_info.get('orderReferenceNumber')
print(f'Checkout ID: {self.checkout_id}, Order Reference Number: {self.orderReferenceNumber}')
def get_delivery_groups(self):
url = f"{self.guest_base_url}/carts/{self.cart_id}/delivery-groups"
response = requests.request(
"GET",
url,
headers=self.headers,
cookies=self.cookies
)
data = response.json()
# print('"delivery_groups": ' + json.dumps(data, indent=4))
delivery_groups = data.get('items', [])
self.delivery_group_id = delivery_groups[0].get('id') if delivery_groups else None
print(f'Delivery Group ID: {self.delivery_group_id}')
def set_delivery(self):
url = f"{self.guest_base_url}/carts/{self.cart_id}/delivery-groups/{self.delivery_group_id}"
payload = json.dumps({
"deliveryAddress": {
"name":"John Doe",
"street":"123 Acme Drive",
"city":"Los Angeles",
"region":"CA",
"country":"US",
"postalCode":"90001",
"shipToPhoneNumber": "+14155551234"
}
})
response = requests.request(
"PATCH",
url,
headers=self.headers,
cookies=self.cookies,
data=payload
)
if response.status_code != 200:
raise Exception(f'Error setting delivery: {response.status_code} {response.text}')
data = response.json()
print(f'Delivery address set for checkout: {data["name"]}')
def add_payment(self):
add_payment_url = f"{self.guest_base_url}/payments/token"
payment_payload = json.dumps({
"billingAddress":{
"name":"John Doe",
"street":"123 Acme Drive",
"city":"Los Angeles",
"country":"US",
"postalCode":"90001"
},
"cardPaymentMethod": {
"cardHolderName": "John Doe Guest",
"cardNumber": "4242424242424242",
"expiryMonth": 12,
"expiryYear": 2029,
"cvv": 111,
"cardType": "Visa"
}
})
response = requests.request(
"POST",
add_payment_url,
headers=self.headers,
cookies=self.cookies,
data=payment_payload
)
payment_info = response.json()
self.payment_token = payment_info.get('token')
print(f'Payment Token: {self.payment_token}')
def set_contact_info(self):
url = f"{self.guest_base_url}/checkouts/{self.checkout_id}"
payload = json.dumps({
'contactInfo': {
"firstName": "Jane",
"lastName": "Doe",
"email": "[email protected]",
"phoneNumber": "+14155551234"
}
})
response = requests.request(
"PATCH",
url,
headers=self.headers,
cookies=self.cookies,
data=payload
)
if response.status_code != 200:
raise Exception(f'Error setting contact info: {response.status_code} {response.text}')
data = response.json()
print(f'Contact info set for checkout')
def create_order(self):
url = f"{self.guest_base_url}/checkouts/{self.checkout_id}/orders"
response = requests.request(
"POST",
url,
headers=self.headers,
cookies=self.cookies
)
if response.status_code != 201:
raise Exception(f'Error creating order: {response.status_code} {response.text}')
order_info = response.json()
print('"order_info": ' + json.dumps(order_info, indent=4))
# order_id = order_info.get('orderId')
# print(f'Order ID: {order_id} created successfully!')
def attach_payment_to_checkout(self):
url = f"{self.guest_base_url}/checkouts/{self.checkout_id}/payments"
payload = json.dumps({
"paymentToken": self.payment_token,
"requestType":"Auth",
"billingAddress":{
"name":"John Doe",
"street":"123 Acme Drive",
"city":"Los Angeles",
"region":"CA",
"country":"US",
"postalCode":"90001"
}
})
response = requests.request(
"POST",
url,
headers=self.headers,
cookies=self.cookies,
data=payload
)
data = response.json()
if response.status_code != 201:
raise Exception(f'Error attaching payment to checkout: {response.status_code} {response.text}')
result = data.get('salesforceResultCode')
print(f'Attach payment to checkout: {result}')
def run_demo(self):
self.add_to_cart(self.default_product_id)
self.get_cart_items()
self.get_delivery_groups()
self.set_delivery()
self.start_checkout()
self.add_payment()
self.attach_payment_to_checkout()
self.set_contact_info()
self.create_order()
if __name__ == "__main__":
demo = GuestShopper()
demo.run_demo()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment