支付-支付宝APP支付
来源:互联网 发布:mac 安装beego 编辑:程序博客网 时间:2024/04/28 08:32
沙箱环境太坑爹,没跑起来,直接上线测了。
集成支付宝提供的SDK,参照开发文档,基本上没什么问题
1、生成支付请求参数,用于调起支付宝APP
public function toPay($body,$title,$out_trade_no, $price){ $aop = new AopClient; $aop->gatewayUrl = self::ALIPAY_URL; $aop->appId = self::APP_ID; $aop->rsaPrivateKey = self::PRIVATE_KEY ; $aop->format = "json"; $aop->charset = "UTF-8"; $aop->signType = "RSA2"; $aop->alipayrsaPublicKey = self::ALIPAY_PUBLIC_KEY; //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay $request = new AlipayTradeAppPayRequest(); $bizcontent = json_encode([ "body" => $body, "subject" => $title, "out_trade_no" => $out_trade_no, "timeout_express" => self::EXPIRE, "product_code" => "QUICK_MSECURITY_PAY", "total_amount" => $price ]); $request->setNotifyUrl($this->notify_url); $request->setBizContent($bizcontent); //这里和普通的接口调用不同,使用的是sdkExecute $response = $aop->sdkExecute($request); return $response; }
2、验签
public function checkSign($postParams){ $aop = new AopClient; $aop->alipayrsaPublicKey = self::ALIPAY_PUBLIC_KEY; $flag = $aop->rsaCheckV1($postParams, NULL, "RSA2"); return $flag;}
3、处理异步通知
public function endOrder($postParams){ if(!$this->checkSign($postParams)){//验签 return false; } //验证app_id是否为该商户本身 if(self::APP_ID != $postParams['app_id']){ return false; } //校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方 if((isset($postParams['seller_id']) && self::SELLER_ID != $postParams['seller_id']) || ( isset($postParams['seller_email']) && self::SELLER_MAIL != $postParams['seller_email']) ){ return false; } //商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号 $orderInfo = “取订单信息” if(empty($orderInfo)){ return false; } //判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额) if ($postParams['total_amount'] != $orderInfo['price']){ return false; } if( 0==$orderInfo["pay_status"] && ($postParams['trade_status']=="TRADE_SUCCESS" || $postParams['trade_status']=="TRADE_FINISHED")){//处理订单 } return true;}
4、处理客户端支付返回
public function clientPayEnd($resultStatus, $result){ $res = json_decode($result, true); $sign = $res["sign"]; $sign_type = $res["sign_type"]; $data = $res["alipay_trade_app_pay_response"]; $orderNo = $data["out_trade_no"]; $total_amount = $data["total_amount"]; //验签 $aop = new AopClient; $aop->alipayrsaPublicKey = self::ALIPAY_PUBLIC_KEY; $flag = $aop->verify(json_encode($data), $sign, NULL, $sign_type); if(!$flag){ return ["flag"=>false, "errMsg"=>"非法签名"]; } $orderInfo = "订单信息"; //商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号 if (empty($orderInfo)){ return ["flag"=>false, "errMsg"=>"未知错误."]; } //判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额) if ($total_amount != $orderInfo["price"]){ return ["flag"=>false, "errMsg"=>"支付金额异常"]; } //校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据对应的操作方 if((isset($data['seller_id']) && self::SELLER_ID != $data['seller_id']) || ( isset($data['seller_email']) && self::SELLER_MAIL != $data['seller_email']) ){ return ["flag"=>false, "errMsg"=>"未知错误.."]; } //验证app_id是否为该商户本身 if ($data["app_id"] != self::APP_ID){ return ["flag"=>false, "errMsg"=>"未知错误..."]; } //订单支付成功 if (1 == $orderInfo['pay_status'] && in_array($resultStatus, ["9000","8000","6004"])){ return ["flag"=>true, "msg"=>"支付成功"]; }elseif(in_array($resultStatus, ["9000","8000","6004"])){//支付结果未知,发起查询 $flag = $this->queryTradeStatus($orderNo); if ($flag){ return ["flag"=>true, "msg"=>"支付成功"]; } } return ["flag"=>false, "errMsg"=>"支付失败"];}
5、查询支付状态
public function queryTradeStatus($orderNo){ $aop = new AopClient (); $aop->gatewayUrl = self::ALIPAY_URL; $aop->appId = self::APP_ID; $aop->rsaPrivateKey = self::PRIVATE_KEY; $aop->alipayrsaPublicKey=self::ALIPAY_PUBLIC_KEY; $aop->apiVersion = '1.0'; $aop->signType = 'RSA2'; $aop->postCharset='UTF-8'; $aop->format='json'; $request = new AlipayTradeQueryRequest (); $request->setBizContent(json_encode([ "out_trade_no" => $orderNo ])); $result = $aop->execute ( $request); $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response"; $resultCode = $result->$responseNode->code; if(!empty($resultCode)&&$resultCode == 10000){ $trade_status = $result->$responseNode->trade_status; if($trade_status == "TRADE_SUCCESS" || $trade_status == "TRADE_FINISHED"){ return true; } } return false; }
6、交易关闭
public function closeTrade($orderNo){ $aop = new AopClient (); $aop->gatewayUrl = self::ALIPAY_URL; $aop->appId = self::APP_ID; $aop->rsaPrivateKey = self::PRIVATE_KEY; $aop->alipayrsaPublicKey=self::ALIPAY_PUBLIC_KEY; $aop->apiVersion = '1.0'; $aop->signType = 'RSA2'; $aop->postCharset='utf-8'; $aop->format='json'; $request = new AlipayTradeCloseRequest (); $request->setBizContent(json_encode([ "out_trade_no" => $orderNo ])); $result = $aop->execute ( $request); $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response"; $resultCode = $result->$responseNode->code; if(!empty($resultCode)&&$resultCode == 10000){ return true; } else { return false; } }
阅读全文
0 0
- app支付--支付宝支付
- 支付-支付宝APP支付
- 支付--支付宝APP支付
- APP支付宝支付
- 支付宝APP支付
- APP支付宝支付
- Android app支付-支付宝
- 支付宝app支付开发
- 支付宝的app支付
- 支付宝-APP支付接入
- 支付宝 app支付问题
- app 支付宝支付接入
- 支付宝支付接口 APP
- 支付宝扫码支付、APP支付
- app集成支付宝
- App集成支付宝
- App集成支付宝
- Android App + 支付宝
- python numpy库中flatten()函数用法
- Android漂亮的音乐歌词控件,仿网易云音乐滑动效果
- servlet过滤器实现跨域Access-Control-Allow-Origin
- libevent源码学习(三)信号evsignal
- 机器学习——Dropout原理介绍
- 支付-支付宝APP支付
- iOS与Html5和JS之间的交互---学习笔记
- js 实现全屏效果
- gridview中一些使用的备忘录
- c语言进阶之路-----用函数判断一个数是否为素数
- Django中文官方版02-创建app
- Transaction rolled back because it has been marked as rollback-only
- Python爬虫入门指导
- iOS与HTML5交互方法总结