wechat_client_test.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. package gopay
  2. import (
  3. "crypto/md5"
  4. "encoding/hex"
  5. "fmt"
  6. "log"
  7. "strconv"
  8. "strings"
  9. "testing"
  10. "time"
  11. )
  12. func TestWeChatClient_UnifiedOrder(t *testing.T) {
  13. //初始化微信客户端
  14. // appId:应用ID
  15. // MchID:商户ID
  16. // apiKey:API秘钥值
  17. // isProd:是否是正式环境
  18. client := NewWeChatClient(AppID, MchID_iguiyu, ApiKey_iguiyu, false)
  19. //初始化参数Map
  20. body := make(BodyMap)
  21. body.Set("nonce_str", GetRandomString(32))
  22. body.Set("body", "测试支付")
  23. number := GetRandomString(32)
  24. log.Println("Number:", number)
  25. body.Set("out_trade_no", number)
  26. body.Set("total_fee", 10)
  27. body.Set("spbill_create_ip", "124.77.173.62")
  28. body.Set("notify_url", "http://www.gopay.ink")
  29. body.Set("trade_type", TradeType_JsApi)
  30. body.Set("device_info", "WEB")
  31. body.Set("sign_type", SignType_MD5)
  32. //body.Set("scene_info", `{"h5_info": {"type":"Wap","wap_url": "http://www.gopay.ink","wap_name": "测试支付"}}`)
  33. body.Set("openid", OpenID)
  34. //请求支付下单,成功后得到结果
  35. wxRsp, err := client.UnifiedOrder(body)
  36. if err != nil {
  37. fmt.Println("Error:", err)
  38. }
  39. fmt.Println("wxRsp:", *wxRsp)
  40. timeStamp := strconv.FormatInt(time.Now().Unix(), 10)
  41. //获取小程序需要的paySign
  42. pac := "prepay_id=" + wxRsp.PrepayId
  43. paySign := GetMiniPaySign(AppID, wxRsp.NonceStr, pac, SignType_MD5, timeStamp, ApiKey_iguiyu)
  44. fmt.Println("paySign:", paySign)
  45. fmt.Println("Response:", wxRsp)
  46. }
  47. func TestWeChatClient_QueryOrder(t *testing.T) {
  48. //初始化微信客户端
  49. // appId:应用ID
  50. // MchID:商户ID
  51. // apiKey:API秘钥值
  52. // isProd:是否是正式环境
  53. client := NewWeChatClient(AppID, MchID_iguiyu, ApiKey_iguiyu, false)
  54. //初始化参数结构体
  55. body := make(BodyMap)
  56. body.Set("out_trade_no", "GYWX201901301040355706100401")
  57. body.Set("nonce_str", GetRandomString(32))
  58. body.Set("sign_type", SignType_MD5)
  59. //请求订单查询,成功后得到结果
  60. wxRsp, err := client.QueryOrder(body)
  61. if err != nil {
  62. fmt.Println("Error:", err)
  63. }
  64. fmt.Println("Response:", wxRsp)
  65. }
  66. func TestWeChatClient_CloseOrder(t *testing.T) {
  67. //初始化微信客户端
  68. // appId:应用ID
  69. // MchID:商户ID
  70. // ApiKey:Key值
  71. // isProd:是否是正式环境
  72. client := NewWeChatClient(AppID, MchID_iguiyu, ApiKey_iguiyu, false)
  73. //初始化参数结构体
  74. body := make(BodyMap)
  75. body.Set("out_trade_no", "MfZC2segKxh0bnJSELbvKNeH3d9oWvvQ")
  76. body.Set("nonce_str", GetRandomString(32))
  77. body.Set("sign_type", SignType_MD5)
  78. //请求订单查询,成功后得到结果
  79. wxRsp, err := client.CloseOrder(body)
  80. if err != nil {
  81. fmt.Println("Error:", err)
  82. }
  83. fmt.Println("Response:", wxRsp)
  84. }
  85. func TestWeChatClient_Refund(t *testing.T) {
  86. //初始化微信客户端
  87. // appId:应用ID
  88. // MchID:商户ID
  89. // ApiKey:Key值
  90. // isProd:是否是正式环境
  91. client := NewWeChatClient(AppID, MchID_iguiyu, ApiKey_iguiyu, true)
  92. //初始化参数结构体
  93. body := make(BodyMap)
  94. body.Set("out_trade_no", "97HiM5j6kGmM2fk7fYMc8MgKhPnEQ5Rk")
  95. body.Set("nonce_str", GetRandomString(32))
  96. body.Set("sign_type", SignType_MD5)
  97. s := GetRandomString(64)
  98. fmt.Println("s:", s)
  99. body.Set("out_refund_no", s)
  100. body.Set("total_fee", 1)
  101. body.Set("refund_fee", 1)
  102. //请求申请退款(沙箱环境下,证书路径参数可传空)
  103. // body:参数Body
  104. // certFilePath:cert证书路径
  105. // keyFilePath:Key证书路径
  106. // pkcs12FilePath:p12证书路径
  107. wxRsp, err := client.Refund(body, Cert_iguiyu+"/apiclient_cert.pem", Cert_iguiyu+"/apiclient_key.pem", Cert_iguiyu+"/apiclient_cert.p12")
  108. if err != nil {
  109. fmt.Println("Error:", err)
  110. }
  111. fmt.Println("Response:", wxRsp)
  112. }
  113. func TestWeChatClient_QueryRefund(t *testing.T) {
  114. //初始化微信客户端
  115. // appId:应用ID
  116. // MchID:商户ID
  117. // ApiKey:Key值
  118. // isProd:是否是正式环境
  119. client := NewWeChatClient(AppID, MchID_iguiyu, ApiKey_iguiyu, false)
  120. //初始化参数结构体
  121. body := make(BodyMap)
  122. body.Set("out_refund_no", "vk4264I1UQ3Hm3E4AKsavK8npylGSgQA092f9ckUxp8A2gXmnsLEdsupURVTcaC7")
  123. body.Set("nonce_str", GetRandomString(32))
  124. body.Set("sign_type", SignType_MD5)
  125. //请求申请退款
  126. wxRsp, err := client.QueryRefund(body)
  127. if err != nil {
  128. fmt.Println("Error:", err)
  129. }
  130. fmt.Println("Response:", wxRsp)
  131. }
  132. func TestWeChatClient_DownloadBill(t *testing.T) {
  133. //初始化微信客户端
  134. // appId:应用ID
  135. // MchID:商户ID
  136. // ApiKey:Key值
  137. // isProd:是否是正式环境
  138. client := NewWeChatClient(AppID, MchID_iguiyu, ApiKey_iguiyu, false)
  139. //初始化参数结构体
  140. body := make(BodyMap)
  141. body.Set("nonce_str", GetRandomString(32))
  142. body.Set("sign_type", SignType_MD5)
  143. body.Set("bill_date", "20190122")
  144. body.Set("bill_type", "ALL")
  145. //请求订单查询,成功后得到结果
  146. wxRsp, err := client.DownloadBill(body)
  147. if err != nil {
  148. fmt.Println("Error:", err)
  149. }
  150. fmt.Println("Response:", wxRsp)
  151. }
  152. func TestWeChatClient_DownloadFundFlow(t *testing.T) {
  153. //初始化微信客户端
  154. // appId:应用ID
  155. // MchID:商户ID
  156. // ApiKey:Key值
  157. // isProd:是否是正式环境
  158. client := NewWeChatClient(AppID, MchID_iguiyu, ApiKey_iguiyu, false)
  159. //初始化参数结构体
  160. body := make(BodyMap)
  161. body.Set("nonce_str", GetRandomString(32))
  162. body.Set("sign_type", SignType_HMAC_SHA256)
  163. body.Set("bill_date", "20190122")
  164. body.Set("account_type", "Basic")
  165. //请求订单查询,成功后得到结果,沙箱环境下,证书路径参数可传空
  166. wxRsp, err := client.DownloadFundFlow(body, "", "", "")
  167. if err != nil {
  168. fmt.Println("Error:", err)
  169. }
  170. fmt.Println("Response:", wxRsp)
  171. }
  172. func TestWeChatClient_BatchQueryComment(t *testing.T) {
  173. //初始化微信客户端
  174. // appId:应用ID
  175. // MchID:商户ID
  176. // ApiKey:Key值
  177. // isProd:是否是正式环境
  178. client := NewWeChatClient(AppID, MchID_iguiyu, ApiKey_iguiyu, false)
  179. //初始化参数结构体
  180. body := make(BodyMap)
  181. body.Set("nonce_str", GetRandomString(32))
  182. body.Set("sign_type", SignType_HMAC_SHA256)
  183. body.Set("begin_time", "20190120000000")
  184. body.Set("end_time", "20190122174000")
  185. body.Set("offset", "0")
  186. //请求订单查询,成功后得到结果,沙箱环境下,证书路径参数可传空
  187. wxRsp, err := client.BatchQueryComment(body, "", "", "")
  188. if err != nil {
  189. fmt.Println("Error:", err)
  190. }
  191. fmt.Println("Response:", wxRsp)
  192. }
  193. func TestWeChatClient_Micropay(t *testing.T) {
  194. //初始化微信客户端
  195. // appId:应用ID
  196. // MchID:商户ID
  197. // ApiKey:Key值
  198. // isProd:是否是正式环境
  199. client := NewWeChatClient(AppID, MchID_iguiyu, ApiKey_iguiyu, true)
  200. //初始化参数Map
  201. body := make(BodyMap)
  202. body.Set("nonce_str", GetRandomString(32))
  203. body.Set("body", "扫用户付款码支付")
  204. number := GetRandomString(32)
  205. log.Println("Number:", number)
  206. body.Set("out_trade_no", number)
  207. body.Set("total_fee", 1)
  208. body.Set("spbill_create_ip", "124.77.173.62")
  209. body.Set("auth_code", "134518243599425392")
  210. body.Set("sign_type", SignType_MD5)
  211. //请求支付,成功后得到结果
  212. wxRsp, err := client.Micropay(body)
  213. if err != nil {
  214. fmt.Println("Error:", err)
  215. }
  216. fmt.Println("Response:", wxRsp)
  217. }
  218. func TestWeChatClient_Reverse(t *testing.T) {
  219. //初始化微信客户端
  220. // appId:应用ID
  221. // MchID:商户ID
  222. // ApiKey:Key值
  223. // isProd:是否是正式环境
  224. client := NewWeChatClient(AppID, MchID_iguiyu, ApiKey_iguiyu, false)
  225. //初始化参数Map
  226. body := make(BodyMap)
  227. body.Set("nonce_str", GetRandomString(32))
  228. body.Set("out_trade_no", "6aDCor1nUcAihrV5JBlI09tLvXbUp02B")
  229. body.Set("sign_type", SignType_MD5)
  230. //请求撤销订单,成功后得到结果,沙箱环境下,证书路径参数可传空
  231. wxRsp, err := client.Reverse(body, "", "", "")
  232. if err != nil {
  233. fmt.Println("Error:", err)
  234. }
  235. fmt.Println("Response:", wxRsp)
  236. }
  237. func TestMd5(t *testing.T) {
  238. st := "appid=wxdaa2ab9ef87b5497&nonceStr=9k20rM66parD2U49&package=prepay_id=wx29164301554772fbc70d1d793335446010&signType=MD5&timeStamp=1548751382&key=GFDS8j98rewnmgl45wHTt980jg543wmg"
  239. hash := md5.New()
  240. hash.Write([]byte(st))
  241. sum := hash.Sum(nil)
  242. upper := strings.ToUpper(hex.EncodeToString(sum))
  243. fmt.Println(" ssad ", upper)
  244. }
  245. func TestCode2Session(t *testing.T) {
  246. userIdRsp, err := Code2Session(AppID, APPSecret, "011EZg6p0VO47n1p2W4p0mle6p0EZg6u")
  247. if err != nil {
  248. fmt.Println("err:", err)
  249. return
  250. }
  251. fmt.Println("SessionKey:", userIdRsp.SessionKey)
  252. fmt.Println("ExpiresIn:", userIdRsp.ExpiresIn)
  253. fmt.Println("OpenID:", userIdRsp.Openid)
  254. fmt.Println("UnionID:", userIdRsp.Unionid)
  255. fmt.Println("Errcode:", userIdRsp.Errcode)
  256. fmt.Println("Errmsg:", userIdRsp.Errmsg)
  257. }
  258. func TestGetAccessToken(t *testing.T) {
  259. rsp, err := GetAccessToken(AppID, APPSecret)
  260. if err != nil {
  261. fmt.Println("err:", err)
  262. return
  263. }
  264. fmt.Println("AccessToken:", rsp.AccessToken)
  265. fmt.Println("ExpiresIn:", rsp.ExpiresIn)
  266. fmt.Println("Errcode:", rsp.Errcode)
  267. fmt.Println("Errmsg:", rsp.Errmsg)
  268. }
  269. func TestGetPaidUnionId(t *testing.T) {
  270. accessToken := "21_3puo3mxoK6Ry2bR7Dh-qdn41wUP1wClwke8Zhf9a_i39jfWRq9rhNJZZZHaOt_Yad-Gp6u9_46dGW0RbIMz3nANInRI3m-1glvCnGW47v63sjYWV1iyTKOHGwDVxEv78kY-0OfkmkiIveVqAZCZaAAAQTQ"
  271. rsp, err := GetPaidUnionId(accessToken, "o0Df70MSI4Ygv2KQ2cLnoMN5CXI8", "4200000326201905256499385970")
  272. if err != nil {
  273. fmt.Println("err:", err)
  274. return
  275. }
  276. fmt.Println("Unionid:", rsp.Unionid)
  277. fmt.Println("Errcode:", rsp.Errcode)
  278. fmt.Println("Errmsg:", rsp.Errmsg)
  279. }
  280. func TestGetWeChatUserInfo(t *testing.T) {
  281. accessToken := "21_3puo3mxoK6Ry2bR7Dh-qdn41wUP1wClwke8Zhf9a_i39jfWRq9rhNJZZZHaOt_Yad-Gp6u9_46dGW0RbIMz3nANInRI3m-1glvCnGW47v63sjYWV1iyTKOHGwDVxEv78kY-0OfkmkiIveVqAZCZaAAAQTQ"
  282. userInfo, err := GetWeChatUserInfo(accessToken, OpenID)
  283. if err != nil {
  284. fmt.Println("err:", err)
  285. return
  286. }
  287. fmt.Println("userInfo:", userInfo)
  288. }
  289. func TestDecryptOpenDataToStruct(t *testing.T) {
  290. data := "Kf3TdPbzEmhWMuPKtlKxIWDkijhn402w1bxoHL4kLdcKr6jT1jNcIhvDJfjXmJcgDWLjmBiIGJ5acUuSvxLws3WgAkERmtTuiCG10CKLsJiR+AXVk7B2TUQzsq88YVilDz/YAN3647REE7glGmeBPfvUmdbfDzhL9BzvEiuRhABuCYyTMz4iaM8hFjbLB1caaeoOlykYAFMWC5pZi9P8uw=="
  291. iv := "Cds8j3VYoGvnTp1BrjXdJg=="
  292. session := "lyY4HPQbaOYzZdG+JcYK9w=="
  293. phone := new(WeChatUserPhone)
  294. err := DecryptOpenDataToStruct(data, iv, session, phone)
  295. if err != nil {
  296. fmt.Println("err:", err)
  297. return
  298. }
  299. fmt.Println("PhoneNumber:", phone.PhoneNumber)
  300. fmt.Println("PurePhoneNumber:", phone.PurePhoneNumber)
  301. fmt.Println("CountryCode:", phone.CountryCode)
  302. fmt.Println("Watermark:", phone.Watermark)
  303. }