收藏
评论

沙盒密钥相关问题

请求 url 为:https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey

问题1:接口设计不好,为什么不是直接在后台查询或生成,而要通过一个接口去获取。

问题2:接口文档有误。文档上写的字段名 return_msg ,实际上却是 retmsg(没有 return_msg 字段)。

最后贡献一个 go 程序用来查询。使用方法:

cmd --mch_id=<商户id>  --key=<密钥>

package main
 
import (
    "bytes"
    "crypto/md5"
    "encoding/xml"
    "flag"
    "fmt"
    "io/ioutil"
    "net/http"
)
 
var (
    mchID string
    key   string
)
 
func postXML(url string, req interface{}, rsp interface{}) error {
    reqData, err := xml.Marshal(req)
    if err != nil {
        return fmt.Errorf("序列化失败: %w", err)
    }
    resp, err := http.Post(url, "application/json", bytes.NewReader(reqData))
    if err != nil {
        return fmt.Errorf("post 失败: %w", err)
    }
    rspData, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return fmt.Errorf("读取应答失败: %w", err)
    }
    if err = xml.Unmarshal(rspData, rsp); err != nil {
        return fmt.Errorf("反序列化应答数据失败: %w", err)
    }
    return nil
}
 
func getSignKey() string {
    params := struct {
        MchID    string `xml:"mch_id"`
        NonceStr string `xml:"nonce_str"`
        Sign     string `xml:"sign"`
 
        XMLName struct{} `xml:"xml" json:"-"`
    }{
        MchID: mchID, NonceStr: "abcjkaldjfiuea",
    }
 
    source := "mch_id=" + mchID + "&nonce_str=" + "abcjkaldjfiuea" + "&key=" + key
    dst := md5.Sum([]byte(source))
    params.Sign = fmt.Sprintf("%X", dst)
 
    result := struct {
        ReturnCode string   `xml:"return_code"`
        ReturnMsg  string   `xml:"return_msg"`
        Key        string   `xml:"sandbox_signkey"`
        XMLName    struct{} `xml:"xml" json:"-"`
    }{}
 
    if err := postXML("https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey", &params, &result); err != nil {
        panic(err)
    }
    if result.ReturnCode != "SUCCESS" {
        fmt.Printf("返回码校验失败: %#v", result)
        return ""
    }
    return result.Key
}
 
func init() {
    flag.StringVar(&mchID, "mch_id", "", "商户 id")
    flag.StringVar(&key, "key", "", "商户密钥")
 
    flag.Parse()
}



最后一次编辑于  11-11
赞 0
收藏

1 个评论

  • 安
    11-11

    问题3:

    现在是固定了测试用例,只能支付 201,202吗?

    我第一次支付 600,提示 “沙箱支付金额(600)无效,请检查需要验收的case”


    问题4:

    出现超时的返回:

    <html>\r\n<head><title>504 Gateway Time-out</title

    ></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>504 Gateway Time-out</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n



    感觉这个沙箱接口并不是提供给我测试用的,还是自己写 mock 吧。

    11-11
    赞同
    回复