了解如何将易开票服务集成到您的应用中
要开始集成,您首先需要在我们的平台创建一个应用。系统会自动为您的应用生成安全凭证:
appid
,应用的唯一标识符,用于标识请求来源。appsecret
,用于参数加密和签名验证,请务必妥善保管,切勿泄露。您可以在登录后的"应用管理"页面创建新应用、查看和管理您的应用凭证,并设置接收开票结果的回调URL。
为了确保通过URL传递参数的安全性,我们采用 AES-CBC + HMAC-SHA256 的组合方案。
amount=100.00&order_number=ORD123
)。appsecret
的MD5哈希值作为AES加密的密钥 (16字节)。iv + encrypted_data
)。iv + encrypted_data
) 进行Base64编码,得到最终的 data
参数值。appsecret
作为密钥,对拼接后的完整数据 (iv + encrypted_data
) 计算HMAC-SHA256签名,得到 signature
参数值。将加密和签名后的参数附加到基础URL后:
http://tax.dsoou.com/orders/checkout/?appid=您的AppID&data=Base64编码后的加密数据&signature=HMAC签名
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
amount | string | 是 | 开票金额 (不含税),字符串格式,例如 "100.00"。 |
tax_rate | string | 是 | 税率, 例如 "0.06" |
order_number | string | 是 | 您的系统内部订单号,用于关联开票记录。 |
product_name | string | 是 | 商品或服务名称,将显示在发票上。 |
timestamp | string | 是 | 当前UNIX时间戳 (秒),字符串格式。用于防止重放攻击。 |
callback_url | string | 否 | 用户完成开票操作后的前端跳转URL。如果未提供,将使用您在应用设置中配置的默认回调URL。 |
* 推荐使用 Python 的 `pycryptodome` 库来实现 AES 和 HMAC 操作。
开票完成后,无论是成功还是失败,系统都会向您在应用设置中指定的 `notify_url` 发送一个 POST 请求,通知您开票结果。通知数据同样采用加密和签名保护。
解密回调数据的步骤与加密过程相反:
iv + encrypted_data
)。除了通过Web链接引导用户开票,您也可以直接通过调用我们的API来实现开票和订单查询功能。这种方式更适合后端系统集成。
所有API调用都需要进行身份认证,我们采用基于 HMAC签名 的认证方式,以确保请求的安全性和完整性,并避免直接传输您的 appsecret
。
在每个API请求的HTTP Header中,您需要包含以下字段:
X-App-ID: 您的应用ID
X-Timestamp: 当前UNIX时间戳 (秒,字符串)
X-Nonce: 随机字符串 (可选, 建议包含以增加安全性)
X-Signature: 计算得出的请求签名 (十六进制字符串)
签名通过以下方式计算:
raw_string
),其格式为:appid + timestamp + nonce + 请求路径
。your_appid1622548800randomstring/api/create-invoice/
appsecret
作为密钥,对 raw_string
计算 HMAC-SHA256 哈希值。X-Signature
。* 时间戳 (X-Timestamp
) 的有效期为5分钟,请确保您的服务器时间准确。
* 请求路径 (request.path
) 是指API的相对路径,例如 /api/create-invoice/
或 /api/orders/
。
POST /api/orders/create-invoice/
用于提交一个新的开票请求。
包含订单和发票抬头信息,必填字段与Web链接加密参数类似,但不需要包含 timestamp
和 callback_url
(notify_url 在创建 App 时设置)。
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
order_number | string | 是 | 您的订单号 |
product_name | string | 是 | 商品名称 |
amount | string | 是 | 开票金额 (不含税), 例如 "123.45" |
tax_rate | string | 是 | 税率, 例如 "0.06" |
organization_name | string | 是 | 公司名称 (发票抬头) |
tax_number | string | 是 | 纳税人识别号 |
address | string | 否 | 公司地址 |
phone | string | 否 | 公司电话 |
bank_account | string | 否 | 银行账号 |
bank_name | string | 否 | 开户行名称 |
is_test | boolean | 否 | 是否为测试发票 |
如果 is_test
为 true
,则发票为测试发票,不会实际开票,但会返回成功状态。
返回创建的订单详情,包含系统生成的 `uuid` 和发票信息。
{
"is_success": true,
"order": {
"uuid": "a1b2c3d4-e5f6-7890-1234-567890abcdef",
"order_number": "YOUR_ORDER_123",
"product_name": "服务费",
"amount": "100.00",
"tax_rate": "0.06",
"organization_name": "示例公司",
"tax_number": "91310000MA1FN1X000",
"status": "SUCCESS",
"app_name": "我的应用",
"invoice_number": "发票号码",
"invoice_date": "开票日期",
"invoice_links": {
"pdf": "",
"xml": "",
},
"created_at": "2023-10-27 10:00:00",
"updated_at": "2023-10-27 10:00:00",
...
}
}
- HTTP 200: 请求数据验证失败 (如缺少必填字段,格式错误, 或服务异常)。
{
"is_success": false,
"error_message": "缺少必填字段: order_number",
}
- HTTP 403 Forbidden: 认证失败 (签名错误、AppID无效、时间戳过期等)。
GET /api/orders/
获取当前认证应用下的所有订单列表。
返回一个包含订单对象的数组。
[
{
"uuid": "a1b2c3d4-e5f6-7890-1234-567890abcdef",
"order_number": "YOUR_ORDER_123",
"product_name": "服务费",
"amount": "100.00",
"status": "SUCCESS",
"order_status": "成功",
"app_name": "我的应用",
"created_at": "2023-10-27T10:00:00Z",
...
},
...
]
GET /api/orders/{uuid}/
根据订单的 UUID 获取订单详细信息。
返回单个订单对象的详细信息,结构同创建订单的成功响应。
- HTTP 404 Not Found: 指定 UUID 的订单不存在或不属于当前认证的应用。
通过API创建的开票请求,其结果通知方式与 Web链接开票的回调处理 完全相同。系统会向您在应用设置中配置的 `notify_url` 发送包含加密结果的POST请求。
请参考Web链接方式下的回调处理说明来接收、解密和验证通知数据。
appsecret
是最高机密,切勿硬编码在客户端代码或版本控制中,也绝不能在网络中明文传输。在集成过程中,您可能会遇到以下常见的错误响应 (通常在Web链接参数解析或API认证失败时返回,HTTP状态码通常为 400 或 403):
错误消息 (detail) | 可能原因 |
---|---|
appid is required | Web链接缺少 appid 参数 / API请求头缺少 X-App-ID 。 |
signature is required | Web链接缺少 signature 参数 / API请求头缺少 X-Signature 。 |
data is required | Web链接缺少 data 参数。 |
timestamp is required | API请求头缺少 X-Timestamp 。 |
Invalid appid | 提供的 appid 不存在或对应的应用已被禁用。 |
data validation failed | Web链接参数解密失败或签名验证失败。请检查 appsecret 和加密过程。 |
Invalid signature | API请求签名验证失败。请检查签名计算方法、appsecret 、时间戳和请求路径。 |
Timestamp expired | API请求的时间戳已超过有效范围 (当前为5分钟)。请检查客户端与服务器时间同步。 |