1 <?php 2 namespace app\index\controller; 3 4 use think\Controller; 5 use think\Request; 6 use think\Db; 7 8 9 class Alipay extends Controller 10 { 11 public function index(Request $request){ 12 header("Content-type:text/html;charset=utf-8"); 13 require_once VENDOR_PATH.'/alipay/config.php'; 14 require_once VENDOR_PATH.'/alipay/pagepay/service/AlipayTradeService.php'; 15 require_once VENDOR_PATH.'/alipay/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php'; 16 $param = $request->param(); 17 // var_dump($param);die; 18 //必傳參數 19 if (empty($param['WIDout_trade_no']) || !array_key_exists('WIDout_trade_no',$param)){ 20 $result = [ 21 'status' => '201', 22 'msg' => '參數錯誤', 23 'param' => $param 24 ]; 25 exit(json_encode($result)); 26 } 27 if (empty($param['WIDsubject']) || !array_key_exists('WIDsubject',$param)){ 28 $result = [ 29 'status' => '201', 30 'msg' => '參數錯誤', 31 'param' => $param 32 ]; 33 exit(json_encode($result)); 34 } 35 if (empty($param['WIDtotal_amount']) || !array_key_exists('WIDtotal_amount',$param)){ 36 $result = [ 37 'status' => '201', 38 'msg' => '參數錯誤', 39 'param' => $param 40 ]; 41 exit(json_encode($result)); 42 } 43 44 45 //商戶訂單號,商戶網站訂單系統中惟一訂單號,必填 46 $out_trade_no = trim($param['WIDout_trade_no']); 47 48 //訂單名稱,必填 49 $subject = trim($param['WIDsubject']); 50 51 //付款金額,必填 52 $total_amount = trim($param['WIDtotal_amount']); 53 54 //商品描述,可空 55 $body = trim($param['WIDbody']); 56 57 //公用回傳參數 58 // $passback_params = http_build_query($param['purchaseInfo']); 59 $passback_params = urlencode($param['buyer']); 60 61 62 //構造參數 63 $payRequestBuilder = new \AlipayTradePagePayContentBuilder(); 64 $payRequestBuilder->setBody($body); 65 $payRequestBuilder->setSubject($subject); 66 $payRequestBuilder->setTotalAmount($total_amount); 67 $payRequestBuilder->setOutTradeNo($out_trade_no); 68 $payRequestBuilder->setPassbackParams($passback_params); 69 70 // var_dump($payRequestBuilder);die; 71 $aop = new \AlipayTradeService($config); 72 73 /** 74 * pagePay 電腦網站支付請求 75 * @param $builder 業務參數,使用buildmodel中的對象生成。 76 * @param $return_url 同步跳轉地址,公網能夠訪問 77 * @param $notify_url 異步通知地址,公網能夠訪問 78 * @return $response 支付寶返回的信息 79 */ 80 $response = $aop->pagePay($payRequestBuilder, $config['return_url'], $config['notify_url']); 81 82 //輸出表單 83 echo $response; 84 } 85 86 /** 87 * 異步 88 * @param Request $request 89 * @throws \Exception 90 */ 91 public function notifyUrl(Request $request){ 92 $param = $request->param(); 93 require_once VENDOR_PATH.'/alipay/config.php'; 94 require_once VENDOR_PATH.'/alipay/pagepay/service/AlipayTradeService.php'; 95 require_once VENDOR_PATH.'/alipay/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php'; 96 $alipaySevice = new \AlipayTradeService($config); 97 $alipaySevice->writeLog(var_export($param,true)); 98 $result = $alipaySevice->check($param); 99 100 if($result) { 101 //驗證成功 102 $buyer = urldecode($param['passback_params']); 103 if ($param['trade_status'] == 'TRADE_SUCCESS') { 104 //判斷該筆訂單是否在商戶網站中已經作過處理 105 //若是沒有作過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程序 106 //請務必判斷請求時的total_amount與通知時獲取的total_fee爲一致的 107 //若是有作過處理,不執行商戶的業務程序 108 //注意: 109 //付款完成後,支付寶系統發送該交易狀態通知 110 $db2 = Db::connect('pfpartner2'); 111 $db = Db::connect('pfpartner'); 112 113 ///經過ownerid獲取用戶信息S//////////////////////////////////////////////// 114 $userInfo = $db->name('open_user')->where('owner_id','=',$buyer)->find(); 115 ///經過ownerid獲取用戶信息E//////////////////////////////////////////////// 116 117 // file_put_contents("alipaytext4.txt",$userInfo);die; 118 119 ///獲取所購產品的起始時間S////////////////////////////////////////////////////// 120 $goodWhere['project'] = $param['subject']; 121 $goodWhere['type'] = $param['body']; 122 $projectArr = $db2->name('goods')->where($goodWhere)->find(); 123 if ($userInfo['role'] == 0){ 124 $projectArr['startDatetime'] = date("Y-m-d H:i:s"); 125 $projectArr['expirationDatetime'] = date("Y-m-d H:i:s",time()+$projectArr['day']*24*3600); 126 }else{ 127 $projectArr['startDatetime'] = $userInfo['lock_time']; 128 $projectArr['expirationDatetime'] = date("Y-m-d H:i:s", 129 strtotime($userInfo['lock_time']) + $projectArr['day']*24*3600); 130 } 131 ///獲取所購產品的起始時間E////////////////////////////////////////////////////// 132 133 // file_put_contents("alipaytext2.txt",$puchaseInfo); 134 135 ///建立購買記錄信息S////////////////////////////////////////////////////// 136 $puchaseInfo['owner_id'] = $userInfo['owner_id']; 137 $puchaseInfo['mall_name'] = $userInfo['mall_name']; 138 $puchaseInfo['data_date'] = date("Y-m-d"); 139 $puchaseInfo['product_name'] = $projectArr['project']; 140 $puchaseInfo['product_type'] = $projectArr['type']; 141 $puchaseInfo['payment_method'] = '0'; 142 $puchaseInfo['product_details'] = $projectArr['detailed']; 143 $puchaseInfo['start_time'] = $projectArr['startDatetime']; 144 $puchaseInfo['end_time'] = $projectArr['expirationDatetime']; 145 $puchaseInfo['day'] = $projectArr['day']; 146 $puchaseInfo['original_price'] = $projectArr['original_price']; 147 $puchaseInfo['discount_price'] = $projectArr['discount']; 148 $puchaseInfo['actual_price'] = $projectArr['price']; 149 $puchaseInfo['trade_no'] = $param['trade_no']; 150 ///建立購買記錄信息E////////////////////////////////////////////////////// 151 152 // file_put_contents("alipaytext3.txt",$puchaseInfo); 153 154 //判斷是否存儲過該條記錄 155 $res = $db2->name('purchase_record')->where('trade_no',$param['trade_no'])->find(); 156 if (!$res){ 157 //未購買過,新增購買記錄並修改用戶表中的到期時間等字段 158 $db2->name('purchase_record')->insert($puchaseInfo); 159 $user['lock_time'] = $projectArr['expirationDatetime']; 160 $user['role'] = '1'; 161 $user['is_lock'] = '0'; 162 $db->name('open_user')->where('owner_id','=',$buyer)->update($user); 163 } 164 echo "success"; 165 } 166 }else { 167 //驗證失敗 168 echo "fail"; 169 170 } 171 172 } 173 174 /** 175 * 同步 176 * @param Request $request 177 * @throws \Exception 178 */ 179 public function returnUrl(Request $request){ 180 $param = $request->param(); 181 require_once VENDOR_PATH.'/alipay/config.php'; 182 require_once VENDOR_PATH.'/alipay/pagepay/service/AlipayTradeService.php'; 183 require_once VENDOR_PATH.'/alipay/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php'; 184 $alipaySevice = new \AlipayTradeService($config); 185 $result = $alipaySevice->check($param); 186 187 /* 實際驗證過程建議商戶添加如下校驗。 188 一、商戶須要驗證該通知數據中的out_trade_no是否爲商戶系統中建立的訂單號, 189 二、判斷total_amount是否確實爲該訂單的實際金額(即商戶訂單建立時的金額), 190 三、校驗通知中的seller_id(或者seller_email) 是否爲out_trade_no這筆單據的對應的操做方(有的時候,一個商戶可能有多個seller_id/seller_email) 191 四、驗證app_id是否爲該商戶自己。 192 */ 193 if($result) { 194 //驗證成功 195 return $this->redirect('index/Home/index',['code' => 1]); 196 } 197 else { 198 //驗證失敗 199 echo "驗證失敗"; 200 } 201 } 202 203 } 204 205 ?>