博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
支付宝pc端支付接入PHP实现
阅读量:6387 次
发布时间:2019-06-23

本文共 6198 字,大约阅读时间需要 20 分钟。

引入支付宝接口

422101-20160906160602691-1623078457.png

放入一个插件库中,方便管理

创建支付类

1.发起支付

public function init() {    $order_id   = $_REQUEST['order_id'];    $order_info = $this->order_db->get_one(array('id'=>$order_id));    $product_info = $this->product_db->get_one(array('id'=>$order_info['product_id']));    // 发起支付宝支付    require_once("./phpcms/plugin/alipay/alipay.config.php");    require_once("./phpcms/plugin/alipay/lib/alipay_submit.class.php");    /**************************请求参数**************************/    //商户订单号,商户网站订单系统中唯一订单号,必填    $out_trade_no = $order_info['orderno']; // 订单orderno    //订单名称,必填    $subject = '预订'.$product_info['name'].'订单';        // 订单名称    //付款金额,必填    $total_fee = $order_info['payprice'];   // 订单金额    //商品描述,可空    $body = $product_info['name']; // 可空    /************************************************************/    //构造要请求的参数数组,无需改动    $parameter = array(        "service"       => $alipay_config['service'],        "partner"       => $alipay_config['partner'],        "seller_id"     => $alipay_config['seller_id'],        "payment_type"  => $alipay_config['payment_type'],        "notify_url"    => $alipay_config['notify_url'],        "return_url"    => $alipay_config['return_url'],        "anti_phishing_key"=>$alipay_config['anti_phishing_key'],        "exter_invoke_ip"=>$alipay_config['exter_invoke_ip'],        "out_trade_no"  => $out_trade_no,        "subject"   => $subject,        "total_fee" => $total_fee,        "body"  => $body,        "_input_charset"    => trim(strtolower($alipay_config['input_charset']))        //其他业务参数根据在线开发文档,添加参数.文档地址:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.kiX33I&treeId=62&articleId=103740&docType=1        //如"参数名"=>"参数值"     );    //建立请求    $alipaySubmit = new AlipaySubmit($alipay_config);    $html_text = $alipaySubmit->buildRequestForm($parameter,"get", "确认");    echo $html_text;}

2.处理支付后的动作,比如更改订单状态为支付,跳转到支付成功页面等等

a.处理同步通知

// 同步通知处理public function return_url() {    $this->ilog_db->addLog('return_url');    require_once("./phpcms/plugin/alipay/alipay.config.php");    require_once("./phpcms/plugin/alipay/lib/alipay_notify.class.php");    //计算得出通知验证结果    $alipayNotify = new AlipayNotify($alipay_config);    $verify_result = $alipayNotify->verifyReturn();    if($verify_result) {
//验证成功 / //请在这里加上商户的业务逻辑程序代码 //——请根据您的业务逻辑来编写程序(以下代码仅作参考)—— //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表 //商户订单号 $out_trade_no = $_GET['out_trade_no']; //支付宝交易号 $trade_no = $_GET['trade_no']; //交易状态 $trade_status = $_GET['trade_status']; if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') { //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 } else { echo "trade_status=".$_GET['trade_status']; } //——请根据您的业务逻辑来编写程序(以上代码仅作参考)—— $this->_afterPay($out_trade_no); } else { //验证失败 //如要调试,请看alipay_notify.php页面的verifyReturn函数 echo "验证失败"; } }

b.处理异步通知

// 异步通知处理public function notify_url() {    $this->ilog_db->addLog('notify_url');    require_once("./phpcms/plugin/alipay/alipay.config.php");    require_once("./phpcms/plugin/alipay/lib/alipay_notify.class.php");    //计算得出通知验证结果    $alipayNotify = new AlipayNotify($alipay_config);    $verify_result = $alipayNotify->verifyNotify();    if($verify_result) {
//验证成功 / //请在这里加上商户的业务逻辑程序代 //——请根据您的业务逻辑来编写程序(以下代码仅作参考)—— //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表 //商户订单号 $out_trade_no = $_POST['out_trade_no']; //支付宝交易号 $trade_no = $_POST['trade_no']; //交易状态 $trade_status = $_POST['trade_status']; if($_POST['trade_status'] == 'TRADE_FINISHED') { //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的 //如果有做过处理,不执行商户的业务程序 //注意: //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知 //调试用,写文本函数记录程序运行情况是否正常 //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录"); } else if ($_POST['trade_status'] == 'TRADE_SUCCESS') { //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的 //如果有做过处理,不执行商户的业务程序 //注意: //付款完成后,支付宝系统发送该交易状态通知 //调试用,写文本函数记录程序运行情况是否正常 //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录"); } //——请根据您的业务逻辑来编写程序(以上代码仅作参考)—— $this->_afterPay($out_trade_no); } else { //验证失败 echo "fail"; //调试用,写文本函数记录程序运行情况是否正常 //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录"); }}

c.处理成功后的订单数据处理与成功提示

private function _afterPay($orderno) {    // 获取订单信息    $order_info  = $this->order_db->get_one(array('orderno'=>$orderno));    if ($order_info['pay_status'] != '1') {        $data['pay_status'] = '1';        $data['pay_type']   = 'alipay';        $data['pay_code']   = '';        $data['paytime']    = time();        $data['order_status']= 3; // 已支付        $r = $this->order_db->update($data,array('orderno'=>$orderno));        if ($r !== FALSE)         {            // 处理支付信息            header("Location:?m=home&c=order&a=payDone&orderno=".$orderno);         } else {            showmessage('系统异常','blank');        }    } else {        // 处理支付信息        header("Location:?m=home&c=order&a=payDone&orderno=".$orderno);     }    }

支付配置

遇到的问题

支付成功后,通知提示验证失败,后来发现是因为  地址中含有多余参数会导致签名失败。

找到这个方法,把多余的参数过滤掉就ok了。

/** * 除去数组中的空值和签名参数 * @param $para 签名参数组 * return 去掉空值与签名参数后的新签名参数组 */function paraFilter($para) {    $para_filter = array();    while (list ($key, $val) = each ($para)) {        if($key == "sign" || $key == "sign_type" || $val == "" || $key == "m" || $key == "c" || $key == "a")continue; // 过滤无关参数        else    $para_filter[$key] = $para[$key];     }    return $para_filter;}

422101-20160906162039582-898842601.png

422101-20160906162047816-1209809823.png

422101-20160906162052551-1548301390.png

422101-20160906162058269-351393398.png

422101-20160906162218785-811669962.png

本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/5846207.html,如需转载请自行联系原作者

你可能感兴趣的文章
获取鼠标和元素的坐标点
查看>>
PXE 部署不同版本的系统安装环境以及挽救环境
查看>>
Linux 计划任务
查看>>
flask的orm操作
查看>>
如何防止驱动被恶意利用
查看>>
Nagios的搭建
查看>>
我的友情链接
查看>>
Oracle SQL之--多表查询基础用法
查看>>
图形化插件对Eclipse的版本要求
查看>>
两个关于数列的Python脚本(斐波那契数列和猴子吃香蕉类问题)
查看>>
olabuy-时光从来素默,内心应保持一份素淡与简静
查看>>
kux文件怎么打开 苹果手机如何观看kux视频
查看>>
Python中的urllib.request模块
查看>>
第九课 《说人话》
查看>>
js对象数组排序
查看>>
如何实现在展示商品时,放大商品细节
查看>>
uboot boot流程分析
查看>>
如何学习PHP整个体系的?
查看>>
css三角形实现写法全攻略收集
查看>>
Enterprise and the press public MBT Fora
查看>>