tp6支付宝支付

news/2024/10/18 5:56:43/

公司要整一个扫码支付然后有个后台能查看交易记录,然后百度搜寻,决定使用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 "验证失败";}}


http://www.ppmy.cn/news/239591.html

相关文章

PHP实现小程序微信支付(v3版本)

PS:本篇文章是PHP对小程序进行微信支付v3版本的实现,仅用于对支付流程的了解,具体使用方面需要大家自行调整 小程序端JS代码: getPrepayID(){var that thiswx.getStorage({key:openid,success(res){that.setData({openid:res.data})}})wx.getStorage({key:username,success(…

oppoa57计算机有存储功能吗,虽是入门级产品,但OPPO A57这两个功能值得称赞

原标题&#xff1a;虽是入门级产品&#xff0c;但OPPO A57这两个功能值得称赞 一向低调的OPPO随着R11s新机的预热再次走到了消费者的视野中&#xff0c;作为其首款全面屏旗舰&#xff0c;该机无疑成为了用户新的追求对象。当然&#xff0c;如果你是实用主义者觉得该机价格较高&…

中兴f660有没有千兆_电信F660是不是千兆光纤猫?200兆光宽带能不能用电信中兴F660光纤猫?...

展开全部 F660光纤猫可用于千兆光纤宽带,自带无线路由器,但只有lan1口支持32313133353236313431303231363533e59b9ee7ad9431333365633934千兆输出,其余的只能支持百兆输出。 中国电信集团公司是我国特大型国有通信企业、上海世博会全球合作伙伴&#xff0c;连续多年入选"世…

phpexcel 在php7中出现500错误

PHPExcel在PHP7中&#xff0c;Writer->save出现ERR_INVALID_RESPONSE错误的解决方法 这个Writer->save错误可能由于很多原因导致&#xff0c;其中有一部分是因为header和缓冲区的错误导致的。 这部分具体讨论可以看这里 http://stackoverflow.com/questions/8566196/php…

一代机皇Redmi K20 Pro销量破500万 Redmi K30 Pro即将正式发布

2020年2月24日&#xff0c;Redmi通过官方微博宣布&#xff0c;深受500多万用户喜爱的Redmi K20 Pro谢幕。Redmi K20 Pro于2019年5月28日发布&#xff0c;全球持续热销&#xff0c;总销量突破500万。受行业5G转型大环境的影响&#xff0c;过去一年4G旗舰市场竞争尤其激烈&#x…

移动光猫试玩

移动自带光猫中移物联吉比特GM620&#xff0c;网上查不到这个型号&#xff0c;还好CMCCAdmin密码网上查的到&#xff0c;登录进去看看&#xff0c;改掉TR069连接的VLAN ID和RMS上报URL。 这光猫配置还行&#xff0c;实际是ZTE ZX279128&#xff0c;双核1.5G&#xff0c;512M R…

500、1000

上周日&#xff0c;是我参加工作整整 1000 天&#xff0c;确实没想到&#xff0c;我都已经混迹职场这么久了。 周一呢&#xff0c;也是距离我写第一篇公众号文章的第 500 天&#xff0c;确实也没想到写这么久了。 两个相比较来说&#xff0c;工作的收获稍大一些。 公众号基本…

电信光猫F660 4台限制破解

首先说明几点&#xff1a; 1. xml 当然是要明文的。没有明文的&#xff0c;只能丢失配置完全重新写一份。 2. tr69 远程控制必须去掉&#xff0c;因为限制会被重新加上使破解失效。 最简明的方法是把服务器 URL 改掉&#xff1a; 比如 http://devacs.edatahome... 那个&#…