wechatPay.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package service
  2. import (
  3. "context"
  4. "github.com/wechatpay-apiv3/wechatpay-go/core"
  5. "github.com/wechatpay-apiv3/wechatpay-go/core/option"
  6. "github.com/wechatpay-apiv3/wechatpay-go/services/payments/native"
  7. "github.com/wechatpay-apiv3/wechatpay-go/utils"
  8. "log"
  9. "time"
  10. )
  11. func NativeApiServicePrepay(tradeId string, amount int64) (codeUrl string, err error) {
  12. var (
  13. mchID string = "1615933939" // 商户号
  14. mchCertificateSerialNumber string = "33DDFEC51BF5412F663B9B56510FD567B625FC68" // 商户证书序列号
  15. mchAPIv3Key string = "fvV2xDHuM8ch3QagCkLChEMsikUTSNiI" // 商户APIv3密钥
  16. )
  17. // 使用 utils 提供的函数从本地文件中加载商户私钥,商户私钥会用来生成请求的签名
  18. mchPrivateKey, err := utils.LoadPrivateKeyWithPath("./apiclient_key.pem")
  19. if err != nil {
  20. log.Print("load merchant private key error")
  21. }
  22. ctx := context.Background()
  23. // 使用商户私钥等初始化 client,并使它具有自动定时获取微信支付平台证书的能力
  24. opts := []core.ClientOption{
  25. option.WithWechatPayAutoAuthCipher(mchID, mchCertificateSerialNumber, mchPrivateKey, mchAPIv3Key),
  26. }
  27. client, err := core.NewClient(ctx, opts...)
  28. if err != nil {
  29. log.Printf("new wechat pay client err:%s", err)
  30. }
  31. svc := native.NativeApiService{Client: client}
  32. resp, result, err := svc.Prepay(ctx,
  33. native.PrepayRequest{
  34. Appid: core.String("wxac396a3be7a16844"),
  35. Mchid: core.String("1615933939"),
  36. Description: core.String("样叽微信支付充值"),
  37. OutTradeNo: core.String(tradeId),
  38. TimeExpire: core.Time(time.Now()),
  39. Attach: core.String("微信支付充值"),
  40. NotifyUrl: core.String("https://www.weixin.qq.com/wxpay/pay.php"),
  41. SupportFapiao: core.Bool(true),
  42. Amount: &native.Amount{
  43. Currency: core.String("CNY"),
  44. Total: core.Int64(amount),
  45. },
  46. },
  47. )
  48. if err != nil {
  49. // 处理错误
  50. log.Printf("call Prepay err:%s", err)
  51. return "", err
  52. } else {
  53. // 处理返回结果
  54. log.Printf("status=%d resp=%s", result.Response.StatusCode, resp)
  55. log.Println("codeUrl:", *resp.CodeUrl)
  56. }
  57. return *resp.CodeUrl, nil
  58. }