api_jsapi_request_payment.go 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package jsapi
  2. import (
  3. "context"
  4. "fmt"
  5. "git.nanodreamtech.com/sg/wechatpay-go/core"
  6. "git.nanodreamtech.com/sg/wechatpay-go/utils"
  7. "strconv"
  8. "time"
  9. )
  10. type PrepayWithRequestPaymentResponse struct {
  11. // 预支付交易会话标识
  12. PrepayId *string `json:"prepay_id"` // revive:disable-line:var-naming
  13. // 应用ID
  14. Appid *string `json:"appid"`
  15. // 时间戳
  16. TimeStamp *string `json:"timeStamp"`
  17. // 随机字符串
  18. NonceStr *string `json:"nonceStr"`
  19. // 订单详情扩展字符串
  20. Package *string `json:"package"`
  21. // 签名方式
  22. SignType *string `json:"signType"`
  23. // 签名
  24. PaySign *string `json:"paySign"`
  25. }
  26. // PrepayWithRequestPayment Jsapi支付下单,并返回调起支付的请求参数
  27. func (a *JsapiApiService) PrepayWithRequestPayment(
  28. ctx context.Context, req PrepayRequest, requestPaymentAppid string,
  29. ) (resp *PrepayWithRequestPaymentResponse, result *core.APIResult, err error) {
  30. prepayResp, result, err := a.Prepay(ctx, req)
  31. if err != nil {
  32. return nil, result, err
  33. }
  34. resp = new(PrepayWithRequestPaymentResponse)
  35. resp.PrepayId = prepayResp.PrepayId
  36. resp.SignType = core.String("RSA")
  37. resp.Appid = &requestPaymentAppid
  38. resp.TimeStamp = core.String(strconv.FormatInt(time.Now().Unix(), 10))
  39. nonce, err := utils.GenerateNonce()
  40. if err != nil {
  41. return nil, nil, fmt.Errorf("generate request for payment err:%s", err.Error())
  42. }
  43. resp.NonceStr = core.String(nonce)
  44. resp.Package = core.String("prepay_id=" + *prepayResp.PrepayId)
  45. message := fmt.Sprintf("%s\n%s\n%s\n%s\n", *resp.Appid, *resp.TimeStamp, *resp.NonceStr, *resp.Package)
  46. signatureResult, err := a.Client.Sign(ctx, message)
  47. if err != nil {
  48. return nil, nil, fmt.Errorf("generate sign for payment err:%s", err.Error())
  49. }
  50. resp.PaySign = core.String(signatureResult.Signature)
  51. return resp, result, nil
  52. }
  53. func (o PrepayWithRequestPaymentResponse) String() string {
  54. var ret string
  55. if o.PrepayId == nil {
  56. ret += "PrepayId:<nil>, "
  57. } else {
  58. ret += fmt.Sprintf("PrepayId:%v, ", *o.PrepayId)
  59. }
  60. if o.Appid == nil {
  61. ret += "Appid:<nil>, "
  62. } else {
  63. ret += fmt.Sprintf("Appid:%v, ", *o.Appid)
  64. }
  65. if o.TimeStamp == nil {
  66. ret += "TimeStamp:<nil>, "
  67. } else {
  68. ret += fmt.Sprintf("TimeStamp:%v, ", *o.TimeStamp)
  69. }
  70. if o.NonceStr == nil {
  71. ret += "NonceStr:<nil>, "
  72. } else {
  73. ret += fmt.Sprintf("NonceStr:%v, ", *o.NonceStr)
  74. }
  75. if o.Package == nil {
  76. ret += "Package:<nil>, "
  77. } else {
  78. ret += fmt.Sprintf("Package:%v, ", *o.Package)
  79. }
  80. if o.SignType == nil {
  81. ret += "SignType:<nil>"
  82. } else {
  83. ret += fmt.Sprintf("SignType:%v", *o.SignType)
  84. }
  85. if o.PaySign == nil {
  86. ret += "PaySign:<nil>"
  87. } else {
  88. ret += fmt.Sprintf("PaySign:%v", *o.PaySign)
  89. }
  90. return fmt.Sprintf("PrepayResponse{%s}", ret)
  91. }