81 lines
2.2 KiB
Go
81 lines
2.2 KiB
Go
package payment
|
||
|
||
import (
|
||
"bytes"
|
||
"encoding/json"
|
||
"fmt"
|
||
"io/ioutil"
|
||
"net/http"
|
||
"time"
|
||
)
|
||
|
||
// OrderQuery 查询订单支付状态
|
||
func (c *Client) OrderQuery(orderNo string) (*OrderQueryResponse, error) {
|
||
now := time.Now().Format("20060102150405")
|
||
BusiMainId := now + RandomNumber(10)
|
||
|
||
requestBody := map[string]interface{}{
|
||
"head": map[string]string{
|
||
"partnerTxSriNo": BusiMainId,
|
||
"reqTime": now,
|
||
"method": "b2c.gatewaypay.orderQuery",
|
||
"version": "1",
|
||
"merchantId": c.cfg.MerchantId,
|
||
"appID": c.cfg.AppID,
|
||
"accessType": "API",
|
||
"reserve": "",
|
||
},
|
||
"body": map[string]interface{}{
|
||
"busiMainId": BusiMainId,
|
||
"reqTransTime": now,
|
||
"data": map[string]string{
|
||
"txnCode": "1004",
|
||
"sourceId": "16",
|
||
"reqTraceId": now + RandomNumber(10),
|
||
"reqDate": time.Now().Format("20060102"),
|
||
"mchtNo": c.cfg.MchtNo,
|
||
"oldSeqNo": orderNo,
|
||
},
|
||
},
|
||
}
|
||
|
||
encryptedReq, err := EncryptRequest(requestBody, c.cfg)
|
||
if err != nil {
|
||
return nil, fmt.Errorf("加密请求失败: %v", err)
|
||
}
|
||
|
||
encryptedBytes, _ := json.Marshal(encryptedReq)
|
||
url := c.cfg.OrderHost + c.cfg.MerchantId + ".htm?partnerTxSriNo=" + BusiMainId
|
||
|
||
resp, err := http.Post(url, "application/json", bytes.NewReader(encryptedBytes))
|
||
if err != nil {
|
||
return nil, fmt.Errorf("请求失败: %v", err)
|
||
}
|
||
defer resp.Body.Close()
|
||
|
||
body, err := ioutil.ReadAll(resp.Body)
|
||
if err != nil {
|
||
return nil, fmt.Errorf("读取响应失败: %v", err)
|
||
}
|
||
|
||
if resp.StatusCode != http.StatusOK {
|
||
return nil, fmt.Errorf("HTTP请求失败,状态码: %d,响应: %s", resp.StatusCode, string(body))
|
||
}
|
||
|
||
responseData, err := c.DecryptResponse(string(body), false)
|
||
if err != nil {
|
||
return nil, fmt.Errorf("解密响应失败: %v,原始响应: %s", err, string(body))
|
||
}
|
||
|
||
var result OrderQueryResponse
|
||
if err := json.Unmarshal([]byte(responseData), &result); err != nil {
|
||
return nil, fmt.Errorf("解析响应失败: %v,响应内容: %s", err, responseData)
|
||
}
|
||
|
||
if result.RespCode != "" && result.RespCode != "0000" && result.RespCode != "00" {
|
||
return nil, fmt.Errorf("订单查询失败,错误码: %s,错误信息: %s", result.RespCode, result.RespMsg)
|
||
}
|
||
|
||
return &result, nil
|
||
}
|