Django集成PayPal沙箱API创建订单后,下一步操作该如何进行?
PayPal沙箱集成后续支付流程操作说明
我正在项目中使用PayPal沙箱账户(商家账户与个人账户),结合Django后端(前端为React.js)集成PayPal API,目前已完成以下操作:
已完成操作
1. 实现Access Token获取逻辑
import requests import base64 def PaypalToken(client_ID, client_Secret): url = "https://api.sandbox.paypal.com/v1/oauth2/token" data = { "client_id": client_ID, "client_secret": client_Secret, "grant_type": "client_credentials" } headers = { "Content-Type": "application/x-www-form-urlencoded", "Authorization": "Basic {0}".format(base64.b64encode((client_ID + ":" + client_Secret).encode()).decode()) } token = requests.post(url, data, headers=headers) return token x = PaypalToken(my_client_ID, my_client_Secret) print(x.text)
2. 调用接口创建订单
headers = {"Content-Type": "application/json", "Authorization": 'Bearer ' + token} # 注意Bearer后需加空格 url = "https://api.sandbox.paypal.com/v2/checkout/orders" data = '''{ "intent": "CAPTURE", "application_context": { "return_url": "https://www.example.com", "cancel_url": "https://www.example.com", "brand_name": "EXAMPLE INC", "landing_page": "BILLING", "shipping_preference": "SET_PROVIDED_ADDRESS", "user_action": "CONTINUE" }, "purchase_units": [ { "reference_id": "PUHF", "description": "Sporting Goods", "custom_id": "CUST-HighFashions", "soft_descriptor": "HighFashions", "amount": { "currency_code": "USD", "value": "220.00", "breakdown": { "item_total": { "currency_code": "USD", "value": "180.00" }, "shipping": { "currency_code": "USD", "value": "20.00" }, "handling": { "currency_code": "USD", "value": "10.00" }, "tax_total": { "currency_code": "USD", "value": "20.00" }, "shipping_discount": { "currency_code": "USD", "value": "10" } } }, "items": [ { "name": "T-Shirt", "description": "Green XL", "sku": "sku01", "unit_amount": { "currency_code": "USD", "value": "90.00" }, "tax": { "currency_code": "USD", "value": "10.00" }, "quantity": "1", "category": "PHYSICAL_GOODS" }, { "name": "Shoes", "description": "Running, Size 10.5", "sku": "sku02", "unit_amount": { "currency_code": "USD", "value": "45.00" }, "tax": { "currency_code": "USD", "value": "5.00" }, "quantity": "2", "category": "PHYSICAL_GOODS" } ], "shipping": { "method": "United States Postal Service", "name": { "full_name":"John Doe" }, "address": { "address_line_1": "123 Townsend St", "address_line_2": "Floor 6", "admin_area_2": "San Francisco", "admin_area_1": "CA", "postal_code": "94107", "country_code": "US" } } } ] }''' result = requests.post(url, data, headers=headers) # 修正原代码中header为headers
创建订单后得到的响应:
{ "id": "5O190127TN364715T", "status": "CREATED", "links": [ { "href": "https://api.paypal.com/v2/checkout/orders/5O190127TN364715T", "rel": "self", "method": "GET" }, { "href": "https://www.paypal.com/checkoutnow?token=5O190127TN364715T", "rel": "approve", "method": "GET" }, { "href": "https://api.paypal.com/v2/checkout/orders/5O190127TN364715T/capture", "rel": "capture", "method": "POST" } ] }
下一步操作流程
1. 前端集成支付授权入口
- 方式一:在React前端添加支付按钮,点击后跳转到响应中
rel: approve对应的PayPal沙箱授权页面,引导用户使用沙箱个人账户登录并完成授权; - 方式二:集成PayPal官方React SDK(
@paypal/react-paypal-js),渲染内嵌的PayPal支付按钮,通过createOrder回调调用Django后端接口获取订单ID,onApprove回调触发后续捕获流程,避免页面跳转,提升用户体验。
2. 后端处理授权回调与金额捕获
用户完成授权后,PayPal会跳转到你设置的return_url并携带token(即订单ID)参数:
- 在Django后端编写视图函数接收该
token; - 调用PayPal的捕获订单接口完成金额收取,示例代码:
import requests def capture_order(order_id, access_token): url = f"https://api.sandbox.paypal.com/v2/checkout/orders/{order_id}/capture" headers = { "Content-Type": "application/json", "Authorization": f"Bearer {access_token}" } response = requests.post(url, headers=headers) return response.json()
- 捕获成功后(响应状态为
COMPLETED),更新数据库中对应订单的支付状态,并执行后续业务逻辑(如发送订单确认通知、标记可发货等)。
3. 处理支付取消场景
若用户在授权页面取消支付,PayPal会跳转到cancel_url,此时需在对应的Django视图中处理订单取消逻辑,比如将订单标记为已取消,或引导用户重新发起支付。
4. 沙箱环境测试验证
使用PayPal沙箱提供的测试个人账户完成全流程测试,验证:
- 订单状态是否正确更新;
- 捕获金额与订单金额是否一致;
- 商家沙箱账户是否收到对应测试款项(可在沙箱商家后台查看交易记录)。
内容的提问来源于stack exchange,提问作者tridenT
相关产品推荐
相关产品推荐

