623 lines
13 KiB
PHP
Executable File
623 lines
13 KiB
PHP
Executable File
<?php
|
||
|
||
namespace wstmart\app\controller;
|
||
|
||
use think\Loader;
|
||
|
||
use wstmart\common\model\Payments as M;
|
||
|
||
use wstmart\app\model\Orders as OM;
|
||
|
||
use wstmart\common\model\LogPayParams as PM;
|
||
|
||
use wstmart\common\model\ChargeItems as CM;
|
||
|
||
use wstmart\common\model\LogMoneys as LM;
|
||
|
||
/**
|
||
|
||
* ============================================================================
|
||
|
||
* 阿里支付控制器
|
||
|
||
*/
|
||
|
||
class Alipays extends Base{
|
||
|
||
|
||
|
||
/**
|
||
|
||
* 初始化
|
||
|
||
*/
|
||
|
||
private $alipayConfig;
|
||
|
||
public function _initialize() {
|
||
|
||
header ("Content-type: text/html; charset=utf-8");
|
||
|
||
Loader::import ( 'app_alipay.aop.AopClient' );
|
||
|
||
Loader::import ( 'app_alipay.aop.request.AlipayTradeAppPayRequest' );
|
||
|
||
$m = new M();
|
||
|
||
$payment = $m->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 "<span style='font-size:40px;'>暂停APP支付,请选择WAP端支付宝支付</span>";
|
||
|
||
// 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 "<span style='font-size:40px;'>找不到此订单!</span>";
|
||
|
||
return;
|
||
|
||
}else{
|
||
|
||
$m = new M();
|
||
|
||
$om = new OM();
|
||
|
||
$data = $om->checkOrderPay($obj);
|
||
|
||
if($data["status"]==-1){
|
||
|
||
echo "<span style='font-size:40px;'>您的订单已支付,不要重复支付!</span>";
|
||
|
||
return;
|
||
|
||
}else if($data["status"]==-2){
|
||
|
||
echo "<span style='font-size:40px;'>您的订单因商品库存不足,不能支付!</span>";
|
||
|
||
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";
|
||
|
||
// }
|
||
|
||
}
|
||
|
||
|
||
|
||
}
|
||
|