2019-09-06 23:53:10 +08:00

623 lines
13 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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";
// }
}
}