client_test.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. package wechat
  2. import (
  3. "fmt"
  4. "os"
  5. "strconv"
  6. "testing"
  7. "time"
  8. "github.com/iGoogle-ink/gopay/v2"
  9. )
  10. var (
  11. client *Client
  12. appId = "wxdaa2ab9ef87b5497"
  13. mchId = "1368139502"
  14. apiKey = "GFDS8j98rewnmgl45wHTt980jg543abc"
  15. )
  16. func TestMain(m *testing.M) {
  17. // 初始化微信客户端
  18. // appId:应用ID
  19. // mchId:商户ID
  20. // apiKey:API秘钥值
  21. // isProd:是否是正式环境
  22. client = NewClient(appId, mchId, apiKey, false)
  23. // 设置国家,不设置默认就是 China
  24. client.SetCountry(China)
  25. //err := client.AddCertFilePath("", "", "")
  26. //if err != nil {
  27. // panic(err)
  28. //}
  29. os.Exit(m.Run())
  30. }
  31. func TestClient_UnifiedOrder(t *testing.T) {
  32. number := gopay.GetRandomString(32)
  33. fmt.Println("out_trade_no:", number)
  34. // 初始化参数Map
  35. bm := make(gopay.BodyMap)
  36. bm.Set("nonce_str", gopay.GetRandomString(32))
  37. bm.Set("body", "H5支付")
  38. bm.Set("out_trade_no", number)
  39. bm.Set("total_fee", 1)
  40. bm.Set("spbill_create_ip", "127.0.0.1")
  41. bm.Set("notify_url", "http://www.gopay.ink")
  42. bm.Set("trade_type", TradeType_H5)
  43. bm.Set("device_info", "WEB")
  44. bm.Set("sign_type", SignType_MD5)
  45. sceneInfo := make(map[string]map[string]string)
  46. h5Info := make(map[string]string)
  47. h5Info["type"] = "Wap"
  48. h5Info["wap_url"] = "http://www.gopay.ink"
  49. h5Info["wap_name"] = "H5测试支付"
  50. sceneInfo["h5_info"] = h5Info
  51. bm.Set("scene_info", sceneInfo)
  52. //bm.Set("openid", "o0Df70H2Q0fY8JXh1aFPIRyOBgu8")
  53. // 正式
  54. //sign := gopay.GetWeChatParamSign("wxdaa2ab9ef87b5497", "1368139502", "GFDS8j98rewnmgl45wHTt980jg543abc", body)
  55. // 沙箱
  56. //sign, _ := gopay.GetWeChatSanBoxParamSign("wxdaa2ab9ef87b5497", "1368139502", "GFDS8j98rewnmgl45wHTt980jg543abc", body)
  57. //body.Set("sign", sign)
  58. // 请求支付下单,成功后得到结果
  59. wxRsp, err := client.UnifiedOrder(bm)
  60. if err != nil {
  61. fmt.Println("Error:", err)
  62. return
  63. }
  64. fmt.Println("wxRsp:", *wxRsp)
  65. //fmt.Println("wxRsp.MwebUrl:", wxRsp.MwebUrl)
  66. timeStamp := strconv.FormatInt(time.Now().Unix(), 10)
  67. // 获取小程序支付需要的paySign
  68. //pac := "prepay_id=" + wxRsp.PrepayId
  69. //paySign := GetMiniPaySign(appId, wxRsp.NonceStr, pac, SignType_MD5, timeStamp, apiKey)
  70. //fmt.Println("paySign:", paySign)
  71. // 获取H5支付需要的paySign
  72. pac := "prepay_id=" + wxRsp.PrepayId
  73. paySign := GetH5PaySign(appId, wxRsp.NonceStr, pac, SignType_MD5, timeStamp, apiKey)
  74. fmt.Println("paySign:", paySign)
  75. // 获取小程序需要的paySign
  76. //paySign := GetAppPaySign(appId,"partnerid", wxRsp.NonceStr, wxRsp.PrepayId, SignType_MD5, timeStamp, apiKey)
  77. //fmt.Println("paySign:", paySign)
  78. }
  79. func TestClient_QueryOrder(t *testing.T) {
  80. // 初始化参数结构体
  81. bm := make(gopay.BodyMap)
  82. bm.Set("out_trade_no", "MfZC2segKxh0bnJSELbvKNeH3d9oWvvQ")
  83. bm.Set("nonce_str", gopay.GetRandomString(32))
  84. bm.Set("sign_type", SignType_MD5)
  85. // 请求订单查询,成功后得到结果
  86. wxRsp, err := client.QueryOrder(bm)
  87. if err != nil {
  88. fmt.Println("Error:", err)
  89. return
  90. }
  91. fmt.Println("wxRsp:", *wxRsp)
  92. }
  93. func TestClient_CloseOrder(t *testing.T) {
  94. // 初始化参数结构体
  95. bm := make(gopay.BodyMap)
  96. bm.Set("out_trade_no", "MfZC2segKxh0bnJSELbvKNeH3d9oWvvQ")
  97. bm.Set("nonce_str", gopay.GetRandomString(32))
  98. bm.Set("sign_type", SignType_MD5)
  99. // 请求关闭订单,成功后得到结果
  100. wxRsp, err := client.CloseOrder(bm)
  101. if err != nil {
  102. fmt.Println("Error:", err)
  103. return
  104. }
  105. fmt.Println("wxRsp:", *wxRsp)
  106. }
  107. func TestClient_Micropay(t *testing.T) {
  108. number := gopay.GetRandomString(32)
  109. fmt.Println("out_trade_no:", number)
  110. // 初始化参数Map
  111. bm := make(gopay.BodyMap)
  112. bm.Set("nonce_str", gopay.GetRandomString(32))
  113. bm.Set("body", "扫用户付款码支付")
  114. bm.Set("out_trade_no", number)
  115. bm.Set("total_fee", 1)
  116. bm.Set("spbill_create_ip", "127.0.0.1")
  117. bm.Set("auth_code", "134622817080551492")
  118. bm.Set("sign_type", SignType_MD5)
  119. // 请求支付,成功后得到结果
  120. wxRsp, err := client.Micropay(bm)
  121. if err != nil {
  122. fmt.Println("Error:", err)
  123. return
  124. }
  125. fmt.Println("Response:", *wxRsp)
  126. ok, err := VerifySign(apiKey, SignType_MD5, wxRsp)
  127. if err != nil {
  128. fmt.Println("err:", err)
  129. }
  130. fmt.Println("同步验签结果:", ok)
  131. }
  132. func TestClient_Refund(t *testing.T) {
  133. // 初始化参数结构体
  134. bm := make(gopay.BodyMap)
  135. bm.Set("out_trade_no", "QRcTBTbJLoDrWSW9FtpSFlgWhft2QbaY")
  136. bm.Set("nonce_str", gopay.GetRandomString(32))
  137. bm.Set("sign_type", SignType_MD5)
  138. s := gopay.GetRandomString(64)
  139. fmt.Println("out_refund_no:", s)
  140. bm.Set("out_refund_no", s)
  141. bm.Set("total_fee", 101)
  142. bm.Set("refund_fee", 101)
  143. bm.Set("notify_url", "https://www.gopay.ink")
  144. // 请求申请退款(沙箱环境下,证书路径参数可传空)
  145. // body:参数Body
  146. // certFilePath:cert证书路径
  147. // keyFilePath:Key证书路径
  148. // pkcs12FilePath:p12证书路径
  149. wxRsp, err := client.Refund(bm, "", "", "")
  150. if err != nil {
  151. fmt.Println("Error:", err)
  152. return
  153. }
  154. fmt.Println("wxRsp:", *wxRsp)
  155. }
  156. func TestClient_QueryRefund(t *testing.T) {
  157. // 初始化参数结构体
  158. bm := make(gopay.BodyMap)
  159. bm.Set("out_trade_no", "97HiM5j6kGmM2fk7fYMc8MgKhPnEQ5Rk")
  160. //bm.Set("out_refund_no", "vk4264I1UQ3Hm3E4AKsavK8npylGSgQA092f9ckUxp8A2gXmnsLEdsupURVTcaC7")
  161. //bm.Set("transaction_id", "97HiM5j6kGmM2fk7fYMc8MgKhPnEQ5Rk")
  162. //bm.Set("refund_id", "97HiM5j6kGmM2fk7fYMc8MgKhPnEQ5Rk")
  163. bm.Set("nonce_str", gopay.GetRandomString(32))
  164. bm.Set("sign_type", SignType_MD5)
  165. // 请求申请退款
  166. wxRsp, err := client.QueryRefund(bm)
  167. if err != nil {
  168. fmt.Println("Error:", err)
  169. return
  170. }
  171. fmt.Println("wxRsp:", *wxRsp)
  172. }
  173. func TestClient_Reverse(t *testing.T) {
  174. // 初始化参数Map
  175. bm := make(gopay.BodyMap)
  176. bm.Set("nonce_str", gopay.GetRandomString(32))
  177. bm.Set("out_trade_no", "6aDCor1nUcAihrV5JBlI09tLvXbUp02B")
  178. bm.Set("sign_type", SignType_MD5)
  179. // 请求撤销订单,成功后得到结果,沙箱环境下,证书路径参数可传空
  180. wxRsp, err := client.Reverse(bm, "", "", "")
  181. if err != nil {
  182. fmt.Println("Error:", err)
  183. return
  184. }
  185. fmt.Println("Response:", wxRsp)
  186. }
  187. func TestClient_Transfer(t *testing.T) {
  188. // 初始化参数结构体
  189. bm := make(gopay.BodyMap)
  190. bm.Set("nonce_str", gopay.GetRandomString(32))
  191. bm.Set("partner_trade_no", gopay.GetRandomString(32))
  192. bm.Set("openid", "o0Df70H2Q0fY8JXh1aFPIRyOBgu8")
  193. bm.Set("check_name", "FORCE_CHECK") // NO_CHECK:不校验真实姓名 , FORCE_CHECK:强校验真实姓名
  194. bm.Set("re_user_name", "付明明") // 收款用户真实姓名。 如果check_name设置为FORCE_CHECK,则必填用户真实姓名
  195. bm.Set("amount", 30) // 企业付款金额,单位为分
  196. bm.Set("desc", "测试转账") // 企业付款备注,必填。注意:备注中的敏感词会被转成字符*
  197. bm.Set("spbill_create_ip", "127.0.0.1")
  198. // 企业向微信用户个人付款(不支持沙箱环境)
  199. // body:参数Body
  200. // certFilePath:cert证书路径
  201. // keyFilePath:Key证书路径
  202. // pkcs12FilePath:p12证书路径
  203. wxRsp, err := client.Transfer(bm, "", "", "")
  204. if err != nil {
  205. fmt.Println("Error:", err)
  206. return
  207. }
  208. fmt.Println("wxRsp:", *wxRsp)
  209. }
  210. func TestClient_DownloadBill(t *testing.T) {
  211. // 初始化参数结构体
  212. bm := make(gopay.BodyMap)
  213. bm.Set("nonce_str", gopay.GetRandomString(32))
  214. bm.Set("sign_type", SignType_MD5)
  215. bm.Set("bill_date", "20190722")
  216. bm.Set("bill_type", "ALL")
  217. // 请求下载对账单,成功后得到结果(string类型字符串)
  218. wxRsp, err := client.DownloadBill(bm)
  219. if err != nil {
  220. fmt.Println("Error:", err)
  221. return
  222. }
  223. fmt.Println("wxRsp:", wxRsp)
  224. }
  225. func TestClient_DownloadFundFlow(t *testing.T) {
  226. // 初始化参数结构体
  227. bm := make(gopay.BodyMap)
  228. bm.Set("nonce_str", gopay.GetRandomString(32))
  229. bm.Set("sign_type", SignType_HMAC_SHA256)
  230. bm.Set("bill_date", "20190122")
  231. bm.Set("account_type", "Basic")
  232. // 请求下载资金账单,成功后得到结果,沙箱环境下,证书路径参数可传空
  233. wxRsp, err := client.DownloadFundFlow(bm, "", "", "")
  234. if err != nil {
  235. fmt.Println("Error:", err)
  236. return
  237. }
  238. fmt.Println("wxRsp:", wxRsp)
  239. }
  240. func TestClient_BatchQueryComment(t *testing.T) {
  241. // 初始化参数结构体
  242. bm := make(gopay.BodyMap)
  243. bm.Set("nonce_str", gopay.GetRandomString(32))
  244. bm.Set("sign_type", SignType_HMAC_SHA256)
  245. bm.Set("begin_time", "20190120000000")
  246. bm.Set("end_time", "20190122174000")
  247. bm.Set("offset", "0")
  248. // 请求拉取订单评价数据,成功后得到结果,沙箱环境下,证书路径参数可传空
  249. wxRsp, err := client.BatchQueryComment(bm, "", "", "")
  250. if err != nil {
  251. fmt.Println("Error:", err)
  252. return
  253. }
  254. fmt.Println("wxRsp:", wxRsp)
  255. }
  256. // =======================
  257. func TestDecryptOpenDataToStruct(t *testing.T) {
  258. data := "Kf3TdPbzEmhWMuPKtlKxIWDkijhn402w1bxoHL4kLdcKr6jT1jNcIhvDJfjXmJcgDWLjmBiIGJ5acUuSvxLws3WgAkERmtTuiCG10CKLsJiR+AXVk7B2TUQzsq88YVilDz/YAN3647REE7glGmeBPfvUmdbfDzhL9BzvEiuRhABuCYyTMz4iaM8hFjbLB1caaeoOlykYAFMWC5pZi9P8uw=="
  259. iv := "Cds8j3VYoGvnTp1BrjXdJg=="
  260. session := "lyY4HPQbaOYzZdG+JcYK9w=="
  261. phone := new(UserPhone)
  262. //解密开放数据
  263. // encryptedData:包括敏感数据在内的完整用户信息的加密数据
  264. // iv:加密算法的初始向量
  265. // sessionKey:会话密钥
  266. // beanPtr:需要解析到的结构体指针
  267. err := DecryptOpenDataToStruct(data, iv, session, phone)
  268. if err != nil {
  269. fmt.Println("err:", err)
  270. return
  271. }
  272. fmt.Println("PhoneNumber:", phone.PhoneNumber)
  273. fmt.Println("PurePhoneNumber:", phone.PurePhoneNumber)
  274. fmt.Println("CountryCode:", phone.CountryCode)
  275. fmt.Println("Watermark:", phone.Watermark)
  276. sessionKey := "tiihtNczf5v6AKRyjwEUhQ=="
  277. encryptedData := "CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZMQmRzooG2xrDcvSnxIMXFufNstNGTyaGS9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+3hVbJSRgv+4lGOETKUQz6OYStslQ142dNCuabNPGBzlooOmB231qMM85d2/fV6ChevvXvQP8Hkue1poOFtnEtpyxVLW1zAo6/1Xx1COxFvrc2d7UL/lmHInNlxuacJXwu0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn/Hz7saL8xz+W//FRAUid1OksQaQx4CMs8LOddcQhULW4ucetDf96JcR3g0gfRK4PC7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns/8wR2SiRS7MNACwTyrGvt9ts8p12PKFdlqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYVoKlaRv85IfVunYzO0IKXsyl7JCUjCpoG20f0a04COwfneQAGGwd5oa+T8yO5hzuyDb/XcxxmK01EpqOyuxINew=="
  278. iv2 := "r7BXXKkLb8qrSNn05n0qiA=="
  279. //微信小程序 用户信息
  280. userInfo := new(AppletUserInfo)
  281. err = DecryptOpenDataToStruct(encryptedData, iv2, sessionKey, userInfo)
  282. if err != nil {
  283. fmt.Println("err:", err)
  284. return
  285. }
  286. fmt.Println("NickName:", userInfo.NickName)
  287. fmt.Println("AvatarUrl:", userInfo.AvatarUrl)
  288. fmt.Println("Country:", userInfo.Country)
  289. fmt.Println("Province:", userInfo.Province)
  290. fmt.Println("City:", userInfo.City)
  291. fmt.Println("Gender:", userInfo.Gender)
  292. fmt.Println("OpenId:", userInfo.OpenId)
  293. fmt.Println("UnionId:", userInfo.UnionId)
  294. fmt.Println("Watermark:", userInfo.Watermark)
  295. }
  296. func TestDecryptOpenDataToBodyMap(t *testing.T) {
  297. data := "Kf3TdPbzEmhWMuPKtlKxIWDkijhn402w1bxoHL4kLdcKr6jT1jNcIhvDJfjXmJcgDWLjmBiIGJ5acUuSvxLws3WgAkERmtTuiCG10CKLsJiR+AXVk7B2TUQzsq88YVilDz/YAN3647REE7glGmeBPfvUmdbfDzhL9BzvEiuRhABuCYyTMz4iaM8hFjbLB1caaeoOlykYAFMWC5pZi9P8uw=="
  298. iv := "Cds8j3VYoGvnTp1BrjXdJg=="
  299. session := "lyY4HPQbaOYzZdG+JcYK9w=="
  300. //解密开放数据
  301. // encryptedData:包括敏感数据在内的完整用户信息的加密数据
  302. // iv:加密算法的初始向量
  303. // sessionKey:会话密钥
  304. bm, err := DecryptOpenDataToBodyMap(data, iv, session)
  305. if err != nil {
  306. fmt.Println("err:", err)
  307. return
  308. }
  309. fmt.Println("WeChatUserPhone:", bm)
  310. }
  311. func TestDecryptRefundNotifyReqInfo(t *testing.T) {
  312. key := "ziR0QKsTUfMOuochC9RfCdmfHECorQAP"
  313. data := "YYwp8C48th0wnQzTqeI+41pflB26v+smFj9z6h9RPBgxTyZyxc+4YNEz7QEgZNWj/6rIb2MfyWMZmCc41CfjKSssoSZPXxOhUayb6KvNSZ1p6frOX1PDWzhyruXK7ouNND+gDsG4yZ0XXzsL4/pYNwLLba/71QrnkJ/BHcByk4EXnglju5DLup9pJQSnTxjomI9Rxu57m9jg5lLQFxMWXyeASZJNvof0ulnHlWJswS4OxKOkmW7VEyKyLGV6npoOm03Qsx2wkRxLsSa9gPpg4hdaReeUqh1FMbm7aWjyrVYT/MEZWg98p4GomEIYvz34XfDncTezX4bf/ZiSLXt79aE1/YTZrYfymXeCrGjlbe0rg/T2ezJHAC870u2vsVbY1/KcE2A443N+DEnAziXlBQ1AeWq3Rqk/O6/TMM0lomzgctAOiAMg+bh5+Gu1ubA9O3E+vehULydD5qx2o6i3+qA9ORbH415NyRrQdeFq5vmCiRikp5xYptWiGZA0tkoaLKMPQ4ndE5gWHqiBbGPfULZWokI+QjjhhBmwgbd6J0VqpRorwOuzC/BHdkP72DCdNcm7IDUpggnzBIy0+seWIkcHEryKjge3YDHpJeQCqrAH0CgxXHDt1xtbQbST1VqFyuhPhUjDXMXrknrGPN/oE1t0rLRq+78cI+k8xe5E6seeUXQsEe8r3358mpcDYSmXWSXVZxK6er9EF98APqHwcndyEJD2YyCh/mMVhERuX+7kjlRXSiNUWa/Cv/XAKFQuvUYA5ea2eYWtPRHa4DpyuF1SNsaqVKfgqKXZrJHfAgslVpSVqUpX4zkKszHF4kwMZO3M7J1P94Mxa7Tm9mTOJePOoHPXeEB+m9rX6pSfoi3mJDQ5inJ+Vc4gOkg/Wd/lqiy6TTyP/dHDN6/v+AuJx5AXBo/2NDD3fWhHjkqEKIuARr2ClZt9ZRQO4HkXdZo7CN06sGCHk48Tg8PmxnxKcMZm7Aoquv5yMIM2gWSWIRJhwJ8cUpafIHc+GesDlbF6Zbt+/KXkafJAQq2RklEN+WvZ/zFz113EPgWPjp16TwBoziq96MMekvWKY/vdhjol8VFtGH9F61Oy1Xwf6DJtPw=="
  314. refundNotify, err := DecryptRefundNotifyReqInfo(data, key)
  315. if err != nil {
  316. fmt.Println("err:", err)
  317. return
  318. }
  319. fmt.Println("refundNotify:", *refundNotify)
  320. }
  321. func TestGetAppletAccessToken(t *testing.T) {
  322. token, err := GetAppletAccessToken("wxdaa2ab9ef87b5497", "AppSecret")
  323. if err != nil {
  324. fmt.Println(err)
  325. return
  326. }
  327. fmt.Println("token:", token)
  328. }