|
|
- 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
- }
|