doc.adoc 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. = GoWechat使用文档
  2. :toc: left
  3. :icons: font
  4. [[install,安装]]
  5. == 安装
  6. go get github.com/yaotian/gowechat
  7. [[use,使用]]
  8. == 配置
  9. ==== 参数
  10. ```go
  11. var config = wxcontext.Config{
  12. //微信公众平台,商户平台,需要填写的信息
  13. AppID: "your app id",
  14. AppSecret: "your app secret",
  15. Token: "your token",
  16. EncodingAESKey: "your encoding aes key",
  17. //以下是 mch商户平台需要的变量
  18. SslCertFilePath string //证书公钥文件的路径
  19. SslKeyFilePath string //证书私钥文件的路径
  20. SslCertContent string //公钥证书的内容
  21. SslKeyContent string //私钥证书的内容
  22. MchID string //商户ID
  23. MchAPIKey string //商户平台设置的api key
  24. }
  25. ```
  26. === 微信平台的操作接口
  27. ==== 微信公众平台
  28. ```go
  29. wc := gowechat.NewWechat(config)
  30. //微信公众平台
  31. mp, err := wc.MpMgr()
  32. if err != nil {
  33. return
  34. }
  35. ```
  36. ==== 微信商户平台
  37. ```go
  38. wc := gowechat.NewWechat(config)
  39. //微信商户平台
  40. mch , err := wc.MchMgr()
  41. if err != nil {
  42. return
  43. }
  44. ```
  45. == 在框架中使用
  46. === beego中使用的例子
  47. ./examples/beego
  48. === gin中使用的例子
  49. ./examples/gin
  50. === net/http中使用的例子
  51. ./examples/http
  52. [[mp,mp]]
  53. == 微信公众平台
  54. === 1.接口参数
  55. [source,go]
  56. ----
  57. var config = wxcontext.Config{
  58. //微信公众平台,商户平台,需要填写的信息
  59. AppID: "your app id",
  60. AppSecret: "your app secret",
  61. Token: "your token",
  62. EncodingAESKey: "your encoding aes key",
  63. }
  64. ----
  65. === 2.接口参数创建接口
  66. [source,go]
  67. ----
  68. wc := gowechat.NewWechat(config)
  69. //微信公众平台
  70. mp, err := wc.MpMgr()
  71. if err != nil {
  72. return
  73. }
  74. ----
  75. === 3.开发消息服务器
  76. 将开发的消息服务器(http://your_domain/wx_server)接入到微信公众平台,有几个步骤
  77. 1. 接入你的消息服务器时,微信公众号后台,会发信息给你的服务器,来进行验证。所以你的服务器需要知道如何处理验证消息。
  78. 2. 微信公众平台与你的消息服务器之间通过消息通信来进行同步合作。所以你的消息服务器需要知道如何处理消息与如何发送消息。
  79. 本接口将复杂的过程(加密,打包,验证等等)封装了,让你只需要关心业务环节。
  80. 将以下的代码,加入到你的controller中,接口自动完成上面所说的两个功能,
  81. [IMPORTANT]
  82. 你的controller需要能接收GET与POST两种消息
  83. [source,go]
  84. ----
  85. wc := gowechat.NewWechat(config)
  86. //微信公众平台
  87. mp, err := wc.MpMgr()
  88. if err != nil {
  89. return
  90. }
  91. // 传入request和responseWriter
  92. msgHandler := mp.GetMsgHandler(c.Ctx.Request, c.Ctx.ResponseWriter)
  93. //设置接收消息的处理方法
  94. msgHandler.SetHandleMessageFunc(func(msg message.MixMessage) *message.Reply {
  95. switch msg.Event {
  96. case message.EventSubscribe:
  97. return c.handleSubscribe(&msg)
  98. case message.EventScan:
  99. return c.handleScan(&msg)
  100. case message.EventUnsubscribe:
  101. return c.handleUnsubscribe(&msg)
  102. case message.EventClick:
  103. return c.handleClick(&msg)
  104. case message.EventLocation:
  105. return c.handleLocation(&msg)
  106. }
  107. switch msg.MsgType {
  108. case message.MsgTypeText:
  109. //回复消息:演示回复用户发送的消息
  110. text := message.NewText(msg.Content)
  111. return &message.Reply{message.MsgTypeText, text}
  112. case message.MsgTypeImage:
  113. return c.handleImage(&msg)
  114. }
  115. //处理消息接收以及回复
  116. err = msgHandler.Handle()
  117. if err != nil {
  118. beego.Error(err)
  119. }
  120. })
  121. ----
  122. === 4.消息类型
  123. 消息分为以下几种:文本、图片、视频、声音、链接、坐标、图文、文章。
  124. ===== 文本消息
  125. [source,go]
  126. ----
  127. //回复消息:演示回复用户发送的消息
  128. text := message.NewText("your message want to be sent")
  129. return &message.Reply{message.MsgTypeText, text}
  130. ----
  131. ===== 图片消息
  132. [source,go]
  133. ----
  134. pic := message.NewImage("your_pic_mediaID")
  135. return &message.Reply{message.MsgTypeImage, pic}
  136. ----
  137. ===== 视频消息
  138. [source,go]
  139. ----
  140. video := message.NewVideo("your_mediaID", "your_title", "your_description")
  141. return &message.Reply{message.MsgTypeVideo, video}
  142. ----
  143. ===== 声音消息
  144. [source,go]
  145. ----
  146. voice := message.NewVoice("your_mediaID")
  147. return &message.Reply{message.MsgTypeVoice, voice}
  148. ----
  149. ===== 链接消息
  150. NOTE: 微信目前不支持回复链接消息
  151. ===== 坐标消息
  152. NOTE: 微信目前不支持坐标消息
  153. ===== 图文消息
  154. [source,go]
  155. ----
  156. news := message.NewNews([]*Article{message.NewArticle("your_title", "your_description", "your_picURL", "your_url")})
  157. return &message.Reply{message.MsgTypeNews, news}
  158. ----
  159. === 模板消息
  160. === 用户
  161. === 网页授权
  162. === JSSDK
  163. === 二维码
  164. === 菜单
  165. [[mch,mch]]
  166. == 微信支付(商户平台)
  167. === 1.接口参数
  168. [source,go]
  169. ----
  170. var config = wxcontext.Config{
  171. //微信公众平台,商户平台,需要填写的信息
  172. AppID: "your app id",
  173. AppSecret: "your app secret",
  174. Token: "your token",
  175. EncodingAESKey: "your encoding aes key",
  176. //------以下是 mch商户平台需要的变量
  177. //
  178. //证书公钥,路径,内容要保证只要有一项设置
  179. SslCertFilePath string //证书公钥文件的路径
  180. SslCertContent string //公钥证书的内容
  181. //私钥,路径,内容要保证只要有一项设置
  182. SslKeyFilePath string //证书私钥文件的路径
  183. SslKeyContent string //私钥证书的内容
  184. MchID string //商户ID
  185. MchAPIKey string //商户平台设置的api key
  186. //------ End 商户平台设置
  187. }
  188. ----
  189. === 2.接口参数创建接口
  190. [source,golang]
  191. ----
  192. wc := gowechat.NewWechat(config)
  193. //微信商户平台
  194. mch , err := wc.MchMgr()
  195. if err != nil {
  196. return
  197. }
  198. ----
  199. === 3.订单参数
  200. [source,golang]
  201. ----
  202. type OrderInput struct {
  203. OpenID string //trade_type=JSAPI时(即公众号支付),此参数必传,此参数为微信用户在商户对应appid下的唯一标识
  204. Body string //String(128)
  205. OutTradeNum string //String(32) 20150806125346 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一。
  206. TotalFee int //分为单位
  207. IP string
  208. NotifyURL string //异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数
  209. ProductID string //trade_type=NATIVE时(即扫码支付),此参数必传
  210. tradeType string //JSAPI,NATIVE,APP
  211. }
  212. ----
  213. === 4.订单参数创建支付数据
  214. [source,go]
  215. ----
  216. //接口参数
  217. wc := gowechat.NewWechat(config)
  218. //商户平台接口
  219. mch , err := wc.MchMgr()
  220. if err != nil {
  221. return
  222. }
  223. //订单参数
  224. var order pay.OrderInput
  225. order.OpenID = your_openID
  226. order.Body = "购物支付"
  227. order.OutTradeNum = your_trade_num
  228. order.TotalFee = your_fee
  229. order.IP = your_ip
  230. order.NotifyURL = your_notify_URL
  231. ----
  232. 公众号支付 H5中调用jssdk支付:
  233. [source,go]
  234. ----
  235. //公众号支付(jssdk支付数据)
  236. cfg, err := mch.GetPay().GetJsAPIConfig(order)
  237. ----
  238. 扫码支付:
  239. [source,go]
  240. ----
  241. qrcodeImageURL, err := mch.GetPay().GetNativePayQrcodePicURL(order)
  242. ----
  243. === 5.生成支付JS配置
  244. ==== 1.WeixinJSBridge:
  245. 支付数据,json格式,这些数据可以传递到前端模板中使用
  246. [source,go]
  247. ----
  248. //公众号支付(jssdk支付数据)
  249. cfg, err := mch.GetPay().GetJsAPIConfig(order)
  250. json := cfg.ToJSON()
  251. ----
  252. 前端的JS代码例子
  253. [source,javascript]
  254. ----
  255. ...
  256. WeixinJSBridge.invoke(
  257. 'getBrandWCPayRequest', {{$json}},
  258. function(res){
  259. if(res.err_msg == "get_brand_wcpay_request:ok" ) {
  260. // 使用以上方式判断前端返回,微信团队郑重提示:
  261. // res.err_msg将在用户支付成功后返回
  262. // ok,但并不保证它绝对可靠。
  263. }
  264. }
  265. );
  266. ...
  267. ----
  268. ==== 2.JSSDK:
  269. 支付数据,map格式,这些数据可以传递到前端模板中使用
  270. [source,go]
  271. ----
  272. //公众号支付(jssdk支付数据)
  273. cfg, err := mch.GetPay().GetJsAPIConfig(order)
  274. mapData := cfg.ToMap()
  275. ----
  276. 前端的JS代码例子
  277. [source,javascript]
  278. ----
  279. wx.chooseWXPay({
  280. timestamp: {{$timestamp}},
  281. nonceStr: {{$nonceStr}},
  282. package: {{$package}},
  283. signType: {{$signType}},
  284. paySign: {{$paySign}}, // 支付签名
  285. success: function (res) {
  286. // 支付成功后的回调函数
  287. }
  288. });
  289. ----
  290. === 6.支付通知
  291. 微信支付后,微信服务器会将支付结果回调到你的服务器,服务器地址是在订单参数中设置的NotifyURL,为了安全,过来的数据需要检验正确。
  292. [source,go]
  293. ----
  294. wc := gowechat.NewWechat(config)
  295. //微信商户平台
  296. mch , err := wc.MchMgr()
  297. if err != nil {
  298. return
  299. }
  300. //回调的数据检查,例子
  301. req := c.Ctx.Request
  302. data, err := ioutil.ReadAll(req.Body)
  303. if err != nil {
  304. return
  305. }
  306. isSuccess, err := mch.GetPay().CheckPayNotifyData(data)
  307. if err != nil {
  308. return
  309. }
  310. //成功后,你自己的处理
  311. ----
  312. === 订单
  313. ==== 统一下单
  314. ==== 查询订单
  315. 该接口提供所有微信支付订单的查询,商户可以通过该接口主动查询订单状态,完成下一步的业务逻辑。
  316. 需要调用查询接口的情况:
  317. * 当商户后台、网络、服务器等出现异常,商户系统最终未接收到支付通知;
  318. * 调用支付接口后,返回系统错误或未知交易状态情况;
  319. * 调用被扫支付API,返回USERPAYING的状态;
  320. * 调用关单或撤销接口API之前,需确认支付状态;
  321. ==== 关闭订单
  322. === 退款
  323. === 账单
  324. [[open,open]]
  325. == 开放平台
  326. [[corp,corp]]
  327. == 企业微信
  328. [[mini,mini]]
  329. == 小程序
  330. [[code,code]]
  331. == 贡献代码