支付模块
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

96 lines
4.8 KiB

  1. package luso_bank
  2. import (
  3. zhios_pay_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_pay.git/utils"
  4. "crypto"
  5. "encoding/base64"
  6. "fmt"
  7. "github.com/syyongx/php2go"
  8. "math/rand"
  9. "time"
  10. )
  11. const (
  12. MerchantId = "30010"
  13. TerminalNo = "98036140"
  14. PrivateKeyStr = "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDSYivjR7nXUazy\nf+F1i/nvuy/doiHRsiTSwavHIwKF88kzM95Eh5wGiXq6TXwFPhB5yeV8l3tFQxeu\nPycZeKmp0VBge+U+/UhR1rQwEX9U9LeKhVdjbNU0U8kNpO8qX/QqHSS7MCRILL2a\nS4F5U/wvYGkbqJ+qMUNmEMGwEkiVuDaO/Q4I3lMPNtLO+mizgq9jggEkVh+xG50p\nFATWd6CJh0mddBBgGG3/aG1ybV/IYRRP0sS+dbYKmKghbK2d/LztIM8ba7lA16H9\nxLY8oy8SvwGqkq2Gea9K2AIEjociac4i0Q/Ka2U881rJCrDUMg3gDhIundaa971M\nglS5cRe9AgMBAAECggEBALe9P6FHIlqYHZjI8QqtToL+E6bYk/rFP/3FYZYQ0IJW\n0NDkKunlGfJnnYUaaQdXFiKXntJ6phFusD7hLu/C/0Kt6Snq6uNhaAj5n/MfRPrY\no3faTuEpyubhigVdl/eFSASD4XGOcRGL6afY6+If5G8oH4QleBS246s/VTnGLhh6\n7cWv2PvFQOU6WzayYzs+8wIYPlVlhKIfuU7vbQF7sWIFfJg8zqVFe2lNXwGS3D2f\ns8AjjN9lMemWF/t9OIA4l9b/Mr2D1wc71AznTUXgBWqm747tWAYyEQ+r1PimbPMB\nEUi6qllpB0qhoEmSVQxONcR3GIep0IwDj8PHQtP55qECgYEA7cnP0yNcc1if7Dd/\nBh0xWGafMVkHIPbbBVOgR3FakaTuC5g0OQ7LP5O8OCW1pchyJY0HXLCEiRVSj5O7\n3MY59eIbdqpcBI7a+ZxOyBHEN2IqZ4EVZmkCxd7w7XA12D+mT19rc//F03FT78e5\neYniSWmj0ku1bSJ7oYb1g4mPf6kCgYEA4n8MKlYIf0JALvMgws78M75JMVpSVgDs\nOngZvMF7z7x4gkBxXxxc5ABe6k/RXCuz59n2IQU3NzS0Y3HxCvZyeJzh1X5ENSdD\nsyJVFkb4oC8nhKvztXT8CwH1vSIGMRUJNE3Gn8IrX8QdEWdvADz/+Iw81HtOh7lr\nAGyreWyLc/UCgYBBFaXuspURdUaAj0gTUlY5Tg1wol+TJD4anSMXqu0RREVrowNY\nQrZa9oLkE14+vDiSEqHbOu1r4AwzBEq9SPyAUp0Vw9df4AILpD7kAAjm59WXcvt6\nhm+d3UGwm7ABOpq4yvNMUsvA7hn9XXtkytrHIUUXwGUuM+wG8Duu/y3p0QKBgQC3\nsZKMQ3pgu7qSWV0YogapcIqsHDTqy5TLVtyI2eMweArEmL9aBAbSY/qWzmVd+5PN\nVljoLvK5M2WZwa9c1MPCTnpaTC3FbjLZ9d5MUwMR5yyFzW+6m0ZPJyfGXPHonMb6\nRJnyt+e1o7hvhRPhfZecXSB4tAjcyuSdU4U+1WnEgQKBgAUZFTYeIyC/bnIca5m8\nzh2wIW0KusCLPa9e3VGTARJG5WP6nx8BPVx71Er/wquBLLquoH0XlTmpdj80QF+s\nHlnKE9CfXVu23ci2S0WalbX/8CYGlO5iCct9o0KR0inrXKfqFzuSKkpg6JyXVMk0\nMT1+EUSD25ATIRsNGFWigNHL\n-----END PRIVATE KEY-----"
  15. MchtStoreNm = "世寶商城"
  16. PUBLICKEY = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0mIr40e511Gs8n/hdYv5\n77sv3aIh0bIk0sGrxyMChfPJMzPeRIecBol6uk18BT4QecnlfJd7RUMXrj8nGXip\nqdFQYHvlPv1IUda0MBF/VPS3ioVXY2zVNFPJDaTvKl/0Kh0kuzAkSCy9mkuBeVP8\nL2BpG6ifqjFDZhDBsBJIlbg2jv0OCN5TDzbSzvpos4KvY4IBJFYfsRudKRQE1neg\niYdJnXQQYBht/2htcm1fyGEUT9LEvnW2CpioIWytnfy87SDPG2u5QNeh/cS2PKMv\nEr8BqpKthnmvStgCBI6HImnOItEPymtlPPNayQqw1DIN4A4SLp3Wmve9TIJUuXEX\nvQIDAQAB\n-----END PUBLIC KEY-----"
  17. )
  18. type PayParam struct {
  19. Data string `json:"data"`
  20. Sign string `json:"sign"`
  21. }
  22. type DataParam struct {
  23. Head struct {
  24. MchtNo string `json:"mchtNo" explain:"商户编号"`
  25. ReqTime string `json:"reqTime" explain:"请求时间戳(yyyyMMddHHmmss)"`
  26. MsgId string `json:"msgId" explain:"请求消息唯一编号"`
  27. Attach string `json:"attach" explain:"附加数据(附加数据,用于在同步应答或异步通知时原样返回)"`
  28. CertId string `json:"certId" explain:"数字证书 ID(默认 01)"`
  29. Version string `json:"version" explain:"版本号(默认 1.0.0)"`
  30. } `json:"head"`
  31. ReqBody map[string]string `json:"reqBody"`
  32. }
  33. type signParam struct {
  34. PayParam *PayParam
  35. }
  36. func (payParam *PayParam) SetData(dataParam DataParam) *signParam {
  37. now := time.Now()
  38. rand.Seed(now.UnixNano())
  39. randomInt := rand.Intn(100)
  40. dataParam.Head.MsgId = zhios_pay_utils.AnyToString(randomInt) + dataParam.Head.MchtNo + now.Format("20060102150405")
  41. dataParam.Head.ReqTime = now.Format("20060102150405")
  42. dataParam.Head.CertId = "01"
  43. dataParam.Head.Version = "1.0.0"
  44. if dataParam.ReqBody["mchtOrderId"] != "" {
  45. dataParam.Head.MsgId = dataParam.ReqBody["mchtOrderId"] + now.Format("20060102150405")
  46. }
  47. payParam.Data = zhios_pay_utils.SerializeStr(dataParam)
  48. var signs signParam
  49. signs.PayParam = payParam
  50. return &signs
  51. }
  52. func (s *signParam) SetSign(privateKeyStr string) error {
  53. dataParamBase64Str := base64.StdEncoding.EncodeToString([]byte(s.PayParam.Data))
  54. signStr, err := zhios_pay_utils.GetSignV2(privateKeyStr, dataParamBase64Str, crypto.SHA1)
  55. if err != nil {
  56. return err
  57. }
  58. s.PayParam.Sign = signStr
  59. s.PayParam.Data = dataParamBase64Str
  60. return nil
  61. }
  62. func (payParam *PayParam) Send(prd, isNeedEncode bool, method string) (string, error) {
  63. url := "https://qrpaytest.lusobank.com.mo:443"
  64. if prd {
  65. url = "https://qrpaytest.lusobank.com.mo:8443"
  66. }
  67. switch method {
  68. case "create":
  69. url = url + "/upcp-iap-pps-lqrp/libQrPay/json/create"
  70. case "pay":
  71. url = url + "/upcp-iap-pps-lqrp/libQrPay/json/pay"
  72. }
  73. headers := map[string]string{
  74. "Content-Type": "application/json",
  75. }
  76. zhios_pay_utils.CurlDebug = true
  77. body := zhios_pay_utils.SerializeStr(payParam)
  78. if isNeedEncode {
  79. body = php2go.URLEncode(body)
  80. }
  81. res, err := zhios_pay_utils.CurlPost(url, body, headers)
  82. if err != nil {
  83. return "", err
  84. }
  85. fmt.Println(string(res))
  86. return string(res), nil
  87. }