前因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。就这么解决了,蛋疼啊