wechat_client_test.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. package gopay
  2. import (
  3. "crypto/md5"
  4. "encoding/hex"
  5. "encoding/xml"
  6. "fmt"
  7. "strings"
  8. "testing"
  9. )
  10. func TestWeChatClient_UnifiedOrder(t *testing.T) {
  11. //初始化微信客户端
  12. // appId:应用ID
  13. // MchID:商户ID
  14. // apiKey:API秘钥值
  15. // isProd:是否是正式环境
  16. client := NewWeChatClient(AppID, MchID_iguiyu, ApiKey_iguiyu, false)
  17. number := GetRandomString(32)
  18. fmt.Println("out_trade_no:", number)
  19. //初始化参数Map
  20. body := make(BodyMap)
  21. body.Set("nonce_str", GetRandomString(32))
  22. body.Set("body", "测试支付")
  23. body.Set("out_trade_no", number)
  24. body.Set("total_fee", 1)
  25. body.Set("spbill_create_ip", "127.0.0.1")
  26. body.Set("notify_url", "https://api.iguiyu.com/gy_pay/wechat/testnotify")
  27. body.Set("trade_type", TradeType_Native)
  28. body.Set("device_info", "WEB")
  29. body.Set("sign_type", SignType_MD5)
  30. //sceneInfo := make(map[string]map[string]string)
  31. //h5Info := make(map[string]string)
  32. //h5Info["type"] = "Wap"
  33. //h5Info["wap_url"] = "http://www.gopay.ink"
  34. //h5Info["wap_name"] = "H5测试支付"
  35. //sceneInfo["h5_info"] = h5Info
  36. //body.Set("scene_info", sceneInfo)
  37. //
  38. //body.Set("openid", OpenID)
  39. //请求支付下单,成功后得到结果
  40. wxRsp, err := client.UnifiedOrder(body)
  41. if err != nil {
  42. fmt.Println("Error:", err)
  43. return
  44. }
  45. fmt.Println("wxRsp:", *wxRsp)
  46. //timeStamp := strconv.FormatInt(time.Now().Unix(), 10)
  47. ////获取小程序需要的paySign
  48. //pac := "prepay_id=" + wxRsp.PrepayId
  49. //paySign := GetMiniPaySign(AppID, wxRsp.NonceStr, pac, SignType_MD5, timeStamp, ApiKey_iguiyu)
  50. //fmt.Println("paySign:", paySign)
  51. }
  52. //
  53. //func TestWeChatClient_QueryOrder(t *testing.T) {
  54. // //初始化微信客户端
  55. // // appId:应用ID
  56. // // MchID:商户ID
  57. // // apiKey:API秘钥值
  58. // // isProd:是否是正式环境
  59. // client := NewWeChatClient(AppID, MchID_iguiyu, ApiKey_iguiyu, false)
  60. //
  61. // //初始化参数结构体
  62. // body := make(BodyMap)
  63. // body.Set("out_trade_no", "GYWX201901301040355706100401")
  64. // body.Set("nonce_str", GetRandomString(32))
  65. // body.Set("sign_type", SignType_MD5)
  66. //
  67. // //请求订单查询,成功后得到结果
  68. // wxRsp, err := client.QueryOrder(body)
  69. // if err != nil {
  70. // fmt.Println("Error:", err)
  71. // return
  72. // }
  73. // fmt.Println("wxRsp:", *wxRsp)
  74. //}
  75. //
  76. //func TestWeChatClient_CloseOrder(t *testing.T) {
  77. // //初始化微信客户端
  78. // // appId:应用ID
  79. // // MchID:商户ID
  80. // // ApiKey:Key值
  81. // // isProd:是否是正式环境
  82. // client := NewWeChatClient(AppID, MchID_iguiyu, ApiKey_iguiyu, false)
  83. //
  84. // //初始化参数结构体
  85. // body := make(BodyMap)
  86. // body.Set("out_trade_no", "MfZC2segKxh0bnJSELbvKNeH3d9oWvvQ")
  87. // body.Set("nonce_str", GetRandomString(32))
  88. // body.Set("sign_type", SignType_MD5)
  89. //
  90. // //请求关闭订单,成功后得到结果
  91. // wxRsp, err := client.CloseOrder(body)
  92. // if err != nil {
  93. // fmt.Println("Error:", err)
  94. // return
  95. // }
  96. // fmt.Println("wxRsp:", *wxRsp)
  97. //}
  98. //
  99. //func TestWeChatClient_Refund(t *testing.T) {
  100. // //初始化微信客户端
  101. // // appId:应用ID
  102. // // MchID:商户ID
  103. // // ApiKey:Key值
  104. // // isProd:是否是正式环境
  105. // client := NewWeChatClient(AppID, MchID_iguiyu, ApiKey_iguiyu, true)
  106. //
  107. // //初始化参数结构体
  108. // body := make(BodyMap)
  109. // body.Set("out_trade_no", "97HiM5j6kGmM2fk7fYMc8MgKhPnEQ5Rk")
  110. // body.Set("nonce_str", GetRandomString(32))
  111. // body.Set("sign_type", SignType_MD5)
  112. // s := GetRandomString(64)
  113. // fmt.Println("s:", s)
  114. // body.Set("out_refund_no", s)
  115. // body.Set("total_fee", 1)
  116. // body.Set("refund_fee", 1)
  117. //
  118. // //请求申请退款(沙箱环境下,证书路径参数可传空)
  119. // // body:参数Body
  120. // // certFilePath:cert证书路径
  121. // // keyFilePath:Key证书路径
  122. // // pkcs12FilePath:p12证书路径
  123. // wxRsp, err := client.Refund(body, Cert_iguiyu+"/apiclient_cert.pem", Cert_iguiyu+"/apiclient_key.pem", Cert_iguiyu+"/apiclient_cert.p12")
  124. // if err != nil {
  125. // fmt.Println("Error:", err)
  126. // return
  127. // }
  128. // fmt.Println("wxRsp:", *wxRsp)
  129. //}
  130. //
  131. //func TestWeChatClient_QueryRefund(t *testing.T) {
  132. // //初始化微信客户端
  133. // // appId:应用ID
  134. // // MchID:商户ID
  135. // // ApiKey:Key值
  136. // // isProd:是否是正式环境
  137. // client := NewWeChatClient(AppID, MchID_iguiyu, ApiKey_iguiyu, false)
  138. //
  139. // //初始化参数结构体
  140. // body := make(BodyMap)
  141. // body.Set("out_refund_no", "vk4264I1UQ3Hm3E4AKsavK8npylGSgQA092f9ckUxp8A2gXmnsLEdsupURVTcaC7")
  142. // body.Set("nonce_str", GetRandomString(32))
  143. // body.Set("sign_type", SignType_MD5)
  144. //
  145. // //请求申请退款
  146. // wxRsp, err := client.QueryRefund(body)
  147. // if err != nil {
  148. // fmt.Println("Error:", err)
  149. // return
  150. // }
  151. // fmt.Println("wxRsp:", *wxRsp)
  152. //}
  153. //
  154. //func TestWeChatClient_DownloadBill(t *testing.T) {
  155. // //初始化微信客户端
  156. // // appId:应用ID
  157. // // MchID:商户ID
  158. // // ApiKey:Key值
  159. // // isProd:是否是正式环境
  160. // client := NewWeChatClient(AppID, MchID_iguiyu, ApiKey_iguiyu, false)
  161. //
  162. // //初始化参数结构体
  163. // body := make(BodyMap)
  164. // body.Set("nonce_str", GetRandomString(32))
  165. // body.Set("sign_type", SignType_MD5)
  166. // body.Set("bill_date", "20190122")
  167. // body.Set("bill_type", "ALL")
  168. //
  169. // //请求下载对账单,成功后得到结果(string类型字符串)
  170. // wxRsp, err := client.DownloadBill(body)
  171. // if err != nil {
  172. // fmt.Println("Error:", err)
  173. // return
  174. // }
  175. // fmt.Println("wxRsp:", wxRsp)
  176. //}
  177. //
  178. //func TestWeChatClient_DownloadFundFlow(t *testing.T) {
  179. // //初始化微信客户端
  180. // // appId:应用ID
  181. // // MchID:商户ID
  182. // // ApiKey:Key值
  183. // // isProd:是否是正式环境
  184. // // 好像不支持沙箱环境,因为沙箱环境默认需要用MD5签名,但是此接口仅支持HMAC-SHA256签名
  185. // client := NewWeChatClient(AppID, MchID_iguiyu, ApiKey_iguiyu, false)
  186. //
  187. // //初始化参数结构体
  188. // body := make(BodyMap)
  189. // body.Set("nonce_str", GetRandomString(32))
  190. // body.Set("sign_type", SignType_HMAC_SHA256)
  191. // body.Set("bill_date", "20190122")
  192. // body.Set("account_type", "Basic")
  193. //
  194. // //请求下载资金账单,成功后得到结果,沙箱环境下,证书路径参数可传空
  195. // wxRsp, err := client.DownloadFundFlow(body, "", "", "")
  196. // if err != nil {
  197. // fmt.Println("Error:", err)
  198. // return
  199. // }
  200. // fmt.Println("wxRsp:", wxRsp)
  201. //}
  202. //
  203. //func TestWeChatClient_BatchQueryComment(t *testing.T) {
  204. // //初始化微信客户端
  205. // // appId:应用ID
  206. // // MchID:商户ID
  207. // // ApiKey:Key值
  208. // // isProd:是否是正式环境
  209. // // 好像不支持沙箱环境,因为沙箱环境默认需要用MD5签名,但是此接口仅支持HMAC-SHA256签名
  210. // client := NewWeChatClient(AppID, MchID_iguiyu, ApiKey_iguiyu, false)
  211. //
  212. // //初始化参数结构体
  213. // body := make(BodyMap)
  214. // body.Set("nonce_str", GetRandomString(32))
  215. // body.Set("sign_type", SignType_HMAC_SHA256)
  216. // body.Set("begin_time", "20190120000000")
  217. // body.Set("end_time", "20190122174000")
  218. // body.Set("offset", "0")
  219. //
  220. // //请求拉取订单评价数据,成功后得到结果,沙箱环境下,证书路径参数可传空
  221. // wxRsp, err := client.BatchQueryComment(body, "", "", "")
  222. // if err != nil {
  223. // fmt.Println("Error:", err)
  224. // return
  225. // }
  226. // fmt.Println("Response:", wxRsp)
  227. //}
  228. //
  229. //func TestWeChatClient_Micropay(t *testing.T) {
  230. // //初始化微信客户端
  231. // // appId:应用ID
  232. // // MchID:商户ID
  233. // // ApiKey:Key值
  234. // // isProd:是否是正式环境
  235. // client := NewWeChatClient(AppID, MchID_iguiyu, ApiKey_iguiyu, true)
  236. //
  237. // //初始化参数Map
  238. // body := make(BodyMap)
  239. // body.Set("nonce_str", GetRandomString(32))
  240. // body.Set("body", "扫用户付款码支付")
  241. // number := GetRandomString(32)
  242. // log.Println("out_trade_no:", number)
  243. // body.Set("out_trade_no", number)
  244. // body.Set("total_fee", 1)
  245. // body.Set("spbill_create_ip", "124.77.173.62")
  246. // body.Set("auth_code", "134518243599425392")
  247. // body.Set("sign_type", SignType_MD5)
  248. //
  249. // //请求支付,成功后得到结果
  250. // wxRsp, err := client.Micropay(body)
  251. // if err != nil {
  252. // fmt.Println("Error:", err)
  253. // return
  254. // }
  255. // fmt.Println("Response:", wxRsp)
  256. //}
  257. //
  258. //func TestWeChatClient_Reverse(t *testing.T) {
  259. // //初始化微信客户端
  260. // // appId:应用ID
  261. // // MchID:商户ID
  262. // // ApiKey:Key值
  263. // // isProd:是否是正式环境
  264. // client := NewWeChatClient(AppID, MchID_iguiyu, ApiKey_iguiyu, false)
  265. //
  266. // //初始化参数Map
  267. // body := make(BodyMap)
  268. // body.Set("nonce_str", GetRandomString(32))
  269. // body.Set("out_trade_no", "6aDCor1nUcAihrV5JBlI09tLvXbUp02B")
  270. // body.Set("sign_type", SignType_MD5)
  271. //
  272. // //请求撤销订单,成功后得到结果,沙箱环境下,证书路径参数可传空
  273. // wxRsp, err := client.Reverse(body, "", "", "")
  274. // if err != nil {
  275. // fmt.Println("Error:", err)
  276. // return
  277. // }
  278. // fmt.Println("Response:", wxRsp)
  279. //}
  280. //
  281. //func TestCode2Session(t *testing.T) {
  282. // //获取微信用户的OpenId、SessionKey、UnionId
  283. // // appId:APPID
  284. // // appSecret:AppSecret
  285. // // wxCode:小程序调用wx.login 获取的code
  286. // userIdRsp, err := Code2Session(AppID, APPSecret, "011EZg6p0VO47n1p2W4p0mle6p0EZg6u")
  287. // if err != nil {
  288. // fmt.Println("err:", err)
  289. // return
  290. // }
  291. // fmt.Println("SessionKey:", userIdRsp.SessionKey)
  292. // fmt.Println("ExpiresIn:", userIdRsp.ExpiresIn)
  293. // fmt.Println("OpenID:", userIdRsp.Openid)
  294. // fmt.Println("UnionID:", userIdRsp.Unionid)
  295. // fmt.Println("Errcode:", userIdRsp.Errcode)
  296. // fmt.Println("Errmsg:", userIdRsp.Errmsg)
  297. //}
  298. //
  299. //func TestGetAccessToken(t *testing.T) {
  300. // //获取小程序全局唯一后台接口调用凭据(AccessToken:157字符)
  301. // // appId:APPID
  302. // // appSecret:AppSecret
  303. // rsp, err := GetAccessToken(AppID, APPSecret)
  304. // if err != nil {
  305. // fmt.Println("err:", err)
  306. // return
  307. // }
  308. // fmt.Println("AccessToken:", rsp.AccessToken)
  309. // fmt.Println("ExpiresIn:", rsp.ExpiresIn)
  310. // fmt.Println("Errcode:", rsp.Errcode)
  311. // fmt.Println("Errmsg:", rsp.Errmsg)
  312. //}
  313. //
  314. //func TestGetPaidUnionId(t *testing.T) {
  315. // accessToken := "21_3puo3mxoK6Ry2bR7Dh-qdn41wUP1wClwke8Zhf9a_i39jfWRq9rhNJZZZHaOt_Yad-Gp6u9_46dGW0RbIMz3nANInRI3m-1glvCnGW47v63sjYWV1iyTKOHGwDVxEv78kY-0OfkmkiIveVqAZCZaAAAQTQ"
  316. // //用户支付完成后,获取该用户的 UnionId,无需用户授权。
  317. // // accessToken:接口调用凭据
  318. // // openId:用户的OpenID
  319. // // transactionId:微信支付订单号
  320. // rsp, err := GetPaidUnionId(accessToken, "o0Df70MSI4Ygv2KQ2cLnoMN5CXI8", "4200000326201905256499385970")
  321. // if err != nil {
  322. // fmt.Println("err:", err)
  323. // return
  324. // }
  325. // fmt.Println("Unionid:", rsp.Unionid)
  326. // fmt.Println("Errcode:", rsp.Errcode)
  327. // fmt.Println("Errmsg:", rsp.Errmsg)
  328. //}
  329. //
  330. //func TestGetWeChatUserInfo(t *testing.T) {
  331. // accessToken := "21_3puo3mxoK6Ry2bR7Dh-qdn41wUP1wClwke8Zhf9a_i39jfWRq9rhNJZZZHaOt_Yad-Gp6u9_46dGW0RbIMz3nANInRI3m-1glvCnGW47v63sjYWV1iyTKOHGwDVxEv78kY-0OfkmkiIveVqAZCZaAAAQTQ"
  332. // //获取用户基本信息(UnionID机制)
  333. // // accessToken:接口调用凭据
  334. // // openId:用户的OpenID
  335. // // lang:默认为 zh_CN ,可选填 zh_CN 简体,zh_TW 繁体,en 英语
  336. // userInfo, err := GetWeChatUserInfo(accessToken, OpenID)
  337. // if err != nil {
  338. // fmt.Println("err:", err)
  339. // return
  340. // }
  341. // fmt.Println("userInfo:", *userInfo)
  342. //}
  343. //
  344. //func TestDecryptOpenDataToStruct(t *testing.T) {
  345. // data := "Kf3TdPbzEmhWMuPKtlKxIWDkijhn402w1bxoHL4kLdcKr6jT1jNcIhvDJfjXmJcgDWLjmBiIGJ5acUuSvxLws3WgAkERmtTuiCG10CKLsJiR+AXVk7B2TUQzsq88YVilDz/YAN3647REE7glGmeBPfvUmdbfDzhL9BzvEiuRhABuCYyTMz4iaM8hFjbLB1caaeoOlykYAFMWC5pZi9P8uw=="
  346. // iv := "Cds8j3VYoGvnTp1BrjXdJg=="
  347. // session := "lyY4HPQbaOYzZdG+JcYK9w=="
  348. //
  349. // phone := new(WeChatUserPhone)
  350. // //解密开放数据
  351. // // encryptedData:包括敏感数据在内的完整用户信息的加密数据
  352. // // iv:加密算法的初始向量
  353. // // sessionKey:会话密钥
  354. // // beanPtr:需要解析到的结构体指针
  355. // err := DecryptOpenDataToStruct(data, iv, session, phone)
  356. // if err != nil {
  357. // fmt.Println("err:", err)
  358. // return
  359. // }
  360. // fmt.Println("PhoneNumber:", phone.PhoneNumber)
  361. // fmt.Println("PurePhoneNumber:", phone.PurePhoneNumber)
  362. // fmt.Println("CountryCode:", phone.CountryCode)
  363. // fmt.Println("Watermark:", phone.Watermark)
  364. //}
  365. //
  366. //func TestGetOpenIdByAuthCode(t *testing.T) {
  367. // //授权码查询openid
  368. // // appId:APPID
  369. // // mchId:商户号
  370. // // apiKey:ApiKey
  371. // // authCode:用户授权码
  372. // // nonceStr:随即字符串
  373. // openIdRsp, err := GetOpenIdByAuthCode(AppID, MchID_iguiyu, ApiKey_iguiyu, "135127679952609396", GetRandomString(32))
  374. // if err != nil {
  375. // fmt.Println("err:", err)
  376. // return
  377. // }
  378. // fmt.Println("ReturnCode:", openIdRsp.ReturnCode)
  379. // fmt.Println("ReturnMsg:", openIdRsp.ReturnMsg)
  380. // fmt.Println("ResultCode:", openIdRsp.ResultCode)
  381. // fmt.Println("Appid:", openIdRsp.Appid)
  382. // fmt.Println("MchId:", openIdRsp.MchId)
  383. // fmt.Println("NonceStr:", openIdRsp.NonceStr)
  384. // fmt.Println("err_code:", openIdRsp.ErrCode)
  385. // fmt.Println("Openid:", openIdRsp.Openid)
  386. //}
  387. func TestMd5(t *testing.T) {
  388. st := "appid=wxdaa2ab9ef87b5497&nonceStr=9k20rM66parD2U49&package=prepay_id=wx29164301554772fbc70d1d793335446010&signType=MD5&timeStamp=1548751382&key=GFDS8j98rewnmgl45wHTt980jg543wmg"
  389. hash := md5.New()
  390. hash.Write([]byte(st))
  391. sum := hash.Sum(nil)
  392. upper := strings.ToUpper(hex.EncodeToString(sum))
  393. fmt.Println(" ssad ", upper)
  394. }
  395. func TestBodyMap_MarshalXML(t *testing.T) {
  396. maps := make(BodyMap)
  397. maps.Set("name", "jerry")
  398. maps.Set("age", 28)
  399. maps.Set("phone", "13212345678")
  400. bytes, err := xml.Marshal(&maps)
  401. if err != nil {
  402. fmt.Println("err:", err)
  403. }
  404. fmt.Println("ssss:", string(bytes))
  405. }