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

248 lines
8.7 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\mobile\controller;
use think\Loader;
use wstmart\common\model\Payments as M;
use wstmart\mobile\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 ( 'alipay.Corefunction' );
Loader::import ( 'alipay.Md5function' );
Loader::import ( 'alipay.AlipayNotify' );
Loader::import ( 'alipay.AlipaySubmit' );
$m = new M();
$payment = $m->getPayment("alipays");
$this->alipayConfig = array(
'partner' =>$payment['parterID'], //这里是你在成功申请支付宝接口后获取到的PID
'key'=>$payment['parterKey'],//这里是你在成功申请支付宝接口后获取到的Key
'seller_email'=>$payment['payAccount'],
'sign_type'=>strtoupper('MD5'),
'input_charset'=> strtolower('utf-8'),
'cacert'=>'',
'transport'=> 'http'
);
}
/**
* 支付宝支付跳转方法
*/
public function toAliPay(){
$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("mobile/users/index","",true,true);
$notify_url = url("mobile/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)){
$this->assign('type','');
return $this->fetch("users/orders/orders_list");
}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("mobile/orders/index","",true,true);
$notify_url = url("mobile/alipays/aliNotify","",true,true);
$subject = '支付购买商品费用';
}
$format = "xml";
$v = "2.0";
$req_id = date('Ymdhis');
$merchant_url = "";
$seller_email = $this->alipayConfig['seller_email'];
$req_data = '<direct_trade_create_req><notify_url>' . $notify_url . '</notify_url><call_back_url>' . $call_back_url . '</call_back_url><seller_account_name>' . $seller_email . '</seller_account_name><out_trade_no>' . $out_trade_no . '</out_trade_no><subject>' . $subject . '</subject><total_fee>' . $total_fee . '</total_fee><merchant_url>' . $merchant_url . '</merchant_url></direct_trade_create_req>';
//构造要请求的参数数组,无需改动
$para_token = array(
"service" => "alipay.wap.trade.create.direct",
"partner" => trim($this->alipayConfig['partner']),
"sec_id" => trim($this->alipayConfig['sign_type']),
"format" => $format,
"v" => $v,
"req_id" => $req_id,
"req_data" => $req_data,
"_input_charset" => trim(strtolower($this->alipayConfig['input_charset']))
);
//建立请求
$alipaySubmit = new \AlipaySubmit($this->alipayConfig);
$html_text = $alipaySubmit->buildRequestHttp($para_token);
//URLDECODE返回的信息
$html_text = urldecode($html_text);
//解析远程模拟提交后返回的信息
$para_html_text = $alipaySubmit->parseResponse($html_text);
//获取request_token
$request_token = $para_html_text['request_token'];
//**************************根据授权码token调用交易接口alipay.wap.auth.authAndExecute**************************
//业务详细
$req_data = '<auth_and_execute_req><request_token>' . $request_token . '</request_token></auth_and_execute_req>';
//必填
//构造要请求的参数数组,无需改动
$parameter = array(
"service" => "alipay.wap.auth.authAndExecute",
"partner" => trim($this->alipayConfig['partner']),
"sec_id" => trim($this->alipayConfig['sign_type']),
"format" => $format,
"v" => $v,
"req_id" => $req_id,
"req_data" => $req_data,
"_input_charset" => trim(strtolower($this->alipayConfig['input_charset']))
);
$data = array();
$data["userId"] = $userId;
$data["transId"] = $transId;
$data["paramsVa"] = json_encode($payParams);
$data["payFrom"] = 'alipays';
$m = new PM();
$m->addPayLog($data);
//建立请求
$alipaySubmit = new \AlipaySubmit($this->alipayConfig);
$html_text = $alipaySubmit->buildRequestForm($parameter, 'get', '');
echo $html_text;
}
/**
* 服务器异步通知页面方法
*
*/
function aliNotify() {
$om = new OM();
// 计算得出通知验证结果
$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";
}
}
}