正文
起因
前段时间因为项目中需要实现支付宝手机网站支付功能,所以写下这篇文章以作记录,不足之处,欢迎指教。
后端框架:Laravel 5.5
业务功能
适用于商家在移动端网页应用中集成支付宝支付功能。商家在网页中调用支付宝提供的网页支付接口调起支付宝客户端内的支付模块,商家网页会跳转到支付宝中完成支付,支付完后跳回到商家网页内,最后展示支付结果。若无法唤起支付宝客户端,则在一定的时间后会自动进入网页支付流程。
一. 创建应用
链接:
支付宝蚂蚁金服开放平台
注意:
-
需拥有实名认证的支付宝账户。
-
企业或个体工商户可申请
-
需要有真实有效的营业执照,切网站必须通过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是配置文件:
<?php
$config = array (
//应用ID,您的APPID。
'app_id' => "",
//商户私钥,您的原始格式RSA私钥
'merchant_private_key' => "",
//异步通知地址
'notify_url' => "",
//http://工程公网访问地址/alipay.trade.wap.pay-PHP-UTF-8/notify_url.php
//同步跳转
'return_url' => "",
//http://mitsein.com/alipay.trade.wap.pay-PHP-UTF-8/return_url.php
// jk.mrwangqi.com
//编码格式
'charset' => "UTF-8",
//签名方式
'sign_type'=>"RSA2",
//支付宝网关
'gatewayUrl' => "https://openapi.alipay.com/gateway.do",
//支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
'alipay_public_key' => "",
);
配置完成后,修改demo权限
sudo chmod -R 777 alipayDemo
访问demo下的index.php
这样子这个demo就可以运行了。
具体开发
现在下载SDK:
支付宝手机网站支付PHP SDK
一. 引入SDK包
在laravel中引入SDK包的步骤:
-
在app/新建libs文件夹,将SDK包放在该目录下
2. 找到根目录下的composer.json文件,添加如下配置:
"autoload": {
"classmap": [
"database",
"app/libs/alipay" //这里是自定义包的文件位置,我将我项目中的该SDK包命名为alipay
],
"psr-4": {
"App\\": "app/"
}
},
3. 执行以下命令
composer dump-autoload //当在包中加入新的类,需要更新autoloader
二. 移动/新建文件
在alipay目录下新建wappay目录,在wappay目录下新建buildermodel和service两个目录。将上面demo目录下的wappay/buildermodel/AlipayTradeWapPayContentBuilder.php和 wappay/service/AlipayTradeService.php两个文件分别复制到自己项目SDK包中新建的wappay中的相应目录下。
AlipayTradeWapPayContentBuilder.php是alipay demo对支付宝手机网站支付接口业务参数的封装。AlipayTradeService.php是alipay demo对支付宝手机网站支付接口业务功能的封装。
在SDK目录下新建log.txt。作为支付宝支付日志存放文件
三. 设置/引入命名空间
对AlipayTradeWapPayContentBuilder.php和AlipayTradeService.php设置命名空间,我设置的是
namespace App\libs\alipay\wappay\buildermodel;
namespace App\libs\alipay\wappay\buildermodel;
对alipay/aop/request/AlipayTradeWapPayRequest.php和alipay/aop/AopClient.php设置命名空间,我设置的是:
namespace App\libs\alipay\aop\request;
namespace App\libs\alipay\aop;
在AlipayTradeWapPayContentBuilder.php中引入上面两个命名空间:
use App\libs\alipay\aop\request\AlipayTradeWapPayRequest;
use App\libs\alipay\aop\AopClient;
将AlipayTradeService.php中的下面代码注释:
// require_once dirname ( __FILE__ ).DIRECTORY_SEPARATOR.'./../../AopSdk.php';
// require dirname ( __FILE__ ).DIRECTORY_SEPARATOR.'./../../config.php';
四. 配置config(alipay.php)
在上面中alipay的demo中是有一个config.php文件作为配置文件的,这里我们不需要这个文件,我们利用laravel的特性,在laravel项目目录下的config目录新建一个alipay.php:
return [
//应用ID,您的APPID。
'app_id' => "",
//商户私钥,您的原始格式RSA私钥
'merchant_private_key' => "",
//异步通知地址
'notify_url' => "",
//http://工程公网访问地址/alipay.trade.wap.pay-PHP-UTF-8/notify_url.php
//同步跳转
'return_url' => "",
//http://mitsein.com/alipay.trade.wap.pay-PHP-UTF-8/return_url.php
// jk.mrwangqi.com
//编码格式
'charset' => "UTF-8",
//签名方式
'sign_type'=>"RSA2",
//支付宝网关
'gatewayUrl' => "https://openapi.alipay.com/gateway.do",
//支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
'alipay_public_key' => "",
];