api_jsapi_request_payment.go 2.8 KB

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