wxpay_service.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package wxpay
  2. import (
  3. "context"
  4. "crypto/rsa"
  5. "github.com/gogf/gf/frame/g"
  6. "github.com/gogf/gf/net/ghttp"
  7. "github.com/wechatpay-apiv3/wechatpay-go/core"
  8. "github.com/wechatpay-apiv3/wechatpay-go/core/option"
  9. "github.com/wechatpay-apiv3/wechatpay-go/services/payments/jsapi"
  10. wxpayUtils "github.com/wechatpay-apiv3/wechatpay-go/utils"
  11. "log"
  12. "youngmini_server/app/utils"
  13. )
  14. var service = new(wxPayService)
  15. type wxPayService struct {
  16. }
  17. func (s *wxPayService) WxPayRequest(r *ghttp.Request, req WxPayRequestData) (WxPayResponseData, error) {
  18. openId, err := utils.SessionTalentInfo.GetOpenIdFromSession(r)
  19. if err != nil {
  20. log.Fatalf("get WxOpenId error:%s", err)
  21. }
  22. appID := g.Config().GetString("miniapp.appid")
  23. mchID := g.Config().GetString("miniapp.mchid")
  24. mchCertificateSerialNumber := g.Config().GetString("miniapp.mchCertificateSerialNumber")
  25. mchAPIv3Key := g.Config().GetString("miniapp.mchAPIv3Key")
  26. // 使用 utils 提供的函数从本地文件中加载商户私钥,商户私钥会用来生成请求的签名
  27. mchPrivateKey, err := wxpayUtils.LoadPrivateKeyWithPath("./apiclient_key.pem")
  28. if err != nil {
  29. log.Fatalf("load merchant private key error:%s", err)
  30. }
  31. ctx := context.Background()
  32. // 使用商户私钥等初始化 client,并使它具有自动定时获取微信支付平台证书的能力
  33. opts := []core.ClientOption{
  34. option.WithWechatPayAutoAuthCipher(mchID, mchCertificateSerialNumber, mchPrivateKey, mchAPIv3Key),
  35. }
  36. client, err := core.NewClient(ctx, opts...)
  37. if err != nil {
  38. log.Fatalf("new wechat pay client err:%s", err)
  39. }
  40. svc := jsapi.JsapiApiService{Client: client}
  41. // 得到prepay_id,以及调起支付所需的参数和签名
  42. var tradeId = utils.GetUuid.GetRandomString(32)
  43. resp, result, err := svc.PrepayWithRequestPayment(ctx,
  44. jsapi.PrepayRequest{
  45. Appid: core.String(appID),
  46. Mchid: core.String(mchID),
  47. Description: core.String(req.Description),
  48. OutTradeNo: core.String(tradeId),
  49. NotifyUrl: core.String("https://www.weixin.qq.com/wxpay/pay.php"),
  50. Amount: &jsapi.Amount{
  51. Total: core.Int64(req.Amount),
  52. },
  53. Payer: &jsapi.Payer{
  54. Openid: core.String(openId),
  55. },
  56. },
  57. )
  58. if err == nil {
  59. log.Println(resp)
  60. log.Println(result)
  61. var packageStr = "prepay_id=" + *resp.PrepayId
  62. var parts []string
  63. parts = append(parts, appID)
  64. parts = append(parts, *resp.TimeStamp)
  65. parts = append(parts, tradeId)
  66. parts = append(parts, packageStr)
  67. sign, err := getSign(parts, mchPrivateKey)
  68. if err == nil {
  69. var res = WxPayResponseData{
  70. Package: packageStr,
  71. TimeStamp: *resp.TimeStamp,
  72. NonceStr: tradeId,
  73. PaySign: sign,
  74. }
  75. return res, nil
  76. } else {
  77. log.Println(err)
  78. }
  79. } else {
  80. log.Println(err)
  81. }
  82. return WxPayResponseData{}, err
  83. }
  84. func getSign(parts []string, privateKey *rsa.PrivateKey) (string, error) {
  85. var str string
  86. for i := range parts {
  87. str += parts[i] + "\n"
  88. }
  89. sign, err := wxpayUtils.SignSHA256WithRSA(str, privateKey)
  90. if err != nil {
  91. log.Println(err)
  92. return "", err
  93. } else {
  94. log.Println(sign)
  95. return sign, nil
  96. }
  97. }