v3.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. package unionpay
  2. import (
  3. "fmt"
  4. "net/url"
  5. "strconv"
  6. "git.chuangxin1.com/cx/util"
  7. )
  8. func getCustomerV3(ci CustomerInfo) (s string) {
  9. s = "{" + ci.CertifTp + "|"
  10. s += ci.CertifID + "|"
  11. s += ci.CustomerName + "|"
  12. s += ci.Phone + "|"
  13. s += "|" // SMS message
  14. s += "|" // password
  15. s += ci.Cvn2 + "|" // cvn2
  16. s += ci.Expired
  17. s += "}"
  18. return
  19. }
  20. // V3SendSms 发送验证码(Version 3.0)
  21. func V3SendSms(mi *MerchantInfo, ci CustomerInfo, oi OrderInfo) (res ReqRespose, err error) {
  22. args := make(map[string]string)
  23. args["version"] = "3.0.0"
  24. args["encoding"] = "utf-8"
  25. args["txnType"] = "77"
  26. args["txnSubType"] = "00"
  27. args["bizType"] = "000000"
  28. args["accessType"] = "0"
  29. args["merType"] = "0"
  30. args["merId"] = mi.MerID
  31. args["merName"] = "" // 商户名称
  32. args["merAbbr"] = "珠海城建公共资源" // 商户简称
  33. args["smsType"] = "" // 短信类型
  34. args["subMerId"] = "" // 二级商户代码
  35. args["subMerName"] = "" // 二级商户名称
  36. args["subMerAbbr"] = "" // 二级商户简称
  37. args["accType"] = "01"
  38. args["accNo"] = ci.CardNo // 账号, 不加密
  39. args["orderId"] = oi.OrderID
  40. args["txnTime"] = oi.TxnTime
  41. args["txnAmt"] = strconv.Itoa(oi.TxnAmt)
  42. args["currencyCode"] = "156"
  43. args["customerInfo"] = ci.Phone //base64Encode([]byte(getCustomerV3(ci)))
  44. args["bindId"] = ""
  45. args["reqReserved"] = ""
  46. args["reserved"] = ""
  47. //args["encryptCertId"] = mi.SerialNumber()
  48. args["certId"] = mi.SerialNumber()
  49. s := createLinkString(args, true, false)
  50. sha1 := util.SHA1(s)
  51. var data []byte
  52. data, err = signsha1(mi.PrivateKey, []byte(sha1))
  53. if err != nil {
  54. return
  55. }
  56. args["signature"] = base64Encode(data)
  57. values := url.Values{}
  58. for k, v := range args {
  59. values.Add(k, v)
  60. }
  61. res, err = post(V3BaseHost+V3ReqBackTrans, []byte(values.Encode()))
  62. return
  63. }
  64. // V3Bind 验证绑定卡片(Version 3.0)
  65. func V3Bind(mi *MerchantInfo, ci CustomerInfo, oi OrderInfo) (res ReqRespose, err error) {
  66. args := make(map[string]string)
  67. args["version"] = "3.0.0"
  68. args["encoding"] = "utf-8"
  69. args["txnType"] = "72"
  70. args["txnSubType"] = "01"
  71. args["bizType"] = "000000"
  72. args["accessType"] = "0"
  73. args["merType"] = "0"
  74. args["merId"] = mi.MerID
  75. args["subMerId"] = ""
  76. args["subMerName"] = ""
  77. args["orderId"] = oi.OrderID
  78. args["txnTime"] = oi.TxnTime
  79. args["accType"] = "01"
  80. args["accNo"] = ci.CardNo // 账号, 不加密
  81. args["customerInfo"] = base64Encode([]byte(getCustomerV3(ci)))
  82. args["bindId"] = ci.CardNo
  83. args["riskLevel"] = ""
  84. args["bindInfo"] = ""
  85. args["reqReserved"] = ""
  86. args["reserved"] = ""
  87. args["encryptCertId"] = mi.SerialNumber()
  88. args["userMac"] = ""
  89. args["certId"] = mi.SerialNumber()
  90. s := createLinkString(args, true, true)
  91. sha1 := util.SHA1(s)
  92. var data []byte
  93. data, err = signsha1(mi.PrivateKey, []byte(sha1))
  94. if err != nil {
  95. return
  96. }
  97. args["signature"] = base64Encode(data)
  98. values := url.Values{}
  99. for k, v := range args {
  100. values.Add(k, v)
  101. }
  102. res, err = post(V3BaseHost+V3ReqBackTrans, []byte(values.Encode()))
  103. return
  104. }
  105. // V3Remove 解除绑定卡片(Version 3.0)
  106. func V3Remove(mi *MerchantInfo, ci CustomerInfo, oi OrderInfo) (res ReqRespose, err error) {
  107. args := make(map[string]string)
  108. args["version"] = "3.0.0"
  109. args["encoding"] = "utf-8"
  110. args["txnType"] = "74"
  111. args["txnSubType"] = "00"
  112. args["bizType"] = "000000"
  113. args["accessType"] = "0"
  114. args["merType"] = "0"
  115. args["merId"] = mi.MerID
  116. args["subMerId"] = ""
  117. args["subMerName"] = ""
  118. args["orderId"] = oi.OrderID
  119. args["txnTime"] = oi.TxnTime
  120. //args["accType"] = "01"
  121. args["accNo"] = ci.CardNo // 账号, 不加密
  122. //args["customerInfo"] = base64Encode([]byte(getCustomerV3(ci)))
  123. args["bindId"] = ci.CardNo
  124. args["riskLevel"] = ""
  125. //args["bindInfo"] = ""
  126. args["reqReserved"] = ""
  127. args["reserved"] = ""
  128. //args["encryptCertId"] = mi.SerialNumber()
  129. //args["userMac"] = ""
  130. args["certId"] = mi.SerialNumber()
  131. s := createLinkString(args, true, false)
  132. sha1 := util.SHA1(s)
  133. //sha1 := util.SHA256(s)
  134. var data []byte
  135. data, err = signsha1(mi.PrivateKey, []byte(sha1))
  136. //data, err = sign(mi.PrivateKey, []byte(sha1))
  137. if err != nil {
  138. return
  139. }
  140. args["signature"] = base64Encode(data)
  141. values := url.Values{}
  142. for k, v := range args {
  143. values.Add(k, v)
  144. }
  145. res, err = post(V3BaseHost+V3ReqBackTrans, []byte(values.Encode()))
  146. return
  147. }
  148. // V3Charging 代扣(Version 3.0)
  149. func V3Charging(mi *MerchantInfo, ci CustomerInfo, oi OrderInfo) (res ReqRespose, err error) {
  150. args := make(map[string]string)
  151. args["version"] = "3.0.0"
  152. args["encoding"] = "utf-8"
  153. args["txnType"] = "11"
  154. args["txnSubType"] = "00"
  155. args["bizType"] = "000000"
  156. args["backUrl"] = ""
  157. args["accessType"] = "0"
  158. args["merType"] = "0"
  159. args["merId"] = mi.MerID
  160. args["subMerId"] = ""
  161. args["subMerName"] = ""
  162. args["orderId"] = oi.OrderID
  163. args["txnTime"] = oi.TxnTime
  164. args["currencyCode"] = "156" // 交易币种
  165. args["accType"] = "01"
  166. args["accNo"] = ci.CardNo // 账号, 不加密
  167. args["issInsCode"] = "" // 发卡机构代码
  168. args["customerInfo"] = base64Encode([]byte(getCustomerV3(ci)))
  169. args["bindId"] = ""
  170. args["riskLevel"] = ""
  171. args["txnAmt"] = strconv.Itoa(oi.TxnAmt)
  172. args["billType"] = "OT00" // 账单类型
  173. args["billNo"] = "" // 账单号码
  174. args["reqReserved"] = ""
  175. args["reserved"] = ""
  176. args["customerIp"] = ""
  177. args["encryptCertId"] = mi.SerialNumber()
  178. args["billPeriod"] = "" // 账单周期
  179. args["certId"] = mi.SerialNumber()
  180. s := createLinkString(args, true, true)
  181. sha1 := util.SHA1(s)
  182. fmt.Println("createLinkString", s)
  183. fmt.Println("--", getCustomerV3(ci))
  184. fmt.Println("--", base64Encode([]byte(getCustomerV3(ci))))
  185. fmt.Println("--", s)
  186. var data []byte
  187. data, err = signsha1(mi.PrivateKey, []byte(sha1))
  188. if err != nil {
  189. return
  190. }
  191. args["signature"] = base64Encode(data)
  192. values := url.Values{}
  193. for k, v := range args {
  194. values.Add(k, v)
  195. }
  196. fmt.Println("-- body --", values.Encode())
  197. res, err = post(V3BaseHost+V3ReqBackTrans, []byte(values.Encode()))
  198. return
  199. }