微信相关接口
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

111 lines
2.8 KiB

package wechat
import (
"context"
"crypto/rsa"
"crypto/x509"
"errors"
"io/ioutil"
"log"
"git.tetele.net/tgo/helper"
"github.com/wechatpay-apiv3/wechatpay-go/core"
"github.com/wechatpay-apiv3/wechatpay-go/core/option"
"github.com/wechatpay-apiv3/wechatpay-go/utils"
)
/**
* 查询支付情况
* wx_appid 公众号 appid
* wx_mch_id 商户号
* wx_mch_serial_no 支付密钥
* wx_mch_apiclient_key 商户私钥
* wx_pay_cert 平台证书
*/
func GetPayResult(dbname, order_sn, wx_appid, wx_mch_id, wx_mch_serial_no, wx_mch_apiclient_key, wx_pay_cert string) (bool, map[string]interface{}, error) {
var (
ctx context.Context = context.Background()
client *core.Client
)
if wx_appid == "" {
return false, nil, errors.New("没有appid")
}
if wx_mch_id == "" {
return false, nil, errors.New("没有商户号")
}
privateKey, err := utils.LoadPrivateKey(wx_mch_apiclient_key)
if err != nil {
log.Println("商户私钥有误:", err)
return false, nil, errors.New("商户私钥不正确")
}
wechatPayCertificate, err := utils.LoadCertificate(wx_pay_cert)
if err != nil {
log.Println("平台证书有误:", err)
return false, nil, errors.New("平台证书不正确")
}
client, err = CreatePayClient(ctx, wechatPayCertificate, privateKey, wx_mch_id, wx_mch_serial_no)
if err != nil {
log.Println("create pay client error:", err)
return false, nil, errors.New("构造失败")
}
url := "https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/" + order_sn + "?mchid=" + wx_mch_id
ret, err := client.Get(ctx, url)
body, err := ioutil.ReadAll(ret.Response.Body)
var resp map[string]interface{}
err = json.Unmarshal(body, &resp)
if err != nil {
log.Println("json unmarshal error:", err)
return false, nil, err
} else {
if _, exists := resp["trade_state"]; exists {
if helper.ToStr(resp["trade_state"]) == "SUCCESS" {
return true, resp, nil
}
}
}
return false, nil, nil
}
/**
* 构造支付请求
* privateKey 商户私钥
* wechatPayCertificate 平台证书
* mchID 商户号
* mchSerialNo 支付密钥
*/
func CreatePayClient(ctx context.Context, wechatPayCertificate *x509.Certificate, privateKey *rsa.PrivateKey, mchID, mchSerialNo string) (*core.Client, error) {
var client *core.Client
var err error
if wechatPayCertificate != nil {
client, err = core.NewClient(
ctx, option.WithMerchantCredential(mchID, mchSerialNo, privateKey),
option.WithWechatPayCertificate([]*x509.Certificate{wechatPayCertificate}),
)
if err != nil {
log.Println("创建 Client 失败:", err)
return nil, err
}
} else {
client, err = core.NewClient(
ctx, option.WithMerchantCredential(mchID, mchSerialNo, privateKey), option.WithoutValidator(),
)
if err != nil {
log.Println("创建 Client 失败:", err)
return nil, err
}
}
return client, nil
}