Last active
September 18, 2025 20:26
-
-
Save nocrates/e3f2cd647a4472837664e2a5cf8d8b31 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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