handleWxpayNotify($res); } } private function handleWxpayNotify($res) { //记录日志 if(isset($res['out_trade_no'])){ PayNotifyLog::logger($res['out_trade_no'], $res); } if ($res['result_code'] != 'SUCCESS' && $res['return_code'] != 'SUCCESS') { return; } $paymentOrderUnion = PaymentOrderUnion::findOne(['order_no' => $res['out_trade_no']]); if($paymentOrderUnion == null){ return; } $plugin = new PluginService(); $wechat = $plugin->getWxmpService($paymentOrderUnion->cx_mch_id); $sign = $wechat->pay->makeSign($res); if ($sign != $res['sign']) { echo "Sign 错误"; $this->handleError($paymentOrderUnion->order_no, 'Sign错误'); return; } if ($paymentOrderUnion->is_pay == 1) { echo "订单已支付"; $this->handleError($paymentOrderUnion->order_no, '订单已支付'); return; } $paymentOrderUnion->is_pay = 1; $paymentOrderUnion->pay_type = SysConst::$cxPayTypeWxpay; $paymentOrderUnion->updated_at = time(); $paymentOrderUnion->transaction_id = $res['transaction_id']; if ($paymentOrderUnion->save()) { //支付完成之后,相关的操作 $form = new PaymentNotify(); $resp = $form->notify($paymentOrderUnion); if($resp['code'] != 0){ //记录错误 $this->handleError($paymentOrderUnion->order_no, $resp['msg']); } echo ''; return; } else { echo "支付失败"; return; } } //银联支付回调异步通知 public function actionUnionpay() { $req = file_get_contents("php://input"); if(!empty($req)){ $this->handleUnionpayNotify($req); } } private function handleUnionpayNotify($req) { $reqArr = json_decode($req,true); //记录日志 if(isset($reqArr["response"]["msgBody"]["remark"])){ PayNotifyLog::logger($reqArr["response"]["msgBody"]["remark"], $req); } $plugin = new PluginService(); $updcService = $plugin->getUpdcService(); //签名原文不能使用json字符串和数组之间的转换获取,该处理过程将键值冒号前的空着除去,导致与原文不一致 $sindex=strpos($req,'"sign":'); $reqJson=substr($req,0,$sindex-1)."}"; $reqSign = $reqArr['sign']; $r = $updcService->signature->verify($reqJson,$reqSign); if(!$r){ echo "响应报文验签失败\n"; return; } //验签通过 $res = $reqArr; if(!isset($res['code']) || $res['code'] != '00000'){ $msg = isset($res['msg']) ? "[{$res['code']}]{$res['msg']}" : "[{$res['code']}]error"; throw new \Exception($msg); } if(!isset($res['response'])){ echo '缺少response参数' .PHP_EOL; return; } $response = $res['response']; if(!isset($response['subCode']) || $response['subCode'] != '00000'){ $msg = isset($response['subMsg']) ? "[{$response['subCode']}]{$response['subMsg']}" : "[{$response['subCode']}]error"; echo $msg .PHP_EOL; return; } if(!isset($response['msgBody'])){ echo '缺少msgBody参数' .PHP_EOL; return; } $msgBody = $response['msgBody']; if(!isset($msgBody['retCode']) || $msgBody['retCode'] != '00000'){ $msg = isset($msgBody['retMsg']) ? "[{$msgBody['retCode']}]{$msgBody['retMsg']}" : "[{$msgBody['retCode']}]error"; echo $msg .PHP_EOL; return; } $out_trade_no = $msgBody['oriMerOrdrNo']; $paymentOrderUnion = PaymentOrderUnion::findOne(['out_trade_no' => $out_trade_no]); if($paymentOrderUnion == null){ echo '支付订单不存在' .PHP_EOL; return; } if ($paymentOrderUnion->is_pay == 1) { echo "订单已支付" .PHP_EOL; $this->handleError($paymentOrderUnion->order_no, '订单已支付'); return; } $paymentOrderUnion->is_pay = 1; $paymentOrderUnion->pay_type = SysConst::$cxPayTypeUnionpay; $paymentOrderUnion->updated_at = time(); $chnlMerOrdrNo = isset($msgBody['chnlMerOrdrNo']) ? $msgBody['chnlMerOrdrNo'] : 0; $paymentOrderUnion->transaction_id = $chnlMerOrdrNo; if ($paymentOrderUnion->save()) { //支付完成之后,相关的操作 $form = new PaymentNotify(); $resp = $form->notify($paymentOrderUnion); if($resp['code'] != 0){ //记录错误 $this->handleError($paymentOrderUnion->order_no, $resp['msg']); } echo '支付成功' .PHP_EOL; return; } else { echo "支付失败" .PHP_EOL; return; } } private function handleError($order_no, $err_msg) { $message = "ORDER_NO:{$order_no} ERR_MSG:{$err_msg}"; \Yii::error($message,'NotifyPayment'); } //支付回调测试 public function actionTest() { $open = false; if(!$open){ $data = $this->invaildRequest(); return $this->responseHandler($data); } $params = \Yii::$app->request->post(); $paymentOrderUnion = PaymentOrderUnion::findOne(['order_no' => $params['out_trade_no']]); if($paymentOrderUnion == null){ $data = $this->requestNotFound(); return $this->responseHandler($data); } $paymentOrderUnion->is_pay = 1; $paymentOrderUnion->pay_type = SysConst::$cxPayTypeWxpay; $paymentOrderUnion->updated_at = time(); if ($paymentOrderUnion->save()) { //支付完成之后,相关的操作 $form = new PaymentNotify(); $resp = $form->notify($paymentOrderUnion); if($resp['code'] != 0){ //记录错误 $this->handleError($paymentOrderUnion->order_no, $resp['msg']); } return $this->responseHandler($resp); } else { $data = (new Model())->getModelError($paymentOrderUnion); return $this->responseHandler($data); } } //微信退款回调-押金 public function actionWxpayDepositRefunds() { $xml = file_get_contents("php://input"); $res = DataConversion::xmlToArray($xml); // $associatedData = $res['resource']['associated_data']; // $nonceStr = $res['resource']['nonce']; // $ciphertext = $res['resource']['ciphertext']; // // $plugin = new \app\models\common\PluginService(); // $wxmpService = $plugin->getWxmpService(0); // // $ctext = substr($ciphertext, 0, 16); // $authTag = substr($ciphertext, 16); // $res_json = openssl_decrypt($ctext, 'aes-256-gcm', $wxmpService->apiKey_three, 1, $nonceStr,$authTag, $associatedData); // $res = json_decode($res_json,true); if ($res && !empty($res['out_trade_no'])) { //微信支付回调 $this->handleWxpayDepositRefundsNotify($res); } } //微信退款回调-押金 private function handleWxpayDepositRefundsNotify($res) { try { //记录日志 if(isset($res['out_trade_no'])){ PayNotifyLog::logger($res['out_trade_no'], $res); } $plugin = new PluginService(); $wechat = $plugin->getWxmpService(0); $sign = $wechat->pay->makeSign($res); if ($sign != $res['sign']) { echo "Sign 错误"; $this->handleError($res['out_trade_no'], 'Sign错误'); return; } //SUCCESS:退款成功,CLOSED:退款关闭,ABNORMAL:退款异常 if($res['refund_status'] == 'SUCCESS'){ $status = 1; //退款成功 }elseif ($res['refund_status'] == 'CLOSED'){ $status = 2; //退款关闭状态 }elseif ($res['refund_status'] == 'ABNORMAL'){ $status = 3; //退款异常 }else{ echo "退款失败"; return; } $paymentOrderUnion = PaymentOrderUnion::findOne(['order_no' => $res['out_trade_no']]); if($paymentOrderUnion == null){ echo "退款失败"; return; } $paymentOrder = PaymentOrder::findOne(['payment_order_union_id' => $paymentOrderUnion->id]); if($paymentOrder == null){ echo "退款失败"; return; } $order = Order::findOne(['order_no' => $paymentOrder->order_no]); if($order == null){ echo "退款失败"; return; } $order->is_confirm = $status; $order->updated_at = time(); if(!$order){ echo "退款失败"; return; } echo ''; return; }catch (\Exception $e){ echo "ERROR"; return; } } //微信支付退款回调-订单 public function actionWxpayOrderRefunds() { $xml = file_get_contents("php://input"); $res = DataConversion::xmlToArray($xml); // $associatedData = $res['resource']['associated_data']; // $nonceStr = $res['resource']['nonce']; // $ciphertext = $res['resource']['ciphertext']; // // $plugin = new \app\models\common\PluginService(); // $wxmpService = $plugin->getWxmpService(0); // // $ctext = substr($ciphertext, 0, 16); // $authTag = substr($ciphertext, 16); // $res_json = openssl_decrypt($ctext, 'aes-256-gcm', $wxmpService->apiKey_three, 1, $nonceStr,$authTag, $associatedData); // $res = json_decode($res_json,true); if ($res && !empty($res['out_trade_no'])) { //微信支付回调 $this->handleWxpayOrderRefundsNotify($res); } } //微信支付退款回调-订单 private function handleWxpayOrderRefundsNotify($res) { try { //记录日志 if(isset($res['out_trade_no'])){ PayNotifyLog::logger($res['out_trade_no'], $res); } if ($res['result_code'] != 'SUCCESS' && $res['return_code'] != 'SUCCESS') { return; } $plugin = new PluginService(); $wechat = $plugin->getWxmpService(0); $sign = $wechat->pay->makeSign($res); if ($sign != $res['sign']) { echo "Sign 错误"; $this->handleError($res['out_trade_no'], 'Sign错误'); return; } //SUCCESS:退款成功,CLOSED:退款关闭,ABNORMAL:退款异常 if($res['refund_status'] == 'SUCCESS'){ $status = 0; //已完成状态 }elseif ($res['refund_status'] == 'CLOSED'){ $status = 2; //退款关闭状态 }elseif ($res['refund_status'] == 'ABNORMAL'){ $status = 3; //退款异常 }else{ echo "退款失败"; return; } $paymentOrderUnion = PaymentOrderUnion::findOne(['order_no' => $res['out_trade_no']]); if($paymentOrderUnion == null){ echo "退款失败"; return; } $paymentOrder = PaymentOrder::findOne(['payment_order_union_id' => $paymentOrderUnion->id]); if($paymentOrder == null){ echo "退款失败"; return; } $order = Order::findOne(['order_no' => $paymentOrder->order_no]); if($order == null){ echo "退款失败"; return; } $order->status = $status; $order->updated_at = time(); if(!$order){ echo "退款失败"; return; } echo ''; return; }catch (\Exception $e){ echo "退款失败"; return; } } }