getPayment("app_alipays"); $this->alipayConfig = array( 'app_id' =>trim($payment['appId']), 'rsaPrivateKey' =>trim($payment['rsaPrivateKey']),//'请填写开发者私钥去头去尾去回车,一行字符串' 'alipayrsaPublicKey' =>trim($payment['alipayrsaPublicKey']),//公钥 'format' =>'json',//格式 'charset' =>'UTF-8', 'signType' =>'RSA2', 'seller_email'=>'ect@ect99.com' ); } /** * 支付宝支付跳转方法 */ public function toAliPay(){ // echo "暂停APP支付,请选择WAP端支付宝支付"; // return; $payObj = input("payObj/s"); $call_back_url = ""; $notify_url = ""; $subject = ""; $total_fee = 0; $transId = 0; $userId = 0; $payParams = array(); if($payObj=="recharge"){//充值 $itemId = (int)input("itemId/d"); $orderAmount = 0; if($itemId>0){ $cm = new CM(); $item = $cm->getItemMoney($itemId); $total_fee = isSet($item["chargeMoney"])?$item["chargeMoney"]:0; }else{ $total_fee = (int)input("needPay/d"); } $shopId = (int)session('WST_USER.shopId'); $targetType = ($shopId>0)?1:0; $targetId = (int)session('WST_USER.userId'); if($targetType==1){//商家 $targetId = $shopId; } $userId = $targetId; $out_trade_no = WSTOrderNo(); $transId = $out_trade_no; $payParams["targetId"] = $targetId; $payParams["targetType"] = $targetType; $payParams["itemId"] = $itemId; $payParams["payObj"] = $payObj; //$call_back_url = url("app/users/index","",true,true); $notify_url = url("app/alipays/aliNotify","",true,true); $subject = '钱包充值'; }else{ $orderNo = input('orderNo'); $isBatch = (int)input('isBatch'); $userId = (int)session('WST_USER.userId'); $m = new OM(); $obj = array(); $obj["userId"] = $userId; $obj["orderNo"] = input("orderNo/s"); $obj["isBatch"] = (int)input("isBatch/d"); $rs = $m->getOrderPayInfo($obj); if(empty($rs)){ echo "找不到此订单!"; return; }else{ $m = new M(); $om = new OM(); $data = $om->checkOrderPay($obj); if($data["status"]==-1){ echo "您的订单已支付,不要重复支付!"; return; }else if($data["status"]==-2){ echo "您的订单因商品库存不足,不能支付!"; return; } } $order = $om->getPayOrders($obj); $total_fee = $order["needPay"]; $payRand = $order["payRand"]; $out_trade_no = $obj["orderNo"]."a".$payRand; $transId = $obj["orderNo"]; $payParams["userId"] = $userId; $payParams["isBatch"] = $isBatch; $payParams["orderNo"] = $orderNo; //$call_back_url = url("app/orders/index","",true,true); $notify_url = url("app/alipays/aliNotify","",true,true); $subject = '支付购买商品费用'; } $data = array(); $data["userId"] = $userId; $data["transId"] = $transId; $data["paramsVa"] = json_encode($payParams); $data["payFrom"] = 'alipays'; $m = new PM(); $m->addPayLog($data); //建立请求 $aop = new \AopClient; $aop->gatewayUrl = "https://openapi.alipay.com/gateway.do"; $aop->appId = $this->alipayConfig['app_id']; $aop->rsaPrivateKey = $this->alipayConfig['rsaPrivateKey']; $aop->alipayrsaPublicKey = $this->alipayConfig['alipayrsaPublicKey']; $aop->apiVersion = '1.0'; $aop->signType = "RSA2"; $aop->postCharset = $this->alipayConfig['charset']; $aop->format = $this->alipayConfig['format']; //$aop->charset = $this->alipayConfig['charset']; //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay $request = new \AlipayTradeAppPayRequest(); // 异步通知地址 //$notify_url = urlencode($notify_url); // 订单标题 $subject = $subject; // 订单详情 $body = $subject; //SDK已经封装掉了公共参数,这里只需要传入业务参数 $bizcontent = "{\"body\":\"".$body."\"," . "\"subject\": \"".$subject."\"," . "\"out_trade_no\": \"".$out_trade_no."\"," . "\"timeout_express\": \"30m\"," . "\"total_amount\": \"".$total_fee."\"," . "\"product_code\":\"QUICK_MSECURITY_PAY\"" . "}"; $request->setNotifyUrl($notify_url); $request->setBizContent($bizcontent); //这里和普通的接口调用不同,使用的是sdkExecute $response = $aop->sdkExecute($request); // 注意:这里不需要使用htmlspecialchars进行转义,直接返回即可 echo $response; } /** * 验签 * @param [type] $postParams [description] * @return [type] [description] */ public function checkSign($postParams){ $aop = new \AopClient; $aop->alipayrsaPublicKey = $this->alipayConfig['alipayrsaPublicKey']; $flag = $aop->rsaCheckV1($postParams, NULL, "RSA2"); return $flag; } /** * 服务器异步通知页面方法 * */ function alinotify() { //验签通过后再实现业务逻辑,比如修改订单表中的支付状态。 /** ①验签通过后核实如下参数trade_status、out_trade_no、total_amount、seller_id ②修改订单表 **/ // if(!isset($_POST['app_id'])){ // $_POST = $_GET; // } if(!$this->checkSign($_POST)){//验签 return false; } //验证app_id是否为该商户本身 if($this->alipayConfig['app_id'] != $_POST['app_id']){ return false; } //校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方 if(isset($_POST['seller_email']) && ($_POST['seller_email'] != $_POST['seller_email'])){ return false; } $out_trade_no = $_POST['out_trade_no'];//获取交易号 $tradeNo = explode("a",$out_trade_no);//实际订单号 $om = new OM(); //商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号 $orderInfo = $om->getOrderByOrderNo($tradeNo['0'],'needPay,isPay');//取订单信息; if(empty($orderInfo)){ return false; } //判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额) // if ($_POST['total_amount'] != $orderInfo['needPay']){ // return false; // } if(0==$orderInfo["isPay"] && ($_POST['trade_status']=="TRADE_SUCCESS" || $_POST['trade_status']=="TRADE_FINISHED")){ //处理订单 $obj["trade_no"] = $_POST['trade_no'];//支付宝交易号 $obj["out_trade_no"] = $tradeNo[0];//实际订单号 $obj["payFrom"] = 'alipays'; $obj["total_fee"] = $_POST['total_amount'];//订单金额 $m = new PM(); $payParams = $m->getPayLog(["transId"=>$obj["out_trade_no"]]); if(isSet($payParams["payObj"]) && $payParams["payObj"]=='recharge'){ $obj["targetId"] = $payParams["targetId"]; $obj["targetType"] = $payParams["targetType"]; $obj["itemId"] = $payParams["itemId"];; // 支付成功业务逻辑 $m = new LM(); $rs = $m->complateRecharge ( $obj ); }else{ //$payFrom = $om->getOrderPayFrom($tradeNo[0]); $obj["userId"] = $payParams["userId"]; $obj["isBatch"] = $payParams["isBatch"]; //支付成功业务逻辑 $rs = $om->complatePay($obj); } if($rs["status"]==1){ echo 'success';// 请不要修改或删除 }else{ echo 'fail'; } } //echo "success";// 请不要修改或删除 // // 计算得出通知验证结果 // $alipayNotify = new \AlipayNotify ( $this->alipayConfig ); // $verify_result = $alipayNotify->verifyNotify (); // if ($verify_result) { // $notify_data = $_POST['notify_data']; // // 获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表 // // 解析notify_data // // 注意:该功能PHP5环境及以上支持,需开通curl、SSL等PHP配置环境。建议本地调试时使用PHP开发软件 // $doc = new \DOMDocument (); // $doc->loadXML ( $notify_data ); // if (! empty ( $doc->getElementsByTagName ( "notify" )->item ( 0 )->nodeValue )) { // // 交易号 // $trade_no = $doc->getElementsByTagName ( "trade_no" )->item ( 0 )->nodeValue; // // 商户订单号 // $out_trade_no = $doc->getElementsByTagName ( "out_trade_no" )->item ( 0 )->nodeValue; // $total_fee = $doc->getElementsByTagName( "total_fee" )->item(0)->nodeValue; // // 支付宝交易号 // $trade_no = $doc->getElementsByTagName ( "trade_no" )->item ( 0 )->nodeValue; // // 交易状态 // $trade_status = $doc->getElementsByTagName ( "trade_status" )->item ( 0 )->nodeValue; // if ($trade_status == 'TRADE_FINISHED' OR $trade_status == 'TRADE_SUCCESS') { // $obj["trade_no"] = $trade_no; // $tradeNo = explode("a",$out_trade_no); // $obj["out_trade_no"] = $tradeNo[0]; // $obj["payFrom"] = 'alipays'; // $obj["total_fee"] = $total_fee; // $m = new PM(); // $payParams = $m->getPayLog(["transId"=>$obj["out_trade_no"]]); // if(isSet($payParams["payObj"]) && $payParams["payObj"]=='recharge'){ // $obj["targetId"] = $payParams["targetId"]; // $obj["targetType"] = $payParams["targetType"]; // $obj["itemId"] = $payParams["itemId"];; // // 支付成功业务逻辑 // $m = new LM(); // $rs = $m->complateRecharge ( $obj ); // }else{ // //$payFrom = $om->getOrderPayFrom($tradeNo[0]); // $obj["userId"] = $payParams["userId"]; // $obj["isBatch"] = $payParams["isBatch"]; // //支付成功业务逻辑 // $rs = $om->complatePay($obj); // } // if($rs["status"]==1){ // echo 'success'; // }else{ // echo 'fail'; // } // } // echo "success"; // 请不要修改或删除 // } // } else { // // 验证失败 // echo "fail"; // } } }