前因php
原本咱們的小程序用的好好的,結果忽然有一天,微信就把小程序的ios端的虛擬支付給關了。。。坑爹啊!搞的安卓端的能夠支付,ios的支付不了。因而就在網上找解決辦法。html
一說經過app跳轉支付,總不能爲了個ios的支付再去整個app吧……( ̄▽ ̄)"ios
二是把虛擬支付搞成實體商品,線下發貨。小本經營,搞不起搞不起……ε=ε=ε=(~ ̄▽ ̄)~web
三是免費。wqndy……( o=^•ェ•)o ┏━┓數據庫
四是經過公衆號支付。(o゚v゚)ノ小程序
那確定是四沒跑了。可是這是第一篇,沒有代碼!(。^▽^) 還在測試呢api
思路安全
要在公衆號支付,其實咱們想到的就是使用公衆號的H5支付。那麼怎麼經過小程序到公衆號的H5又是個問題。直接用小程序的webview很顯然是不行的,是真的不行,試過了(lll¬ω¬)。咱們確定是想經過小程序直接跳轉到公衆號實現支付,這樣體驗還稍微,我是說稍微會好點。好吧,不廢話,直接說咱們的方案。服務器
模板消息微信
對的對的,小程序端點購買,而後給公衆號發一條模板消息,經過模板消息進入到支付界面,實現購買,購買成功以後,點擊模板消息再回到小程序。emmm……好吧,我認可這圈子繞的不是通常的大。不知道各位有沒有更好的辦法(真心求教啊!!!),反正我是沒有了。。。爲了實現這東西差點沒把我繞死。。。
小程序給公衆號發模板消息
根據微信公衆號官方文檔能夠看出,https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277,(本身看,懶得截圖)像不少參數是能夠肯定的,不怎麼會變的,好比access_token啊,template_id啊,url啊之類的,惟一的一個就是touser(接受者的openid)也就是說咱們要在小程序端獲取公衆號的openid。怎麼獲取?
公衆號靜默受權
是的,經過公衆號的靜默受權。我這不是爲了格式美觀嘛!(●ˇ∀ˇ●),爲啥不是以snsapi_userinfo爲scope發起的網頁受權呢,由於用戶體驗啊,你在小程序裏面你試試還讓用戶點下贊成登錄xx公衆號試試……嗯哼,咋的靜默呢,經過webview啊,而後靜默受權完以後還能直接回來小程序的上一級頁面呢,就是會忽然白屏( ̄▽ ̄)",那你就受權頁那邊加點東西好了,咱們就是加了支付的引導頁,勉強不會以爲太坑。哦,對,受權,你得先把公衆號的受權域名設置好!否則什麼都是白搭啊。哦哦,還有小程序的webview自動返回,能夠參考官方文檔的https://developers.weixin.qq.com/miniprogram/dev/component/web-view.html 的wx.miniProgram.getEnv和wx.miniProgram.navigateBack方法,一個檢測環境是否是小程序,一個回退。好的,經過靜默受權,咱們就拿到了openid了,咱們就能夠發送模板消息了,好,假設咱們發送出去了。。。( ̄︶ ̄)↗ ,而後你會發現其實並無。爲啥?哦哦,用戶沒關注公衆號。哈哈哈哈ヾ(≧▽≦*)o爽不爽~那沒關注公衆號你確定發不出去啊,那就存起來唄,先存到數據庫,而後引導用戶關注,經過用戶關注事件推送的消息,你又拿到用戶的openid了,而後去數據庫查,很顯然,確定是拿最新的一條消息做爲再次發送模板消息的參數了,畢竟你也只有一個openid的參數是否是~好,此次真的發送出去了!
公衆號
首先你的公衆號得申請開發者吧,得配置服務器域名吧,既然要支付,得配置公衆號JS安全域名吧,順便再把業務域名也配置了唄。🆗,準備就緒!
而後你要寫接受事件推送,仍是關注事件的推送,而後查庫,而後掉髮送模板消息接口。
再而後,點擊模板消息,模板消息的url參數對應的頁面確定是在JS安全域名對應的網站上的。經過url的上代的參數,能夠把訂單的一些信息帶過來,而後你獲取微信JSAPI權限,還要獲取JSAPI支付接口參數。看文檔https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115 照着來就行。支付參數裏面有一個須要調公衆號統一下單的接口,仍是看文檔https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1 ,啊,終於能夠支付了。支付成功以後,關掉頁面,而後公衆號再推送一條模板消息,而後你一點這個模板消息你就又回到了小程序(參數上面的有說文檔地址)。
總結
整個思路大概就是這樣。固然中間的過程對咱們來講仍是挺曲折的,要對公衆號作開發者認證,認證了要作支付網頁,要作接受事件推送的接口,要申請公衆號的微信支付,那麼又須要有微信商戶號,而後又是一大堆認證,就爲了得到商戶id和API的key等等等等。好在如今進入測試階段了。
好,我還專門畫了個圖
後記:
emmmm……事實上,咱們找到了一個很是簡單的方法解決這個問題了。賊雞兒簡單……後臺寫個開關方法(就是寫個方法返回個false),在小程序的支付以前加上這個方法,發佈以前是fale,發佈以後改後臺返回true。就這麼解決了,蛋疼啊