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