wechat_client_test.go 12 KB

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