公司要整一个扫码支付然后有个后台能查看交易记录,然后百度搜寻,决定使用laytp2.0框架搭后台。
配置啥的不阐述了,支付宝支付相对微信来说简单一点,就支付,异步回调,同步回调三个方法。
前端代码:
//表单提交
form.on('submit(pay)', function (data) {var buttonAnim = layui.button.load({elem: '.pay'});//支付宝$.ajax({url: '/payment.alipay/pay',type: 'post',dataType: 'json',contentType: "application/json",data: JSON.stringify(data.field),success: function (res) {window.location.href = res}})buttonAnim.stop();return false;
});
后端代码:
//支付宝支付 public function pay(){Db::startTrans();try {/** 初始化 **/require_once(root_path() . 'extend/PayCore/alipay/aop/AopClient.php');require_once(root_path() . 'extend/PayCore/alipay/aop/request/AlipayTradeWapPayRequest.php');$parameter = request()->post();$amount = $parameter['amount'];$productName = $parameter['product_name'];//生成订单$order = new Order();$orderSn = $order->createOrder($parameter['user_name'], $parameter['tutor_name'], $parameter['mobile'], $amount, $productName);$aop = new AopClient;/** 支付宝网关 **/$aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';/** 应用id,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/190/201602493024 **/$aop->appId = 'xxxxxxx';/** 密钥格式为pkcs1,如何获取私钥请参考:https://opensupport.alipay.com/support/helpcenter/207/201602469554 **/$aop->rsaPrivateKey = "MIIEvQIBxxxxxxxxxxxx";/** 支付宝公钥,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/207/201602487431 **/$aop->alipayrsaPublicKey = "MIIBIjANBgxxxxxxxxxxxx";/** 签名算法类型 **/$aop->signType = 'RSA2';/** 请求使用的编码格式 **/$aop->postCharset = 'utf-8';/** 仅支持JSON **/$aop->format = 'json';/** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.wap.pay(手机网站支付接口)**/$request = new AlipayTradeWapPayRequest;/** 设置业务参数 **/$request->setBizContent("{" ./** 商户订单号,商户自定义,需保证在商户端不重复,如:20150320010101001 **/"\"out_trade_no\":\"$orderSn\"," ./** 销售产品码,固定值:QUICK_WAP_WAY **/"\"product_code\":\"QUICK_WAP_WAY\"," ./** 订单金额,精确到小数点后两位 **/"\"total_amount\":\"$amount\"," ./** 订单标题 **/"\"subject\":\"$productName\"," ./** 业务扩展参数 **/// "\"extend_params\":{" ./** 花呗分期参数传值前提:必须有该接口花呗收款准入条件,且需签约花呗分期 **//** 指定可选期数,只支持3/6/12期,还款期数越长手续费越高 **/// "\"hb_fq_num\":\"3\"," ./** 指定花呗分期手续费承担方式,手续费可以由用户全承担(该值为0),也可以商户全承担(该值为100),但不可以共同承担,即不可取0和100外的其他值。 **///"\"hb_fq_seller_percent\":\"100\"" .// "}," ./** 订单描述 **/"\"body\":\"订单描述\"" ."}");/**注:支付结果以异步通知为准,不能以同步返回为准,因为如果实际支付成功,但因为外力因素,如断网、断电等导致页面没有跳转,则无法接收到同步通知;**//** 支付完成的跳转地址,用于用户视觉感知支付已成功,传值外网可以访问的地址,如果同步未跳转可参考该文档进行确认:https://opensupport.alipay.com/support/helpcenter/193/201602474937 **/$request->setReturnUrl(env('app.app_url')."/payment.alipay/returnUrl");/** 异步通知地址,以http或者https开头的,商户外网可以post访问的异步地址,用于接收支付宝返回的支付结果,如果未收到该通知可参考该文档进行确认:https://opensupport.alipay.com/support/helpcenter/193/201602475759 **/$request->setNotifyUrl(env('app.app_url')."/payment.alipay/notifyUrl");/** 调用SDK生成支付链接,可在浏览器打开链接进入支付页面 **/$result = $aop->pageExecute($request, "get");/**第三方调用(服务商模式),传值app_auth_token后,会收款至授权token对应商家账号,如何获传值app_auth_token请参考文档:https://opensupport.alipay.com/support/helpcenter/79/201602494631 **///$result = $aop->pageExecute($request,'get',"传入获取到的app_auth_token值");/** 获取接口调用结果,如果调用失败,可根据返回错误信息到该文档寻找排查方案:https://opensupport.alipay.com/support/helpcenter/93 **/Db::commit();return $result;}catch (\Exception $e){Db::rollback();// 进行错误处理return $this->error($e->getMessage(), -1);}}//异步回调通知function notifyUrl(){$arr=$_POST;require_once(root_path().'extend/PayCore/alipay/wappay/service/AlipayTradeService.php');Log::record(json_encode($arr),'info');$alipaySevice = new AlipayTradeService(Config::get('alipay'));$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'];if($_POST['trade_status'] == 'TRADE_FINISHED') {//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//请务必判断请求时的total_amount与通知时获取的total_fee为一致的//如果有做过处理,不执行商户的业务程序//注意://退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知}else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {Db::startTrans();try {//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//请务必判断请求时的total_amount与通知时获取的total_fee为一致的//如果有做过处理,不执行商户的业务程序//注意://付款完成后,支付宝系统发送该交易状态通知$order = new Order();$orderInfo = $order->where('order_sn',$out_trade_no)->find();if(!empty($orderInfo['id'])){if($orderInfo['pay_status'] == 0){$order->update(['pay_status' => 1, 'pay_time' => date('Y-m-d H:i:s')],['id'=>$orderInfo['id']]);}}//交易明细记录$tradeRecord = new TradeRecord();$tradeInfo = $tradeRecord->where('order_sn',$out_trade_no)->find();if(empty($tradeInfo['id'])){$tradeRecord->insertGetId(['order_sn' => $out_trade_no,'trade_no' => $trade_no,'total_amount' => $_POST['total_amount'],'type' => 1, //0支出 1收入'pay_type' => 0, //0支付宝 1微信'content' => json_encode($arr),'trade_state' => $trade_status,'create_time' => date('Y-m-d H:i:s')]);}//记录支付宝流水表$alipayTrade = new AlipayTrade();$alipayTradeInfo = $alipayTrade->where('order_sn',$out_trade_no)->find();if(empty($alipayTradeInfo['id'])){$alipayTrade->insertGetId(['order_sn' => $out_trade_no,'trade_no' => $trade_no,'trade_status' => $trade_status,'total_amount' => $_POST['total_amount'],'create_time' => date('Y-m-d H:i:s')]);}Db::commit();}catch (\Exception $e){Db::rollback();// 进行错误处理Log::record($e->getMessage(), 'alipay error');}}//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——echo "success"; //请不要修改或删除}else {//验证失败echo "fail"; //请不要修改或删除}}//同步回调通知function returnUrl(){require_once root_path().'extend/PayCore/alipay/wappay/service/AlipayTradeService.php';$arr=$_GET;$alipaySevice = new AlipayTradeService(Config::get('alipay'));$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']);// echo "验证并支付成功<br />订单号:".$out_trade_no;$url = '/payment/alipay/alipaySuccess.html?amount='.$_GET['total_amount'].'&out_trade_no='.$_GET['out_trade_no'].'&success_time='.$_GET['timestamp'];return redirect($url);//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——/}else {//验证失败echo "验证失败";}}