前因
本來我們的小程序用的好好的,結果突然有一天,微信就把小程序的ios端的虛擬支付給關了。。。坑爹啊!搞的安卓端的可以支付,ios的支付不了。於是就在網上找解決辦法。
一說通過app跳轉支付,總不能為了個ios的支付再去整個app吧……( ̄▽ ̄)"
二是把虛擬支付搞成實體商品,線下發貨。小本經營,搞不起搞不起……ε=ε=ε=(~ ̄▽ ̄)~
三是免費。wqndy……( o=^•ェ•)o ┏━┓
四是通過公眾號支付。(o゚v゚)ノ
那肯定是四沒跑了。但是這是第一篇,沒有代碼!(。^▽^) 還在測試呢
思路
要在公眾號支付,其實我們想到的就是使用公眾號的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。就這么解決了,蛋疼啊