wechatPay.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. }
  59. func QueryOrderByOutTradeNo(tradeId string) (status string, err error) {
  60. var (
  61. mchID string = "1615933939" // 商户号
  62. mchCertificateSerialNumber string = "33DDFEC51BF5412F663B9B56510FD567B625FC68" // 商户证书序列号
  63. mchAPIv3Key string = "fvV2xDHuM8ch3QagCkLChEMsikUTSNiI" // 商户APIv3密钥
  64. )
  65. // 使用 utils 提供的函数从本地文件中加载商户私钥,商户私钥会用来生成请求的签名
  66. mchPrivateKey, err := utils.LoadPrivateKeyWithPath("./apiclient_key.pem")
  67. if err != nil {
  68. log.Print("load merchant private key error")
  69. }
  70. ctx := context.Background()
  71. // 使用商户私钥等初始化 client,并使它具有自动定时获取微信支付平台证书的能力
  72. opts := []core.ClientOption{
  73. option.WithWechatPayAutoAuthCipher(mchID, mchCertificateSerialNumber, mchPrivateKey, mchAPIv3Key),
  74. }
  75. client, err := core.NewClient(ctx, opts...)
  76. if err != nil {
  77. log.Printf("new wechat pay client err:%s", err)
  78. }
  79. svc := native.NativeApiService{Client: client}
  80. resp, result, err := svc.QueryOrderByOutTradeNo(ctx,
  81. native.QueryOrderByOutTradeNoRequest{
  82. OutTradeNo: core.String(tradeId),
  83. Mchid: core.String("1615933939"),
  84. },
  85. )
  86. if err != nil {
  87. // 处理错误
  88. log.Printf("call QueryOrderByOutTradeNo err:%s", err)
  89. return "", err
  90. } else {
  91. // 处理返回结果
  92. log.Printf("status=%d resp=%s", result.Response.StatusCode, resp)
  93. }
  94. return *resp.TradeState, nil
  95. }