|
@ -0,0 +1,111 @@ |
|
|
|
|
|
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 = CreateClient(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 |
|
|
|
|
|
} |