from paypalrestsdk import Api, Order, Authorization
import os
# Configure PayPal SDK
api = Api({
'mode': 'sandbox',
'client_id': os.environ['PAYPAL_CLIENT_ID'],
'client_secret': os.environ['PAYPAL_CLIENT_SECRET']
})
# Create BOPIS order (authorization)
@app.route('/api/orders/bopis', methods=['POST'])
def create_bopis_order():
try:
amount = request.json.get('amount', '100.00')
pickup_location = request.json.get('pickupLocation')
pickup_code = request.json.get('pickupCode')
pickup_address = request.json.get('pickupAddress', {})
order_data = {
"intent": "AUTHORIZE",
"purchase_units": [{
"amount": {
"currency_code": "USD",
"value": amount
},
"shipping": {
"type": "PICKUP_IN_STORE",
"address": {
"address_line_1": pickup_address.get('line1'),
"admin_area_2": pickup_address.get('city'),
"admin_area_1": pickup_address.get('state'),
"postal_code": pickup_address.get('postalCode'),
"country_code": pickup_address.get('countryCode')
}
},
"custom_id": f"PICKUP-{pickup_code}",
"description": f"Pickup at {pickup_location}"
}]
}
order = Order(order_data)
if order.create():
# Store pickup details with order
store_pickup_details(order.id, pickup_code, pickup_location)
return jsonify({"id": order.id})
else:
return jsonify({"error": order.error}), 500
except Exception as e:
return jsonify({"error": str(e)}), 500
# Capture payment after pickup
@app.route('/api/orders/bopis/<order_id>/pickup', methods=['POST'])
def capture_at_pickup(order_id):
try:
authorization_id = request.json.get('authorizationId')
pickup_code = request.json.get('pickupCode')
# Verify pickup code matches
if not verify_pickup_code(order_id, pickup_code):
return jsonify({"error": "Invalid pickup code"}), 401
authorization = Authorization.find(authorization_id)
capture = authorization.capture()
if capture.success():
return jsonify({
"status": "PICKED_UP",
"captureId": capture.id
})
else:
error = capture.error
if error.get('name') == 'AUTHORIZATION_EXPIRED':
return jsonify({
"error": "Authorization expired - order canceled"
}), 400
else:
return jsonify({"error": error.get('message')}), 500
except Exception as e:
return jsonify({"error": str(e)}), 500