wx_ServiceApi.go 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. package wechat
  2. import (
  3. "fmt"
  4. "net/http"
  5. "github.com/iGoogle-ink/gopay"
  6. "github.com/iGoogle-ink/gopay/wechat"
  7. )
  8. func Code2Session() {
  9. //获取微信用户的OpenId、SessionKey、UnionId
  10. // appId:APPID
  11. // appSecret:AppSecret
  12. // wxCode:小程序调用wx.login 获取的code
  13. userIdRsp, err := wechat.Code2Session("AppID", "APPSecret", "011EZg6p0VO47n1p2W4p0mle6p0EZg6u")
  14. if err != nil {
  15. fmt.Println("err:", err)
  16. return
  17. }
  18. fmt.Println("SessionKey:", userIdRsp.SessionKey)
  19. fmt.Println("ExpiresIn:", userIdRsp.ExpiresIn)
  20. fmt.Println("OpenID:", userIdRsp.Openid)
  21. fmt.Println("UnionID:", userIdRsp.Unionid)
  22. fmt.Println("Errcode:", userIdRsp.Errcode)
  23. fmt.Println("Errmsg:", userIdRsp.Errmsg)
  24. }
  25. func GetAppWeChatLoginAccessToken() {
  26. accessToken, err := wechat.GetAppLoginAccessToken("AppID", "AppSecret", "code")
  27. if err != nil {
  28. fmt.Println("err:", err)
  29. return
  30. }
  31. fmt.Println("AccessToken:", accessToken.AccessToken)
  32. fmt.Println("Openid:", accessToken.Openid)
  33. fmt.Println("Unionid:", accessToken.Unionid)
  34. fmt.Println("Scope:", accessToken.Scope)
  35. fmt.Println("ExpiresIn:", accessToken.ExpiresIn)
  36. fmt.Println("Errcode:", accessToken.Errcode)
  37. fmt.Println("Errmsg:", accessToken.Errmsg)
  38. }
  39. func RefreshAppWeChatLoginAccessToken() {
  40. accessToken, err := wechat.RefreshAppLoginAccessToken("AppID", "refreshToken")
  41. if err != nil {
  42. fmt.Println("err:", err)
  43. return
  44. }
  45. fmt.Println("AccessToken:", accessToken.AccessToken)
  46. fmt.Println("Openid:", accessToken.Openid)
  47. fmt.Println("Scope:", accessToken.Scope)
  48. fmt.Println("ExpiresIn:", accessToken.ExpiresIn)
  49. fmt.Println("Errcode:", accessToken.Errcode)
  50. fmt.Println("Errmsg:", accessToken.Errmsg)
  51. }
  52. func GetWeChatAppletAccessToken() {
  53. //获取小程序全局唯一后台接口调用凭据(AccessToken:157字符)
  54. // appId:APPID
  55. // appSecret:AppSecret
  56. accessToken, err := wechat.GetAppletAccessToken("AppID", "AppSecret")
  57. if err != nil {
  58. fmt.Println("err:", err)
  59. return
  60. }
  61. fmt.Println("AccessToken:", accessToken.AccessToken)
  62. fmt.Println("ExpiresIn:", accessToken.ExpiresIn)
  63. fmt.Println("Errcode:", accessToken.Errcode)
  64. fmt.Println("Errmsg:", accessToken.Errmsg)
  65. }
  66. func GetWeChatAppletPaidUnionId() {
  67. accessToken := "21_3puo3mxoK6Ry2bR7Dh-qdn41wUP1wClwke8Zhf9a_i39jfWRq9rhNJZZZHaOt_Yad-Gp6u9_46dGW0RbIMz3nANInRI3m-1glvCnGW47v63sjYWV1iyTKOHGwDVxEv78kY-0OfkmkiIveVqAZCZaAAAQTQ"
  68. //用户支付完成后,获取该用户的 UnionId,无需用户授权。
  69. // accessToken:接口调用凭据
  70. // openId:用户的OpenID
  71. // transactionId:微信支付订单号
  72. rsp, err := wechat.GetAppletPaidUnionId(accessToken, "o0Df70MSI4Ygv2KQ2cLnoMN5CXI8", "4200000326201905256499385970")
  73. if err != nil {
  74. fmt.Println("err:", err)
  75. return
  76. }
  77. fmt.Println("Unionid:", rsp.Unionid)
  78. fmt.Println("Errcode:", rsp.Errcode)
  79. fmt.Println("Errmsg:", rsp.Errmsg)
  80. }
  81. func GetWeChatUserInfo() {
  82. accessToken := "21_3puo3mxoK6Ry2bR7Dh-qdn41wUP1wClwke8Zhf9a_i39jfWRq9rhNJZZZHaOt_Yad-Gp6u9_46dGW0RbIMz3nANInRI3m-1glvCnGW47v63sjYWV1iyTKOHGwDVxEv78kY-0OfkmkiIveVqAZCZaAAAQTQ"
  83. //获取用户基本信息(UnionID机制)
  84. // accessToken:接口调用凭据
  85. // openId:用户的OpenID
  86. // lang:默认为 zh_CN ,可选填 zh_CN 简体,zh_TW 繁体,en 英语
  87. userInfo, err := wechat.GetUserInfo(accessToken, "o0Df70H2Q0fY8JXh1aFPIRyOBgu8")
  88. if err != nil {
  89. fmt.Println("err:", err)
  90. return
  91. }
  92. fmt.Println("userInfo:", *userInfo)
  93. }
  94. func DecryptWeChatOpenDataToStruct() {
  95. data := "Kf3TdPbzEmhWMuPKtlKxIWDkijhn402w1bxoHL4kLdcKr6jT1jNcIhvDJfjXmJcgDWLjmBiIGJ5acUuSvxLws3WgAkERmtTuiCG10CKLsJiR+AXVk7B2TUQzsq88YVilDz/YAN3647REE7glGmeBPfvUmdbfDzhL9BzvEiuRhABuCYyTMz4iaM8hFjbLB1caaeoOlykYAFMWC5pZi9P8uw=="
  96. iv := "Cds8j3VYoGvnTp1BrjXdJg=="
  97. session := "lyY4HPQbaOYzZdG+JcYK9w=="
  98. //微信小程序,手机号
  99. phone := new(wechat.UserPhone)
  100. //解密开放数据
  101. // encryptedData:包括敏感数据在内的完整用户信息的加密数据
  102. // iv:加密算法的初始向量
  103. // sessionKey:会话密钥
  104. // beanPtr:需要解析到的结构体指针
  105. err := wechat.DecryptOpenDataToStruct(data, iv, session, phone)
  106. if err != nil {
  107. fmt.Println("err:", err)
  108. return
  109. }
  110. fmt.Println("PhoneNumber:", phone.PhoneNumber)
  111. fmt.Println("PurePhoneNumber:", phone.PurePhoneNumber)
  112. fmt.Println("CountryCode:", phone.CountryCode)
  113. fmt.Println("Watermark:", phone.Watermark)
  114. sessionKey := "tiihtNczf5v6AKRyjwEUhQ=="
  115. encryptedData := "CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZMQmRzooG2xrDcvSnxIMXFufNstNGTyaGS9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+3hVbJSRgv+4lGOETKUQz6OYStslQ142dNCuabNPGBzlooOmB231qMM85d2/fV6ChevvXvQP8Hkue1poOFtnEtpyxVLW1zAo6/1Xx1COxFvrc2d7UL/lmHInNlxuacJXwu0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn/Hz7saL8xz+W//FRAUid1OksQaQx4CMs8LOddcQhULW4ucetDf96JcR3g0gfRK4PC7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns/8wR2SiRS7MNACwTyrGvt9ts8p12PKFdlqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYVoKlaRv85IfVunYzO0IKXsyl7JCUjCpoG20f0a04COwfneQAGGwd5oa+T8yO5hzuyDb/XcxxmK01EpqOyuxINew=="
  116. iv2 := "r7BXXKkLb8qrSNn05n0qiA=="
  117. //微信小程序 用户信息
  118. userInfo := new(wechat.AppletUserInfo)
  119. err = wechat.DecryptOpenDataToStruct(encryptedData, iv2, sessionKey, userInfo)
  120. if err != nil {
  121. fmt.Println("err:", err)
  122. return
  123. }
  124. fmt.Println("NickName:", userInfo.NickName)
  125. fmt.Println("AvatarUrl:", userInfo.AvatarUrl)
  126. fmt.Println("Country:", userInfo.Country)
  127. fmt.Println("Province:", userInfo.Province)
  128. fmt.Println("City:", userInfo.City)
  129. fmt.Println("Gender:", userInfo.Gender)
  130. fmt.Println("OpenId:", userInfo.OpenId)
  131. fmt.Println("UnionId:", userInfo.UnionId)
  132. fmt.Println("Watermark:", userInfo.Watermark)
  133. }
  134. func DecryptWeChatOpenDataToBodyMap() {
  135. data := "Kf3TdPbzEmhWMuPKtlKxIWDkijhn402w1bxoHL4kLdcKr6jT1jNcIhvDJfjXmJcgDWLjmBiIGJ5acUuSvxLws3WgAkERmtTuiCG10CKLsJiR+AXVk7B2TUQzsq88YVilDz/YAN3647REE7glGmeBPfvUmdbfDzhL9BzvEiuRhABuCYyTMz4iaM8hFjbLB1caaeoOlykYAFMWC5pZi9P8uw=="
  136. iv := "Cds8j3VYoGvnTp1BrjXdJg=="
  137. session := "lyY4HPQbaOYzZdG+JcYK9w=="
  138. //解密开放数据
  139. // encryptedData:包括敏感数据在内的完整用户信息的加密数据
  140. // iv:加密算法的初始向量
  141. // sessionKey:会话密钥
  142. bm, err := wechat.DecryptOpenDataToBodyMap(data, iv, session)
  143. if err != nil {
  144. fmt.Println("err:", err)
  145. return
  146. }
  147. fmt.Println("WeChatUserPhone:", bm)
  148. }
  149. func GetOpenIdByAuthCode() {
  150. //授权码查询openid
  151. // appId:APPID
  152. // mchId:商户号
  153. // apiKey:ApiKey
  154. // authCode:用户授权码
  155. // nonceStr:随即字符串
  156. openIdRsp, err := wechat.GetOpenIdByAuthCode("wxdaa2ab9ef87b5497", "1368139502", "GFDS8j98rewnmgl45wHTt980jg543abc", "135127679952609396", gopay.GetRandomString(32))
  157. if err != nil {
  158. fmt.Println("err:", err)
  159. return
  160. }
  161. fmt.Println("ReturnCode:", openIdRsp.ReturnCode)
  162. fmt.Println("ReturnMsg:", openIdRsp.ReturnMsg)
  163. fmt.Println("ResultCode:", openIdRsp.ResultCode)
  164. fmt.Println("Appid:", openIdRsp.Appid)
  165. fmt.Println("MchId:", openIdRsp.MchId)
  166. fmt.Println("NonceStr:", openIdRsp.NonceStr)
  167. fmt.Println("err_code:", openIdRsp.ErrCode)
  168. fmt.Println("Openid:", openIdRsp.Openid)
  169. }
  170. //解析notify参数、验签、返回数据到微信
  171. func ParseWeChatNotifyResultAndVerifyWeChatSign(req *http.Request) string {
  172. rsp := new(wechat.NotifyResponse)
  173. //解析参数
  174. notifyReq, err := wechat.ParseNotifyResult(req)
  175. if err != nil {
  176. fmt.Println("err:", err)
  177. }
  178. fmt.Println("notifyReq:", *notifyReq)
  179. //验签
  180. ok, err := wechat.VerifySign("GFDS8j98rewnmgl45wHTt980jg543abc", wechat.SignType_MD5, notifyReq)
  181. if err != nil {
  182. fmt.Println("err:", err)
  183. }
  184. fmt.Println("微信验签是否通过:", ok)
  185. //或者
  186. bodyMap, err := wechat.ParseNotifyResultToBodyMap(req)
  187. if err != nil {
  188. fmt.Println("err:", err)
  189. }
  190. fmt.Println("bodyMap:", bodyMap)
  191. ok, err = wechat.VerifySign("GFDS8j98rewnmgl45wHTt980jg543abc", wechat.SignType_MD5, bodyMap)
  192. if err != nil {
  193. fmt.Println("err:", err)
  194. }
  195. fmt.Println("微信验签是否通过:", ok)
  196. rsp.ReturnCode = gopay.SUCCESS
  197. rsp.ReturnMsg = "OK"
  198. return rsp.ToXmlString()
  199. }
  200. // 解析微信退款异步通知的参数,解析出来的 req_info 是加密数据,需解密
  201. func ParseWeChatRefundNotifyResult(req *http.Request) string {
  202. rsp := new(wechat.NotifyResponse)
  203. // 解析参数
  204. notifyReq, err := wechat.ParseRefundNotifyResult(req)
  205. if err != nil {
  206. fmt.Println("err:", err)
  207. }
  208. fmt.Println("notifyReq:", *notifyReq)
  209. // 退款通知无sign,不用验签
  210. // 解密退款异步通知的加密数据
  211. refundNotify, err := wechat.DecryptRefundNotifyReqInfo(notifyReq.ReqInfo, "GFDS8j98rewnmgl45wHTt980jg543abc")
  212. if err != nil {
  213. fmt.Println("err:", err)
  214. }
  215. fmt.Println("refundNotify:", *refundNotify)
  216. // 返回微信
  217. rsp.ReturnCode = gopay.SUCCESS
  218. rsp.ReturnMsg = "OK"
  219. return rsp.ToXmlString()
  220. }