2020-01-14

laravel5.7实现支付宝网页支付功能

后端框架:Laravel 5.7


业务功能

适用于商家在网页应用中集成支付宝支付功能。商家在网页中调用支付宝提供的网页支付接口调起支付宝客户端内的支付模块,商家网页会跳转到支付宝中完成支付,支付完后跳回到商家网页内,最后展示支付结果。若无法唤起支付宝客户端,则在一定的时间后会自动进入网页支付流程。

一. 创建应用

链接:支付宝蚂蚁金服开放平台

注意:

需拥有实名认证的支付宝账户。

企业或个体工商户可申请

需要有真实有效的营业执照,切网站必须通过ICP备案

进入蚂蚁金服开放平台->开发者中心->网页&移动应用。按需求创建应用,在这里我创建的是网页/移动类应用

创建完成后提交审核,大部分应用需要签约后才能使用,签约需要营业执照。


二. 配置应用环境

配置完成后,可提交审核,开发者点击提交审核后,预计会有一个工作日的审核时间。应用上线成功后,状态变为以上线,该状态下的应用能够调用生产环境的接口。


三. 接口调用配置

目前laravel中集成alipay SDK的支付接口很丰富。常用的有下面几种:

OmniPay-laravel:github OmniPay-laravel链接

latrell/alipay:github latrell/alipay链接

...

因为项目的需要,在这里我采用的是alipay的原生SDK包。

首先下载PHP版本的Demo:支付宝手机网站支付PHP demo

从index.php中可以看出该demo支持以下功能

手机网站2.0支付(接口名:alipay.trade.wap.pay)

手机网站2.0订单查询 (接口名:alipay.trade.query)

手机网站2.0订单退款  (接口名:alipay.trade.refund)

手机网站2.0订单退款查询(接口名:alipay.trade.fastpay.refund.query)

手机网站2.0账单下载(接口名:alipay.data.dataservice.bill.downloadurl.query)

其中config.php是配置文件:

配置完成后,修改demo权限

sudo chmod -R777alipayDemo

访问demo下的index.php

这样子这个demo就可以运行了。

具体开发

现在下载SDK:支付宝手机网站支付PHP SDK

一.  引入SDK包

        在laravel中引入SDK包的步骤:

在app/新建libs文件夹,将SDK包放在该目录下

2.   找到根目录下的composer.json文件,添加如下配置:

            "app/libs/alipay"//这里是自定义包的文件位置,我将我项目中的该SDK包命名为alipay  , 


        3.   执行以下命令

             打开cmd, 在项目的根目录下执行:composer dump-autoload    //当在包中加入新的类,需要更新autoloader 

二.  移动/新建文件

在alipay目录下新建pagepay目录,在pagepay目录下新建buildermodel和service两个目录。将上面demo目录下的pagepay/buildermodel/AlipayTradePagePayContentBuilder.php和pagepay/service/AlipayTradeService.php两个文件分别复制到自己项目SDK包中新建的pagepay中的相应目录下。

AlipayTradePagePayContentBuilder.php是alipay demo对支付宝手机网站支付接口业务参数的封装。AlipayTradeService.php是alipay demo对支付宝手机网站支付接口业务功能的封装。

在SDK目录下新建log.txt。作为支付宝支付日志存放文件


三.  设置/引入命名空间

1、对AlipayTradePagePayContentBuilder.php和AlipayTradeService.php设置命名空间,我设置的分别是:

        namespace App\libs\alipay\pagepay\buildermodel;

        namespace App\libs\alipay\pagepay\service;

2、对alipay/aop/request/AlipayTradePagePayRequest.php和alipay/aop/AopClient.php设置命名空间,我设置的分别是:

        namespace App\libs\alipay\aop\request;

        namespaceApp\libs\alipay\aop;

3、在AlipayTradePagePayContentBuilder.php中引入上面两个命名空间:

        use App\libs\alipay\aop\request\AlipayTradePagePayRequest;

        use App\libs\alipay\aop\AopClient;


4、将AlipayTradeService.php中的下面代码注释 和引入上面两个命名空间::

   // require_once dirname(dirname(dirname ( __FILE__ ))).'/AopSdk.php';

   use App\libs\alipay\aop\request\AlipayTradePagePayRequest;

   use App\libs\alipay\aop\AopClient;


四.  配置config(alipay.php)

在上面中alipay的demo中是有一个config.php文件作为配置文件的,这里我们不需要这个文件,我们利用laravel的特性,在laravel项目目录下的config目录新建一个alipay.php:

五.  对应config修改函数

在alipay.php中进行配置支付接口所需参数。下面我们修改alipay/wappay/service/AlipayTradeService.php:

其他接口暂时用不到,所以在这里我将其隐去。


六.  新建控制器(AlipayController)

      php artisan make:controller AlipayController


因为需要实现网站支付,所以需要定义支付接口:

七.  定义路由

定义支付路由及同步和异步回调路由,注意的一点是同步路由是GET形式调用,而异步路由是POST形式调用,设置时要注意:

要注意的一点是同步路由是GET形式调用,而异步路由是POST形式调用,在调用支付接口的时候会出现CSRF错误,现在最简单的方法是利用laravel的中间件避免CSRF,在app/Http/Middleware/VerifyCsrfToken.php中增加路由

八.  修改冲突

这时就可以通过定义路由进行调用支付接口,但是在调用时会报下面这个错误:

Cannot redeclare Encrypt() (previously declaredin.../vendor/laravel/lumen-framework/src/helpers.php:126)//或:Cannot redeclare Decrypt() (previously declaredin.../vendor/laravel/lumen-framework/src/helpers.php:126)


这是因为Laravel 5使用Alipay SDK时,Laravel内带的加密解密函数Encrypt()/Decrypt()函数和Alipay SDK中的加密解密函数Encrypt()/Decrypt()函数命名冲突

解决方法:只需修改Alipay SDK中定义的函数名称,修改引用的函数名称。

修改步骤:

    在Alipay SDK中,一共有需要修改一个文件的内容:

       aop/AopEncrypt.php

在文件中查找encrypt/decrypt替换为alipayEncrypt/alipayDecrypt即可。

注:如果服务器是在Linux下,可能会报一个没有权限的错误,这是因为我们之前在SDK包中新建了一个log.txt,在alipay/pagepay/service/AlipayTradeService.php中的writeLog()函数中向该文件写入支付日志时没有写入权限,给它个权限就好了。

结束

到此,在Laravel中支付宝网站支付功能就实现了,不足之处,欢迎请教。

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