intelligence_finance_v1-202.../intelligence_finance_v1/example_test.go

221 lines
6.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package intelligence_finance_v1_test
import (
"context"
"fmt"
"log"
"net/http"
"intelligence_finance_v1"
)
// ExampleClient_CreateInvoice 演示如何提交订单开票请求
func ExampleClient_CreateInvoice() {
// 创建客户端
client := intelligence_finance_v1.NewClient(
"https://api.example.com", // 平台基础地址
"your-tenant-id", // 租户ID
"your-client-id", // 应用标识
"your-client-secret", // 密钥
)
// 构建开票请求
req := &intelligence_finance_v1.InvoiceRequest{
OrderID: "ORDER-2024-001",
InvoiceType: intelligence_finance_v1.InvoiceTypeDigitalNormal, // 数电普票
Purchaser: "测试购方企业",
Taxnum: "91110000000000000X",
Products: []intelligence_finance_v1.ProductItem{
{
ProductName: "测试商品",
RevenueCode: "1090101000000000000",
AmountIncludeTax: "1130.00",
Quantity: "1",
Unit: "个",
TaxSign: 1,
TaxRate: "0.13",
Discount: "0",
},
},
Email: "test@example.com",
Phone: "13800138000",
}
// 调用接口
ctx := context.Background()
resp, err := client.CreateInvoice(ctx, "/api/invoice/create", req)
if err != nil {
log.Fatalf("创建发票失败: %v", err)
}
fmt.Printf("开票状态: %d\n", resp.Status)
if resp.Status == intelligence_finance_v1.InvoiceStatusSuccess {
for _, data := range resp.DataList {
fmt.Printf("发票号码: %s, 发票代码: %s\n", data.InvoiceNo, data.InvoiceCode)
}
}
}
// ExampleClient_QueryInvoiceStatus 演示如何查询开票状态
func ExampleClient_QueryInvoiceStatus() {
client := intelligence_finance_v1.NewClient(
"https://api.example.com",
"your-tenant-id",
"your-client-id",
"your-client-secret",
)
req := &intelligence_finance_v1.InvoiceStatusQueryRequest{
OrderID: "ORDER-2024-001",
}
ctx := context.Background()
resp, err := client.QueryInvoiceStatus(ctx, "/api/invoice/status", req)
if err != nil {
log.Fatalf("查询开票状态失败: %v", err)
}
fmt.Printf("状态: %d, 描述: %s\n", resp.Status, resp.Message)
for _, data := range resp.Data {
fmt.Printf("发票号码: %s, 发票状态: %s\n", data.InvoiceNo, data.InvoiceStatus)
}
}
// ExampleClient_CreatePaymentDocument 演示如何创建付款单据
func ExampleClient_CreatePaymentDocument() {
client := intelligence_finance_v1.NewClient(
"https://api.example.com",
"your-tenant-id",
"your-client-id",
"your-client-secret",
)
needPayment := true
req := &intelligence_finance_v1.PaymentDocumentRequest{
Code: "PAY-2024-001",
UserID: "user123",
Title: "测试付款单",
Amount: "10000.00",
Supplier: &intelligence_finance_v1.Supplier{
Name: "测试供应商",
},
Company: &intelligence_finance_v1.Company{
Name: "测试企业",
},
Department: &intelligence_finance_v1.Department{
Name: "财务部",
},
NeedPayment: &needPayment,
PaymentDetailList: []intelligence_finance_v1.PaymentDetail{
{
Amount: "10000.00",
Remark: "货款",
},
},
}
ctx := context.Background()
resp, err := client.CreatePaymentDocument(ctx, "/api/payment/create", req)
if err != nil {
log.Fatalf("创建付款单据失败: %v", err)
}
fmt.Printf("付款单据创建成功,单据编码: %s\n", resp.Code)
}
// ExampleClient_QueryPaymentStatus 演示如何查询支付状态
func ExampleClient_QueryPaymentStatus() {
client := intelligence_finance_v1.NewClient(
"https://api.example.com",
"your-tenant-id",
"your-client-id",
"your-client-secret",
)
req := &intelligence_finance_v1.PaymentStatusQueryRequest{
Code: "PAY-2024-001",
UserID: "user123",
}
ctx := context.Background()
resp, err := client.QueryPaymentStatus(ctx, "/api/payment/status", req)
if err != nil {
log.Fatalf("查询支付状态失败: %v", err)
}
fmt.Printf("支付状态: %s, 支付时间: %s\n", resp.PaymentStatus, resp.PaymentTime)
}
// Example_HandlePaymentNotification 演示如何处理平台支付完成回调
func Example_HandlePaymentNotification() {
// 这是一个 HTTP handler 示例,展示如何处理平台回调
http.HandleFunc("/callback/payment", func(w http.ResponseWriter, r *http.Request) {
// 解析通知数据
notification, err := intelligence_finance_v1.ParsePaymentNotification(r)
if err != nil {
log.Printf("解析通知失败: %v", err)
intelligence_finance_v1.WriteNotificationResponse(w, false)
return
}
// 根据支付状态处理业务逻辑
switch notification.PaymentStatus {
case intelligence_finance_v1.PaymentStatusSuccess:
log.Printf("支付成功: 单据 %s, 金额 %s, 时间 %s",
notification.Code, notification.Amount, notification.PaymentTime)
// 更新订单状态等业务处理...
case intelligence_finance_v1.PaymentStatusFail:
log.Printf("支付失败: 单据 %s, 原因: %s",
notification.Code, notification.FailReason)
case intelligence_finance_v1.PaymentStatusTerminate:
log.Printf("支付已取消: 单据 %s", notification.Code)
default:
log.Printf("支付状态: %s, 单据 %s", notification.PaymentStatus, notification.Code)
}
// 返回成功响应
intelligence_finance_v1.WriteNotificationResponse(w, true)
})
log.Println("回调服务启动在 :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
// Example_VerifySignature 演示签名生成和验证
func Example_VerifySignature() {
secret := "your-client-secret"
timestamp := intelligence_finance_v1.GenerateTimestamp()
nonce, _ := intelligence_finance_v1.GenerateNonce(16)
// 生成签名
data := timestamp + nonce
signature := intelligence_finance_v1.HmacSHA256Sign(secret, data)
fmt.Printf("签名: %s\n", signature)
// 验证签名
valid := intelligence_finance_v1.HmacSHA256Verify(secret, data, signature)
fmt.Printf("签名验证: %v\n", valid)
}
// Example_DingTalkClient 演示钉钉AI表格客户端的使用
func Example_DingTalkClient() {
// 钉钉AI表格的 client-id 固定为 "dd-ai-table"
// 签名由AI表格自动完成但 SDK 仍会生成签名请求头
client := intelligence_finance_v1.NewDingTalkClient(
"https://api.example.com",
"your-tenant-id",
"your-app-secret", // 在钉钉AI表格中配置为 APPSecret
)
req := &intelligence_finance_v1.InvoiceStatusQueryRequest{
OrderID: "ORDER-2024-001",
}
ctx := context.Background()
resp, err := client.QueryInvoiceStatus(ctx, "/api/invoice/status", req)
if err != nil {
log.Fatalf("查询失败: %v", err)
}
fmt.Printf("开票状态: %d\n", resp.Status)
}