支付宝支付接口
- 常见支付方式:微信支付、支付宝支付、银行卡支付。
- 支付宝支付接口的类型:(商家的集成方案)
- 担保交易接口 用户支付的资金先进入担保账户,确认收货后才进入商家的账户
- 即时到帐接口 用户支付的资金立即进入商家账户
- 担保交易接口在2016年8月已经停止申请。
支付宝支付流程:
1.创建应用(企业身份正式环境)
1支付宝开放平台:https://open.alipay.com/
2使用自己的账号登录
3创建应用
4添加能力-电脑网站支付
5 签约:需要审核 需要填写 个体工商户信息 ,个人身份无法继续签约。
2.沙箱应用(个人开发者测试环境)
支付宝为没有个体商户资质的开发测试人员提供了一个测试环境,即沙箱应用。
在沙箱环境可以看到appid、测试支付宝网关、密钥信息
APPID:2016080500173923
支付宝网关(gateway):https://openapi.alipaydev.com/gateway.do
秘钥(公钥、私钥):需要自行生成
在沙箱帐号 里边可以看到 商家信息 和 买家信息
进行付款的时候,就使用买家帐号
3.配置秘钥
4.SDK的下载与配置
SDK(software development kit),软件开发工具包,简单来说就是一些demo示例代码文件。
支付宝提供了一套demo文件,可以通过下载SDK拿到
https://docs.open.alipay.com/270/106291/
下载解压
config.php: 配置文件,配置支付宝参数
index.php: demo示例文件(支付宝效果体现)
notify_url.php: 异步回调地址(通知页面),支付宝以post隐藏方式向商家发起请求,该方式请求安全,用于处理业 务逻辑:比如商家在该请求里可以修改订单状态
return_url.php: 同步回调地址(通知页面),支付宝通过get显示方式向商家发起请求,该方式请求不安全,用于页 面展示
SDK&DEMO的使用:
把解压后的目录移动到项目目录中的public/plugins目录并改名为alipay
通过浏览器直接访问
点击付款
会跳转页面报错,需要先配置支付宝参数
设置方式:
从沙箱应用页面,获取到APPID, 支付宝网关,支付宝公钥
配置秘钥时生成的商户私钥
配置到public/plugins/alipay/config.php中
说明:notify_url 是用来提供给支付宝服务端调用的,必须是外网可以访问的路径
Return_url是用来页面同步跳转成功页面,是由浏览器跳转,原则上必须是外网可以访问的路径,这里测试可以使用本地的地址,也能跳转成功。
在浏览器重新访问
点击付款,会跳转到支付宝支付页面如下:
each函数过时了,被废除了,替换成foreach
输入账号密码: 沙箱测试提供的买家账号密码
跳转到同步回调地址:
同时会携带很多参数在url中
5.项目集成支付宝
页面编写隐藏表单用于点击立即支付后的页面跳转和数据提交
数据提交到支付处理程序
curl函数的说明
这里需要注意的是:要想以 x-www-form-urlencoded 方式发送,最关键是发送的数据格式。
方式from-data试发送的数据用的是array格式,而方式为 x-www-form-urlencoded 时需要用key=value&key2=value2的格式发送,发送的是string型的数据。
比如我上面from-data数据的为:
$data = [
'username' => '小明',
'age' => '18'
];
x-www-form-urlencoded时的数据则要变为
http_build_query($data);
$headers = array('Content-Type: application/x-www-form-urlencoded');
function curl($url,$data,$headers){ $curl = curl_init(); // 启动一个CURL会话 curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); // 从证书中检查SSL加密算法是否存在 curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器 curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转 curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求 curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data)); // Post提交的数据包 curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环 curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回 curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); $result = curl_exec($curl); // 执行操作 if (curl_errno($curl)) { echo 'Errno'.curl_error($curl);//捕抓异常 } curl_close($curl); // 关闭CURL会话 echo($result); }
交易完成,跳到回调页面,修改回调地址 进行签名验证,数据校验
参考return_url.php代码
public function callback(){ require_once("./plugins/alipay/config.php"); require_once './plugins/alipay/pagepay/service/AlipayTradeService.php'; $all = request()->all(); $alipaySevice = new \AlipayTradeService($config); $result = $alipaySevice->check($all); if($result){ $total_amount = $all["total_amount"]; return view("payok",["total_amount"=>$total_amount]); }else{ return view("payfail"); } // 等着支付宝给我跳回来 get // dd(request()->all()); // $all = request()->all(); }
再次支付
alipay定义了和laravel框架意义的同名函数,建议修改Alipay函数名即可
修改文件 /plugins/alipay/aop/AopEncrypt.php 第15行,第30行
修改文件 /plugins/alipay/lotusphp_runtime/Cookie/Cookie.php
再次支付