php实现的支付宝网页支付功能示例【基于TP5框架】
本文实例讲述了php实现的支付宝网页支付功能。分享给大家供大家参考,具体如下:
1.提交支付请求
require_once'./payment/zfb/pagepay/service/AlipayTradeService.php';
require_once'./payment/zfb/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php';
$payInfo=Db::name('pay_type')->where(['pay_id'=>1])->find();
$zfb=json_decode($payInfo['pay_json'],true);
$config=[
'app_id'=>$zfb['app_id'],
'merchant_private_key'=>$zfb['merchant_private_key'],
'notify_url'=>config('z_notify_url'),
'return_url'=>config('z_return_url'),
'charset'=>config('charset'),
'sign_type'=>config('sign_type'),
'gatewayUrl'=>config('gatewayUrl'),
'alipay_public_key'=>$zfb['alipay_public_key']
];
//商品订单号
$out_trade_no=$orderData['order_number'];
//订单名称,必填
$subject='充值订单';
//付款金额
$total_amount=$money;
//商品描述
$body=$out_trade_no.'-'.$this->agent_id.'-'.$money;
$payRequestBuilder=new\AlipayTradePagePayContentBuilder();
$payRequestBuilder->setBody($body);
$payRequestBuilder->setSubject($subject);
$payRequestBuilder->setTotalAmount($total_amount);
$payRequestBuilder->setOutTradeNo($out_trade_no);
$aop=new\AlipayTradeService($config);
$response=$aop->pagePay($payRequestBuilder,$config['return_url'],$config['notify_url']);
echo$response;
2.异步回调支付宝参数认证
$pay=Db::name('pay_type')->where(['pay_id'=>1])->find();
$zfb=json_decode($pay['pay_json'],true);
$config=[
'app_id'=>$zfb['app_id'],
'merchant_private_key'=>$zfb['merchant_private_key'],
'notify_url'=>config('z_notify_url'),
'return_url'=>config('z_return_url'),
'charset'=>config('charset'),
'sign_type'=>config('sign_type'),
'gatewayUrl'=>config('gatewayUrl'),
'alipay_public_key'=>$zfb['alipay_public_key']
];
$arr=$_POST;
$alipaySevice=new\AlipayTradeService($config);
$alipaySevice->writeLog(var_export($_POST,true));
$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){//验证成功
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//请在这里加上商户的业务逻辑程序代
//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
//获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
//商户订单号
$out_trade_no=$_POST['out_trade_no'];
//支付宝交易号
$trade_no=$_POST['trade_no'];
//交易状态
$trade_status=$_POST['trade_status'];
//交易金额
$total_amount=$_POST['total_amount'];
if($_POST['trade_status']=='TRADE_FINISHED'){
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//请务必判断请求时的total_amount与通知时获取的total_fee为一致的
//如果有做过处理,不执行商户的业务程序
//注意:
//退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
}elseif($_POST['trade_status']=='TRADE_SUCCESS'){
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//请务必判断请求时的total_amount与通知时获取的total_fee为一致的
//如果有做过处理,不执行商户的业务程序
//注意:
//付款完成后,支付宝系统发送该交易状态通知
//此处应该更新一下订单状态,商户自行增删操作
这里写你的逻辑程序
}
//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
echo'success';
}else{
//验证失败
echo"fail";
}
}
3.同步回调页面跳转处理 同步只是做一个跳转处理不要写任何数据处理
$pay=Db::name('pay_type')->where(['pay_id'=>1])->find();
$zfb=json_decode($pay['pay_json'],true);
$config=[
'app_id'=>$zfb['app_id'],
'merchant_private_key'=>$zfb['merchant_private_key'],
'notify_url'=>config('z_notify_url'),
'return_url'=>config('z_return_url'),
'charset'=>config('charset'),
'sign_type'=>config('sign_type'),
'gatewayUrl'=>config('gatewayUrl'),
'alipay_public_key'=>$zfb['alipay_public_key']
];
$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){//验证成功
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//请在这里加上商户的业务逻辑程序代码
//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表
//商户订单号
$out_trade_no=htmlspecialchars($_GET['out_trade_no']);
//支付宝交易号
$trade_no=htmlspecialchars($_GET['trade_no']);
$this->success("支付成功",url('Index/index'));
//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
else{
//验证失败
echo"验证失败";
}
更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《ZendFrameWork框架入门教程》及《PHP模板技术总结》。
希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。