wx.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package wx
  2. import (
  3. "fmt"
  4. "git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
  5. "git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
  6. "git.qianqiusoft.com/qianqiusoft/light-apiengine/utils"
  7. "errors"
  8. "github.com/silenceper/wechat/pay"
  9. "github.com/silenceper/wechat/util"
  10. "strconv"
  11. )
  12. var wxPayCallbackHandler func(result *pay.NotifyResult)models.SysReturn = nil
  13. // 注册微信支付回调处理函数
  14. func RegisterWxPayCallbackHandler(handler func(result *pay.NotifyResult)models.SysReturn){
  15. wxPayCallbackHandler = handler
  16. }
  17. func CallWxPayCallbackHandler(c *entitys.CtrlContext)models.SysReturn{
  18. if wxPayCallbackHandler == nil{
  19. return models.SysReturn{500, "微信支付回调处理函数为空", nil}
  20. }
  21. notifyRet := pay.NotifyResult{}
  22. err := c.Ctx.BindXML(&notifyRet)
  23. if err != nil{
  24. fmt.Println("******************----》微信支付回调bindxml错误", err.Error())
  25. return models.SysReturn{500, err.Error(), nil}
  26. }
  27. return wxPayCallbackHandler(&notifyRet)
  28. }
  29. // 扫码支付
  30. func PayNative(params *PayParams)(*pay.PayResult, error){
  31. ip := utils.GetIP(params.Ctx)
  32. attach := params.Attach
  33. if attach == ""{
  34. attach = params.Ctx.Ctx.GetString("user_id")
  35. if attach == ""{
  36. attach = "attach"
  37. }
  38. }
  39. body := params.Body
  40. if body == ""{
  41. body = "body"
  42. }
  43. if params.OutTradeNo == ""{
  44. return nil, errors.New("交易单号为空")
  45. }
  46. parParams := pay.Params{strconv.Itoa(params.TotalFee), ip, body, attach, params.OutTradeNo, ""}
  47. return wc.GetPay().PreNative(&parParams)
  48. }
  49. // jsapi 支付
  50. func PayJSAPI(params *PayParams)(*JSAPIPayConfig, error){
  51. openId := params.OpenId
  52. if openId == ""{
  53. return nil, errors.New("openid 为空")
  54. }
  55. if params.OutTradeNo == ""{
  56. return nil, errors.New("交易单号为空")
  57. }
  58. attach := params.Attach
  59. if attach == ""{
  60. attach = params.Ctx.Ctx.GetString("user_id")
  61. if attach == ""{
  62. attach = "attach"
  63. }
  64. }
  65. body := params.Body
  66. if body == ""{
  67. body = "body"
  68. }
  69. ip := utils.GetIP(params.Ctx)
  70. payParams := pay.Params{strconv.Itoa(params.TotalFee), ip, body, attach, params.OutTradeNo, params.OpenId}
  71. payObj := wc.GetPay()
  72. prePayID, err := payObj.PrePayID(&payParams)
  73. if err != nil{
  74. fmt.Println("----------------->prepayid error", err.Error())
  75. return nil, err
  76. }
  77. nonceStr := util.RandomStr(32)
  78. timestamp := util.GetCurrTs()
  79. pack := "prepay_id=" + prePayID
  80. template := "appId=%s&nonceStr=%s&package=%s&signType=MD5&timeStamp=%s&key=%s"
  81. str := fmt.Sprintf(template, payObj.AppID, nonceStr, pack, strconv.FormatInt(timestamp, 10), payObj.PayKey)
  82. sign := util.MD5Sum(str)
  83. payCfg := pay.Config{timestamp, nonceStr, prePayID, "MD5", sign}
  84. exPayConfig := JSAPIPayConfig{}
  85. exPayConfig.NonceStr = payCfg.NonceStr
  86. exPayConfig.OutTradeNo = params.OutTradeNo
  87. exPayConfig.Package = "prepay_id=" + payCfg.PrePayID
  88. exPayConfig.PaySign = payCfg.Sign
  89. exPayConfig.SignType = payCfg.SignType
  90. exPayConfig.Timestamp = strconv.Itoa(int(payCfg.Timestamp))
  91. if err==nil {
  92. return &exPayConfig, nil
  93. }else{
  94. return nil, err
  95. }
  96. }