收藏
回答

golang发起 微信预支付交易单 提交报错 “Http头Authorization值格式错误”

golang发起 微信预支付交易单 提交报错 “Http头Authorization值格式错误,请参考《微信支付商户REST API签名规则》”
怎么解决?官方文档不明确,有例子吗?

// 微信预支付交易单

func getWeChatOrderPay() interface{} {
    url := "https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi"


    jsonStr := []byte(`{
        
        "mchid": "直连商户号",
        "out_trade_no": "商户自己订单号",
        "appid": "应用ID",
        "description": "商品名称商品名称",
        "notify_url": "支付结果通知的回调地址",
        "amount": {
            "total":100,
            "currency": "CNY"
        },
        "payer": {
            "openid":"用户标识唯一openid"
        }
    }`)


    req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonStr))
    if err != nil {
        log.Println("微信预支付交易单 byte异常:", err)
    }


    req.Header.Set("Authorization", "WECHATPAY2-SHA256-RSA2048")
    req.Header.Set("Content-Type", "application/json")
    req.Header.Set("Accept", "application/json")
    


    client := &http.Client{} //发起请求
    resp, err := client.Do(req)
    if err != nil {
        log.Println("微信预支付交易单 POST异常:", err)
    }
    defer resp.Body.Close()


    statusCode := resp.StatusCode
    //head := resp.Header
    body, _ := ioutil.ReadAll(resp.Body)


    fmt.Println(string(body))
    fmt.Println("状态码:", statusCode)
    //fmt.Println("请求头:", head)


    return string(body)
    /* ============================ */
    // mchid 直连商户号
    // out_trade_no 商户自己订单号
    // appid   应用ID
    // description 商品描述
    // notify_url 支付结果通知的回调地址
    // amount:{ //订单金额信息
    //      total:   //总金额 //单位为分
    //      currency:CNY  //货币类型
    // }
    // payer:{ //支付者信息 用户标识唯一openid
    //      openid
    // }


}
回答关注问题邀请回答
收藏

2 个回答

  • Linwute
    Linwute
    2023-01-09

    最后解决办法

    // 发起支付请求 微信预支付交易单 
    // 项目下终端加载微信官方包 go get -u github.com/wechatpay-apiv3/wechatpay-go
    func GetWeChatOrderPay() interface{} {
        var (
            mchID                      string = "160*****"    // 商户号
            mchCertificateSerialNumber string = "321*****" // 商户证书序列号
            mchAPIv3Key                string = "0de*****" // 商户APIv3密钥
        )
    
        // 使用 utils 提供的函数从本地文件中加载商户私钥,商户私钥会用来生成请求的签名
        mchPrivateKey, err := utils.LoadPrivateKeyWithPath("/golang/wechat/cert/apiclient_key.pem(商户APIv3密钥文件路径)")
        if err != nil {
            log.Println("微信预支付交易单 加载商家私钥错误:", err)
        }
    
        ctx := context.Background()
        // 使用商户私钥等初始化 client,并使它具有自动定时获取微信支付平台证书的能力
        opts := []core.ClientOption{
            option.WithWechatPayAutoAuthCipher(mchID, mchCertificateSerialNumber, mchPrivateKey, mchAPIv3Key),
        }
        client, err := core.NewClient(ctx, opts...)
        if err != nil {
            log.Println("微信预支付交易单 新微信支付客户端出错 :", err)
        }
    
        svc := jsapi.JsapiApiService{Client: client}
        // 得到prepay_id,以及调起支付所需的参数和签名
        resp, result, err := svc.PrepayWithRequestPayment(ctx,
            jsapi.PrepayRequest{
                Appid:       core.String("wxf77****"), //微信小程序id
                Mchid:       core.String("16*******"), //商户号
                Description: core.String("自定义订单商品名称"), //商品名称
                OutTradeNo:  core.String("自定义订单id"),   //自定义商品订单id
                Attach:      core.String("自定义数据说明"),
                NotifyUrl:   core.String("https://www.****"), //自定义支付成功反馈地址
                Amount: &jsapi.Amount{
                    Total: core.Int64(100),
                },
                Payer: &jsapi.Payer{
                    Openid: core.String("oNE*****"), //支付者微信id
                },
            },
        )
    
        if err == nil {
            log.Println("微信预支付交易单 调起支付得到prepay_id resp错误: ", resp)
        } else {
            log.Println("微信预支付交易单 调起支付得到prepay_id 错误: ", err)
        }
        log.Println("微信预支付交易单 调起支付得到prepay_id 数据结果: \n", result)
    
        return ""
    }
    
    
    2023-01-09
    有用 1
    回复
  • Memory
    Memory
    2023-01-09

    去用这个sdkhttps://github.com/wechatpay-apiv3/wechatpay-go

    2023-01-09
    有用 1
    回复
登录 后发表内容