154 lines
4.6 KiB
PHP
154 lines
4.6 KiB
PHP
<?php
|
|
|
|
namespace app\payment\controllers;
|
|
|
|
use app\common\models\PayOrder;
|
|
use app\payment\PaymentController;
|
|
use Yunshop\Xfpay\models\PaidRecord;
|
|
use Yunshop\Xfpay\services\Xfpay;
|
|
|
|
class XfpayController extends PaymentController
|
|
{
|
|
protected $attach;
|
|
protected $parameter;
|
|
protected $hmac;
|
|
protected $key; //第三方加密回调key
|
|
|
|
const SHOP_XFPAY_WECHAT = 78;
|
|
const SHOP_XFPAY_ALIPAY = 79;
|
|
|
|
public function __construct()
|
|
{
|
|
parent::__construct();
|
|
// 接收第三方请求参数
|
|
$this->attach = $this->validator('attach');
|
|
$this->parameter = $this->validator('data');
|
|
$this->hmac = $this->validator('hmac');
|
|
$this->key = 'H357SFF768D786EBB07E1B8D9A4DABC'; // 回调key
|
|
\YunShop::app()->uniacid = $this->getUniacid();
|
|
}
|
|
|
|
public function notifyUrlAlipay()
|
|
{
|
|
// 验证签名
|
|
if (!$this->verifySign()){
|
|
\Log::debug("-------- 商云客: 检测签名无效 --------");
|
|
exit('fail');
|
|
}
|
|
|
|
$order_no = base64_decode($this->attach);
|
|
$parameter = json_decode($this->parameter);
|
|
|
|
$data = $this->setData($order_no, $parameter, self::SHOP_XFPAY_ALIPAY);
|
|
|
|
\Log::debug('-------- 商云客支付-支付宝: 验证数据正常->更新订单状态 start --------');
|
|
|
|
$this->payResutl($data);
|
|
$this->buildPaidRecord($order_no, $parameter, self::SHOP_XFPAY_ALIPAY);
|
|
|
|
\Log::debug('-------- 商云客支付-支付宝: 验证数据正常->更新订单状态 end --------');
|
|
echo 'success';
|
|
}
|
|
|
|
public function notifyUrlWechat()
|
|
{
|
|
// 验证签名
|
|
if (!$this->verifySign()){
|
|
\Log::debug("-------- 商云客: 检测签名无效 --------");
|
|
exit('fail');
|
|
}
|
|
|
|
$order_no = base64_decode($this->attach);
|
|
$parameter = json_decode($this->parameter);
|
|
|
|
$data = $this->setData($order_no, $parameter, self::SHOP_XFPAY_WECHAT);
|
|
|
|
\Log::debug('-------- 商云客支付-微信支付: 验证数据正常->更新订单状态 start --------');
|
|
|
|
$this->payResutl($data);
|
|
$this->buildPaidRecord($order_no, $parameter, self::SHOP_XFPAY_WECHAT);
|
|
|
|
\Log::debug('-------- 商云客支付-微信支付: 验证数据正常->更新订单状态 end --------');
|
|
echo 'success';
|
|
}
|
|
|
|
protected function validator($param)
|
|
{
|
|
if (is_null($_GET[$param])){
|
|
\Log::debug("-------- 商云客支付失败 未检测到第三方参数: $param--------");
|
|
exit('fail');
|
|
}
|
|
|
|
return $_GET[$param];
|
|
}
|
|
|
|
protected function verifySign()
|
|
{
|
|
$xfpay = new Xfpay();
|
|
$xfpay->setXfpayKey($this->key);
|
|
$xfpay->setParams('attach', $this->attach);
|
|
$xfpay->setParams('data', $this->parameter);
|
|
$xfpay->getHmacParams();
|
|
$hmac = $xfpay->getParams()['hmac'];
|
|
return $hmac == $this->hmac;
|
|
}
|
|
|
|
/**
|
|
* 支付回调操作
|
|
* @param $data
|
|
*/
|
|
public function payResutl($data)
|
|
{
|
|
try {
|
|
$this->_payResutl($data);
|
|
return true;
|
|
|
|
} catch (\Exception $e) {
|
|
$msg = $e->getMessage();
|
|
\Log::debug('回调失败:',$msg);
|
|
echo $msg;exit();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 支付回调参数
|
|
*
|
|
* @param $order_no
|
|
* @param $parameter
|
|
* @return array
|
|
*/
|
|
public function setData($order_no, $parameter, $pay_type_id)
|
|
{
|
|
return [
|
|
'total_fee' => floatval($parameter->total_fee) * 100,
|
|
'out_trade_no' => $order_no,
|
|
'trade_no' => $parameter->trade_no,
|
|
'unit' => 'fen',
|
|
'pay_type' => '商云客聚合-微信支付',
|
|
'pay_type_id' => $pay_type_id,
|
|
];
|
|
}
|
|
|
|
protected function getUniacid(){
|
|
$payOrder = PayOrder::select('uniacid')->where(['out_order_no' => base64_decode($this->attach)])->first();
|
|
if ($payOrder){
|
|
return $payOrder->uniacid;
|
|
}
|
|
\Log::debug('商城订单号未找到: ',base64_decode($this->attach));
|
|
exit('fail');
|
|
}
|
|
|
|
protected function buildPaidRecord($order_no, $parameter, $pay_type_id){
|
|
try {
|
|
PaidRecord::create([
|
|
'uniacid' => \YunShop::app()->uniacid,
|
|
'order_no' => $order_no,
|
|
'trade_no' => $parameter->trade_no,
|
|
'total_fee' => $parameter->total_fee,
|
|
'pay_type_id' => $pay_type_id,
|
|
]);
|
|
}catch (\Exception $e){
|
|
\Log::debug('构建订单记录失败-订单号: ',base64_decode($this->attach));
|
|
}
|
|
}
|
|
} |