第四步就是创建Alipay类,类内定义两个方法,一个是alipay_app(统一下单),alipay_app中的一些参数需要自己补全,参数介绍点我,另一个是alipay_notify(支付成功后的异步回调)并引入第二步创建的两个类文件,本人开发用的是TP5框架,支付类放在第三方类库vendor目录下面,可以直接在控制器中用vendor()函数引入文件,例:vendor('Alipayapp.lib.alipay_notify');
//调用统一下单接口生成预支付订单并把数据返回给APP public function alipay_app(Request $request) { vendor('Alipayapp.lib.AlipayApp'); $param = $request->param(); $tade_no = $param['orderCode'];//订单号 调用统一下单接口需要提供一个订单号 $order = new Order(); //实例化订单 $ret = $order->getOrderN2($tade_no); //查询订单信息 此处为我自己的查询订单信息方法,可以替换为你自己的 $strOrg['partner']=$this->alipay_config['partner']; // 配置的partner $strOrg['seller_id']=$this->alipay_config['partner']; // 此处和partner值一样即可 $strOrg['out_trade_no']=$tade_no; // 订单号 $strOrg['subject']=""; // 商品的标题 $strOrg['body']="";//商品名 $strOrg['total_fee']=$ret['money'];// 金额 $strOrg['notify_url']="";//回调地址,填写回调方法的绝对路径 $strOrg['service']=$this->alipay_config['service']; $strOrg['payment_type']="1"; $strOrg['_input_charset']="utf-8"; $strOrg['it_b_pay']="30m"; $alipay = new \Alipayapp(); //将post接收到的数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串。 $data=$alipay->createLinkstring($strOrg,true);//,true //将待签名字符串使用私钥签名,且做urlencode. 注意:请求到支付宝只需要做一次urlencode. $rsa_sign=urlencode($alipay->rsaSign($data, $this->alipay_config['private_key'])); //把签名得到的sign和签名类型sign_type拼接在待签名字符串后面。 $data = $data.'&sign='.'"'.$rsa_sign.'"'.'&sign_type='.'"'.$this->alipay_config['sign_type'].'"'; //返回给客户端,建议在客户端使用私钥对应的公钥做一次验签,保证不是他人传输。 $datajson['mdata']=$data; echo json_encode($datajson); } //支付成功后的回调方法 public function alipay_notify() { vendor('Alipayapp.lib.alipay_notify');//引入支付通知类文件 $alipayNotify = new \AlipayNotify($this->alipay_config); $order = new Order(); //实例化订单 if($alipayNotify->getResponse($_POST['notify_id'])) //判断成功之后使用getResponse方法判断是否是支付宝发来的异步通知。 { if($alipayNotify->getSignVeryfy($_POST, $_POST['sign'])) {//使用支付宝公钥验签 //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表 //商户订单号 $out_trade_no = $_POST['out_trade_no']; $ret = $order->getOrderN2($out_trade_no); //查询订单信息 $total_amount=$ret['money']; //订单金额 $total_fee = $_POST['total_fee']; //支付宝返回金额 if($_POST['trade_status'] == 'TRADE_FINISHED') { //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 //注意: //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知 //请务必判断请求时的out_trade_no、total_fee、seller_id与通知时获取的out_trade_no、total_fee、seller_id为一致的 if($total_amount==$total_fee){ //这里进行数据库操作,比如修改订单状态等 } }else if ($_POST['trade_status'] == 'TRADE_SUCCESS') { //判断该笔订单是否在商户网站中已经做过处理,如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程 //如果有做过处理,不执行商户的业务程序 //注意: //付款完成后,支付宝系统发送该交易状态通知 //请务必判断请求时的out_trade_no、total_fee、seller_id与通知时获取的out_trade_no、total_fee、seller_id为一致的 if($total_amount==$total_fee){ //这里进行数据库操作,比如修改订单状态等 } } echo "success"; //请不要修改或删除 }else{ //验证签名失败 echo "sign fail"; } }else{ //验证是否来自支付宝的通知失败 echo "response fail"; } }