laravel使用omnipay完成微信支付-PHP

Laravel  @amazeUI  2016-11-09 16:56:43

在laravel学院看到用omnipay-alipay支付完成这功能后,接着我开始做微信支付了,微信支付laravel学院也有写微信支付用的什么插件完成,不过使用的是overture,这应该叫项目名吧,官网和插件名好像是叫easywecha,对于做微信各方面功能来说都非常的强大,所以非常出名。不过在laravel学院中也提到了omnipay也提供了微信支付,因为没用过easywecha,只用过omnipay,所以我没有按照laravel学院使用overture,而是还是使用的omnipay里的插件omnipay-wechapay,在github找到了这个项目,发现支付宝的插件和微信插件的作者都是同一个人,因为使用过他做的支付宝插件,所以用微信的也还算得上有点经验,在做微信支付时得到了作者得热心帮助,在此深表感谢。如果有喜欢omnipay风格做微信或者支付宝支付的话可以去作者的github去看一下,有文档,链接地址附上:https://github.com/lokielse/omnipay-wechatpay

        具体配置可以参照laravel学院的支付宝支付章节,一个数组就是一个网关或者说是一种支付方式,要用微信支付的话,只需要在那配置文件中照着支付宝的做一个小数组就可以了。

我做的是微信扫码支付模式二,在pc端页面显示出一个含有订单信息的二维码,就可以拿起手机打开微信客户端扫码支付了,微信的扫码支付和支付宝的扫码支付不同,支付宝扫码支付成功后会跳转到支付宝的页面去,再通过你传的回调地址跳转回你自己的页面,微信扫码你支付完成后,页面不会有任何变化,再次扫二维码会在微信客户端提示你订单已经失效。微信支付的流程基本和支付宝一致,首先是在自己的服务器发送一个下单请求,经过重重验证通过后会返回给你一串数据,你拿到这串地址数据后,你要借助第三方的二维码制作的库显示出这个二维码,如果用原生的sdk就很简单了,sdk有提供一个第三方库供我们使用。但是我们需要安全可靠,且符合laravel风格代码好维护,在我们的项目中使用的第三方二维码库,就是使用的原生sdk里面的库。在laravel这个框架里想显示出二维码有个小坑,下面附上github代码加以解释。忘了说了,如果create方法不能正常使用,请用gateway!


        当你成功获取到微信返回回来的地址后,怎么将二维码在页面上输出呢,这时我们需要把官方sdk下载下来,里面有一个第三方的库叫phpqrcode.php,调用里面的一个方法png即可输出,我们可以先将此库require进控制器,再将getCodeurl返回回来的参数输入进去即可出来,但这地方有个小坑,png方法返回的是一个二进制流,你如果单纯的将它获取到再赋到模版上,图片是出不来的,不知道你们会不会遇到这个坑,但是这个坑可把我给坑惨了,经过同事们和我一下午的调试,发现你请求这个图片,它的响应头的响应类型居然是text/html!!!!正常的应该是图片才对啊,最后折中给它解决掉了,如果你也遇到了这个问题,可以去看一下Laravel学院基础篇的http响应篇章。解决办法如下:

                   将getCodeurl丢进urlencode函数里加密,赋到模版上去,然后再在控制器里做一个方法,在路由器里做一条可以传参的路由可以使用post,我是用的any,对应这个方法。在模版里的img标签中的src属性中调用这条路由将,加密过后的参数丢到这路由里面去。这条路由对应的方法里面写return response(\QRcode::png(urldecode($pngcode)), 200)->header('Content-Type', "image/png")即可。经测试也可以用dd函数,dd函数似乎可以识别数据类型再以对应类型给予响应。到此微信的下单请求就结束了,比支付宝的操作还是麻烦些。下面来说回调。

        支付成功后支付宝会返回一段xml格式到你的服务器上,你要判断是否成功,然后给予微信想要的响应,官方的说法是会间隔一小段时间重复调用你的回调路由,所以,如果你有对订单进行状态改变的话,最好在回调方法开始时,就找到这一条订单查询状态如果状态已改变则直接返回成功,否则判定为第一次回调,完成自己的逻辑。

        我不知道omnipay-wechapay有没有可以直接让我们调用的解析xml转数组的方法,我找了一圈似乎没有,还好找了一圈,发现wechapay内部是有这个方法的,可惜是用在其他地方,幸好这个方法只有一句话,略加改造即可自己使用:$xml_array = json_decode(json_encode(simplexml_load_string($GLOBALS['HTTP_RAW_POST_DATA'], 'SimpleXMLElement', LIBXML_NOCDATA)), true);回调的调试方法最好是写日志。回调流程怎么做具体还是去看github的官方文档,会有大致流程,返回给微信服务器的也需要xml格式,可以去插件里面找array2xml,丢到自己控制器里面来直接调用就可以了。再次感谢laravel学院和插件作者。最后强调一点,composer最好不要update,哪个插件要更新就单独更新就好了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容