添加文件: xy_sh/example_test.go
This commit is contained in:
parent
ff5cd40d7f
commit
02af62117a
|
|
@ -0,0 +1,227 @@
|
|||
package xy_sh
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"log"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// ExampleClient_PlaceOrder 演示卡券/直充权益下单
|
||||
func ExampleClient_PlaceOrder() {
|
||||
// 模拟供应商服务端
|
||||
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
// 读取请求体
|
||||
var req EncryptedRequest
|
||||
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||||
http.Error(w, "bad request", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
||||
// 验证签名(实际生产环境需要验证)
|
||||
timestamp := r.Header.Get("timestamp")
|
||||
sign := r.Header.Get("sign")
|
||||
_ = timestamp
|
||||
_ = sign
|
||||
|
||||
// 模拟响应
|
||||
resp := EncryptedResponse{
|
||||
Code: 0,
|
||||
Msg: "请求成功",
|
||||
Data: strPtr(`{"orderNo":"HM17575805323790000127073398f3772c00","expireTime":"2025-09-12 00:00:00","couponNo":"27073398f3772c00","couponCode":"27073398f3772c00","status":1}`),
|
||||
}
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
json.NewEncoder(w).Encode(resp)
|
||||
}))
|
||||
defer server.Close()
|
||||
|
||||
// 初始化客户端
|
||||
// 注意:SM4密钥必须为16字节
|
||||
sm4Key := []byte("1234567890abcdef") // 16字节密钥
|
||||
sm3Salt := "my_sm3_salt_value"
|
||||
baseURL := server.URL
|
||||
|
||||
client, err := NewClient(sm4Key, sm3Salt, baseURL)
|
||||
if err != nil {
|
||||
log.Fatalf("创建客户端失败: %v", err)
|
||||
}
|
||||
|
||||
// 调用下单接口
|
||||
req := &PlaceOrderRequest{
|
||||
ActCode: "ACT001",
|
||||
GoodsCode: "123456",
|
||||
ActOrderNum: "00001",
|
||||
Account: "19912345678",
|
||||
CallbackUrl: "https://xxx/notice",
|
||||
}
|
||||
|
||||
resp, data, err := client.PlaceOrder(context.Background(), req)
|
||||
if err != nil {
|
||||
log.Fatalf("下单失败: %v", err)
|
||||
}
|
||||
|
||||
if resp.Code != 0 {
|
||||
fmt.Printf("下单失败: %s\n", resp.Msg)
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Printf("订单号: %s\n", data.OrderNo)
|
||||
fmt.Printf("卡号: %s\n", data.CouponNo)
|
||||
fmt.Printf("卡密: %s\n", data.CouponCode)
|
||||
fmt.Printf("状态: %d\n", data.Status)
|
||||
fmt.Printf("有效期: %s\n", data.ExpireTime)
|
||||
|
||||
// Output:
|
||||
// 订单号: HM17575805323790000127073398f3772c00
|
||||
// 卡号: 27073398f3772c00
|
||||
// 卡密: 27073398f3772c00
|
||||
// 状态: 1
|
||||
// 有效期: 2025-09-12 00:00:00
|
||||
}
|
||||
|
||||
// ExampleClient_QueryOrder 演示订单查询
|
||||
func ExampleClient_QueryOrder() {
|
||||
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
resp := EncryptedResponse{
|
||||
Code: 0,
|
||||
Msg: "请求成功",
|
||||
Data: strPtr(`{"orderNo":"HM1757046717684000102707339840b23222","cardInfo":"{\"couponNo\":\"11111\",\"couponCode\":\"12334\",\"expireTime\":\"2029-03-09 00:00:00\"}","status":3}`),
|
||||
}
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
json.NewEncoder(w).Encode(resp)
|
||||
}))
|
||||
defer server.Close()
|
||||
|
||||
client, _ := NewClient([]byte("1234567890abcdef"), "my_sm3_salt", server.URL)
|
||||
|
||||
req := &QueryOrderRequest{
|
||||
ActCode: "FBG6vdYqGE4mGX7EH/woEg==",
|
||||
OrderNo: "HM1757046717684000102707339840b23222",
|
||||
}
|
||||
|
||||
resp, data, err := client.QueryOrder(context.Background(), req)
|
||||
if err != nil {
|
||||
log.Fatalf("查询失败: %v", err)
|
||||
}
|
||||
|
||||
if resp.Code != 0 {
|
||||
fmt.Printf("查询失败: %s\n", resp.Msg)
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Printf("订单号: %s\n", data.OrderNo)
|
||||
fmt.Printf("状态: %d\n", data.Status)
|
||||
if data.CardInfo != nil {
|
||||
fmt.Printf("卡号: %s\n", data.CardInfo.CouponNo)
|
||||
fmt.Printf("卡密: %s\n", data.CardInfo.CouponCode)
|
||||
fmt.Printf("过期时间: %s\n", data.CardInfo.ExpireTime)
|
||||
}
|
||||
|
||||
// Output:
|
||||
// 订单号: HM1757046717684000102707339840b23222
|
||||
// 状态: 3
|
||||
// 卡号: 11111
|
||||
// 卡密: 12334
|
||||
// 过期时间: 2029-03-09 00:00:00
|
||||
}
|
||||
|
||||
// ExampleClient_WechatRecharge 演示微信立减金充值
|
||||
func ExampleClient_WechatRecharge() {
|
||||
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
resp := EncryptedResponse{
|
||||
Code: 0,
|
||||
Msg: "请求成功",
|
||||
Data: strPtr(`{"orderNo":"0001","couponId":"123456","status":1}`),
|
||||
}
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
json.NewEncoder(w).Encode(resp)
|
||||
}))
|
||||
defer server.Close()
|
||||
|
||||
client, _ := NewClient([]byte("1234567890abcdef"), "my_sm3_salt", server.URL)
|
||||
|
||||
req := &WechatRechargeRequest{
|
||||
ActCode: "FBG6vdYqGE4mGX7EH/woEg==",
|
||||
GoodsCode: "0001",
|
||||
ActOrderNum: "0001",
|
||||
OpenId: "0001",
|
||||
AppId: "00001",
|
||||
}
|
||||
|
||||
resp, data, err := client.WechatRecharge(context.Background(), req)
|
||||
if err != nil {
|
||||
log.Fatalf("充值失败: %v", err)
|
||||
}
|
||||
|
||||
if resp.Code != 0 {
|
||||
fmt.Printf("充值失败: %s\n", resp.Msg)
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Printf("订单号: %s\n", data.OrderNo)
|
||||
fmt.Printf("优惠ID: %s\n", data.CouponId)
|
||||
fmt.Printf("状态: %d\n", data.Status)
|
||||
|
||||
// Output:
|
||||
// 订单号: 0001
|
||||
// 优惠ID: 123456
|
||||
// 状态: 1
|
||||
}
|
||||
|
||||
// ExampleClient_ParseNotifyRequest 演示解析回调通知
|
||||
func ExampleClient_ParseNotifyRequest() {
|
||||
client, _ := NewClient([]byte("1234567890abcdef"), "my_sm3_salt", "http://example.com")
|
||||
|
||||
// 模拟供应商发来的回调通知
|
||||
notifyData := NotifyRequest{
|
||||
OrderNo: "HM202509291010001",
|
||||
ActOrderNum: "XY2025092910100001",
|
||||
Status: 3,
|
||||
Account: "19912345678",
|
||||
}
|
||||
|
||||
// 加密并签名(模拟供应商端操作)
|
||||
encryptedData, timestamp, sign, err := client.encryptAndSign(notifyData)
|
||||
if err != nil {
|
||||
log.Fatalf("加密失败: %v", err)
|
||||
}
|
||||
|
||||
// 构建HTTP请求
|
||||
reqBody := fmt.Sprintf(`{"encryptedData":"%s"}`, encryptedData)
|
||||
httpReq := httptest.NewRequest(http.MethodPost, "/notify", strings.NewReader(reqBody))
|
||||
httpReq.Header.Set("Content-Type", "application/json")
|
||||
httpReq.Header.Set("timestamp", timestamp)
|
||||
httpReq.Header.Set("sign", sign)
|
||||
|
||||
// 解析回调通知
|
||||
notifyReq, err := client.ParseNotifyRequest(httpReq)
|
||||
if err != nil {
|
||||
log.Fatalf("解析回调通知失败: %v", err)
|
||||
}
|
||||
|
||||
fmt.Printf("订单号: %s\n", notifyReq.OrderNo)
|
||||
fmt.Printf("活动方订单号: %s\n", notifyReq.ActOrderNum)
|
||||
fmt.Printf("状态: %d\n", notifyReq.Status)
|
||||
fmt.Printf("账号: %s\n", notifyReq.Account)
|
||||
|
||||
// 生成成功响应
|
||||
statusCode, body := NotifyResponseOK()
|
||||
fmt.Printf("响应状态码: %d\n", statusCode)
|
||||
fmt.Printf("响应内容: %s\n", body)
|
||||
|
||||
// Output:
|
||||
// 订单号: HM202509291010001
|
||||
// 活动方订单号: XY2025092910100001
|
||||
// 状态: 3
|
||||
// 账号: 19912345678
|
||||
// 响应状态码: 200
|
||||
// 响应内容: ok
|
||||
}
|
||||
|
||||
// strPtr 辅助函数:返回字符串指针
|
||||
func strPtr(s string) *string {
|
||||
return &s
|
||||
}
|
||||
Loading…
Reference in New Issue