You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

101 lines
3.2 KiB

<?php
/**
* Created by PhpStorm.
* User: travis
* Date: 2019/12/12
* Time: 6:20
*/
namespace api\logic;
use backend\modules\payment\logic\WxPaymentManager;
use yii\helpers\Json;
use yii\httpclient\Client;
use yii\web\BadRequestHttpException;
use backend\modules\shop\models\ars\PaymentLog;
use yii\db\Exception;
use Yii;
class WxPaymentLogic extends WxPaymentManager
{
/**
* @return array|bool
* @throws BadRequestHttpException
* @throws \yii\base\InvalidConfigException
* @throws \yii\httpclient\Exception
* 微信支付回调
*/
public function notify()
{
$notifyData = Json::decode(Json::encode(simplexml_load_string(Yii::$app->request->getRawBody(), 'SimpleXMLElement', LIBXML_NOCDATA)));
Yii::info($notifyData, "notify");
if (!$this->checkSign($notifyData)) {
throw new BadRequestHttpException(Helper::REQUEST_BAD_PARAMS);
}
$tra = Yii::$app->db->beginTransaction('SERIALIZABLE');
try {
if ($notifyData->result_code != 'SUCCESS' || $notifyData->return_code != 'SUCCESS') {
throw new BadRequestHttpException('result_code or return_code is false');
}
$paymentLog = PaymentLog::findOne(['order_id' => $notifyData->out_trade_no]);
$this->notifyUrl = Yii::$app->request->hostInfo . $paymentLog->notify_url;
$paymentLog->mch_id = $notifyData->mch_id;
$paymentLog->wx_payment_id = $notifyData->transaction_id; //交易号
$paymentLog->status = self::STATUS_PAYMENT_SUCCESS;
$paymentLog->payment_at = time();
if (!$paymentLog->save()) {
throw new Exception(Helper::errorMessageStr($paymentLog->errors));
}
if (!$tra->commit()) {
throw new Exception('保存数据失败');
}
/*转发回调信息*/
$this->forwardNotify($notifyData, true);
return ['return_code' => 'SUCCESS', 'return_msg' => 'OK'];//回传成功信息到微信服务器
} catch (Exception $e) {
$tra->rollBack();
$this->forwardNotify($notifyData, false);
Yii::info($e->getMessage(), 'notify');
return false;
} catch (BadRequestHttpException $e) {
$tra->rollBack();
$this->forwardNotify($notifyData, false);
Yii::info($e->getMessage(), 'notify');
return false;
}
}
/**
* @param $notifyData
* @param $status
* @return bool
* @throws \yii\base\InvalidConfigException
* @throws \yii\httpclient\Exception
* 转发异步回调信息
*/
protected function forwardNotify($notifyData, $status)
{
$notify = [
'notify' => [
'status' => $status,
'notify' => $notifyData
]
];
$client = new Client();
$response = $client->createRequest()
->setMethod('POST')
->setUrl($this->notifyUrl)
->addHeaders(['content-type' => 'application/json'])
->setContent(Json::encode($notify))
->send();
if ($response->isOk) {
return true;
} else {
return false;
}
}
}