Django电商项目集成cXML Punch-Out:配置文件及参数适配问询
Django电商网站集成cXML Punch-Out配置指南
一、cXML模板字段配置说明
针对你提供的cXML模板中所有待填充项,逐一说明配置规则:
1. 根节点<cXML>字段
payloadID: 生成唯一请求标识符,建议用UUID格式,Django里可通过uuid.uuid4()生成,示例:urn:uuid:123e4567-e89b-12d3-a456-426614174000timestamp: 当前UTC时间,遵循ISO 8601格式,示例:2024-05-20T12:34:56Z
2. <Header>下身份凭证字段
<From>
代表买家系统的身份信息,所有值必须由买家提供:
domain: 买家约定的身份标识体系,比如常见的DUNS(邓白氏编码)或买家自定义域名Identity: 买家的唯一系统ID,由买家分配
<To>
代表你的电商网站(供应商)的身份信息,需和买家提前约定:
domain: 可用你的电商域名作为标识,比如your-store.comIdentity: 你和买家约定的供应商编号,比如SUPPLIER-123
<Sender>
通常和<From>信息一致(由买家发起请求时),其中CredentialMac是签名验证字段:
domain/Identity: 和<From>保持一致creationDate: 凭证创建的UTC时间,ISO格式expirationDate: 凭证过期的UTC时间,ISO格式- 签名内容:用你和买家约定的密钥,通过HMAC-SHA1-96算法对cXML头部核心信息(From、To、Sender、payloadID、timestamp)加密生成,Django里可借助
hmac模块实现
3. <PunchOutSetupRequest>字段
BuyerCookie: 买家系统生成的会话唯一标识,需在Django会话中保存,后续提交订单时必须返回给买家,用来关联本次Punch-Out会话Extrinsic name="User": 买家的用户ID/用户名,由买家系统传入,可用来关联Django的用户模型(如需同步买家用户信息)BrowserFormPost > URL: 买家提供的回调URL,用户在你的网站选完商品后,需把购物车数据以cXML格式通过表单POST到这个地址<Contact>: 买家的联系信息,由买家系统传入,可用于订单记录或页面展示SupplierSetup > URL: 你的电商网站的Punch-Out入口URL,比如https://your-django-store.com/punchout/setup/,买家系统会跳转至此,需在Django中编写对应视图处理请求
二、Django项目适配补充步骤
1. 编写cXML处理视图
- 创建POST视图接收买家的PunchOutSetupRequest,用
xml.etree.ElementTree或defusedxml解析XML内容(后者更安全) - 实现
CredentialMac的签名验证逻辑,确保请求来自合法买家 - 初始化Django会话,保存
BuyerCookie、买家用户信息等关键数据 - 重定向到你的电商商品列表页或买家专属采购页面
2. 购物车同步逻辑
- 用户选完商品后,将购物车数据转换成符合cXML规范的
PunchOutOrderMessage格式,包含商品ID、名称、数量、单价、总价等信息 - 编写表单POST逻辑,将生成的cXML数据发送到买家提供的
BrowserFormPostURL
3. 配置URL路由
在urls.py中添加Punch-Out相关路由:
path('punchout/setup/', views.punchout_setup, name='punchout_setup'), path('punchout/submit/', views.punchout_submit, name='punchout_submit'),
4. 安全配置
- 强制所有cXML相关请求使用HTTPS,在Django中配置
SECURE_SSL_REDIRECT = True等安全设置 - 将和买家约定的签名密钥存放在环境变量中,用
django-environ读取,禁止硬编码到代码里 - 对所有cXML请求做签名验证,拒绝伪造请求
5. 测试验证
- 使用买家提供的测试环境发送测试请求,检查视图是否正确解析和响应
- 完整测试购物车提交流程,确保cXML数据能正确同步到买家系统
填充后的cXML示例
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.028/cXML.dtd"> <cXML payloadID="urn:uuid:123e4567-e89b-12d3-a456-426614174000" timestamp="2024-05-20T12:34:56Z" xml:lang="en-US"> <Header> <From> <Credential domain="DUNS"> <Identity>987654321</Identity> </Credential> </From> <To> <Credential domain="your-store.com"> <Identity>SUPPLIER-123</Identity> </Credential> </To> <Sender> <Credential domain="DUNS"> <Identity>987654321</Identity> <CredentialMac type="FromSenderCredentials" algorithm="HMAC-SHA1-96" creationDate="2024-05-20T12:00:00Z" expirationDate="2024-05-21T12:00:00Z">abc123xyz456</CredentialMac> </Credential> <UserAgent>BuyerProcurementSystem/2.0</UserAgent> </Sender> </Header> <Request deploymentMode="test"> <PunchOutSetupRequest operation="create"> <BuyerCookie>SESSION-789XYZ</BuyerCookie> <Extrinsic name="User">buyer-user-456</Extrinsic> <BrowserFormPost><URL>https://buyer-system.com/punchout/callback</URL></BrowserFormPost> <Contact> <Name xml:lang="en-US">John Doe</Name> <Email>john.doe@buyer.com</Email> </Contact> <SupplierSetup><URL>https://your-django-store.com/punchout/setup/</URL></SupplierSetup> </PunchOutSetupRequest> </Request> </cXML>
内容的提问来源于stack exchange,提问作者Pathia Nanto
相关产品推荐
相关产品推荐

