php 支付宝沙箱支付
如果是个人测试时只需要更改alipay/config.php内的商户私钥,同步跳转,app_id,支付宝网关和支付宝公钥。
注:public下加入第三方文件
更改alipay/aop/AopClient.php 的第413行为:
foreach ($para_temp as $key => $val)
跳转支付
/**
* pbcrol1848@sandbox.com
* 支付
* @throws Exception
*/
public function pay()
{
//订单号、支付方式
$order_number = \request()->post('order_number');
$pay_type = \request()->post('pay_type','ali');
try {
if (!is_numeric($order_number)){
throw new Exception('支付失败');
}
//查询订单信息
$order_info = \app\home\model\Order::where('order_sn',$order_number)->find()->toArray();
if ($order_info['order_status'] == 1){
throw new Exception('订单已支付');
}
if (time() - strtotime($order_info['create_time']) > 9000){
throw new Exception('订单超时,请重新下单');
}
//判断支付方式
switch($pay_type){
case 'alipay':
require_once './alipay/pagepay/service/AlipayTradeService.php';
require_once './alipay/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php';
require_once "./alipay/config.php";
//商户订单号,商户网站订单系统中唯一订单号,必填
$out_trade_no = $order_info['order_sn'];
//订单名称,必填
$subject = '品优购电商下单';
//付款金额,必填
$total_amount = $order_info['goods_price'];
//商品描述,可空
$body = '品优购购买商品';
//构造参数
$payRequestBuilder = new \AlipayTradePagePayContentBuilder();
$payRequestBuilder->setBody($body);
$payRequestBuilder->setSubject($subject);
$payRequestBuilder->setTotalAmount($total_amount);
$payRequestBuilder->setOutTradeNo($out_trade_no);
$aop = new \AlipayTradeService($config);
/**
* pagePay 电脑网站支付请求
* @param $builder 业务参数,使用buildmodel中的对象生成。
* @param $return_url 同步跳转地址,公网可以访问
* @param $notify_url 异步通知地址,公网可以访问
* @return $response 支付宝返回的信息
*/
$response = $aop->pagePay($payRequestBuilder,$config['return_url'],$config['notify_url']);
//输出表单
var_dump($response);
case 'wechat':
//微信支付
break;
default:
break;
}
}catch (Exception $exception){
throw new Exception($exception->getMessage());
}
}
支付宝同步回调
/**
* 同步回调
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\View\View|\think\response\View
* @throws \Exception
*/
public function callback()
{
require_once './alipay/pagepay/service/AlipayTradeService.php';
require_once './alipay/config.php';
// $config = config('pay.pay_config.ali');
$arr=$_GET;
$alipaySevice = new \AlipayTradeService($config);
$result = $alipaySevice->check($arr);
/* 实际验证过程建议商户添加以下校验。
1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)
4、验证app_id是否为该商户本身。
*/
if($result) {//验证成功
//2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
$total_price = $_GET['total_amount'];
// dd($total_price);
return view('order/paysuccess',['total_price'=>$total_price]);
}
else {
//验证失败
return view('order/payfail');
}
}
/**
* 异步回调
* @return string|void
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function alinotify()
{
$params = \request()->post();
//判断商品是否处理过
$order_status = \app\home\model\Order::find($params['out_trade_no']);
if ($order_status['order_status'] > 0){
return '订单已处理过';
}
Db::name('pay_log')->insert([
'order_sn' => $params['out_trade_no'],
'json' => json_encode($params),
'create_time' => time(),
]);
$result = true;
/* 实际验证过程建议商户添加以下校验。
1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)
4、验证app_id是否为该商户本身。
*/
if($result) {
if($_POST['trade_status'] == 'TRADE_FINISHED') {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//请务必判断请求时的total_amount与通知时获取的total_fee为一致的
//如果有做过处理,不执行商户的业务程序
//注意:
//退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
}
else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//请务必判断请求时的total_amount与通知时获取的total_fee为一致的
//如果有做过处理,不执行商户的业务程序
//注意:
//付款完成后,支付宝系统发送该交易状态通知
\app\home\model\Order::where('id',$params['out_trade_no'])->update([
'order_status' => 1,
'pay_time' => time()
]);
}
echo "success"; //请不要修改或删除
}else {
//验证失败
echo "fail";
}
}
本作品采用《CC 协议》,转载必须注明作者和本文链接