XfpayController.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <?php
  2. namespace app\payment\controllers;
  3. use app\common\models\PayOrder;
  4. use app\payment\PaymentController;
  5. use Yunshop\Xfpay\models\PaidRecord;
  6. use Yunshop\Xfpay\services\Xfpay;
  7. class XfpayController extends PaymentController
  8. {
  9. protected $attach;
  10. protected $parameter;
  11. protected $hmac;
  12. protected $key; //第三方加密回调key
  13. const SHOP_XFPAY_WECHAT = 78;
  14. const SHOP_XFPAY_ALIPAY = 79;
  15. public function __construct()
  16. {
  17. parent::__construct();
  18. // 接收第三方请求参数
  19. $this->attach = $this->validator('attach');
  20. $this->parameter = $this->validator('data');
  21. $this->hmac = $this->validator('hmac');
  22. $this->key = 'H357SFF768D786EBB07E1B8D9A4DABC'; // 回调key
  23. \YunShop::app()->uniacid = $this->getUniacid();
  24. }
  25. public function notifyUrlAlipay()
  26. {
  27. // 验证签名
  28. if (!$this->verifySign()){
  29. \Log::debug("-------- 商云客: 检测签名无效 --------");
  30. exit('fail');
  31. }
  32. $order_no = base64_decode($this->attach);
  33. $parameter = json_decode($this->parameter);
  34. $data = $this->setData($order_no, $parameter, self::SHOP_XFPAY_ALIPAY);
  35. \Log::debug('-------- 商云客支付-支付宝: 验证数据正常->更新订单状态 start --------');
  36. $this->payResutl($data);
  37. $this->buildPaidRecord($order_no, $parameter, self::SHOP_XFPAY_ALIPAY);
  38. \Log::debug('-------- 商云客支付-支付宝: 验证数据正常->更新订单状态 end --------');
  39. echo 'success';
  40. }
  41. public function notifyUrlWechat()
  42. {
  43. // 验证签名
  44. if (!$this->verifySign()){
  45. \Log::debug("-------- 商云客: 检测签名无效 --------");
  46. exit('fail');
  47. }
  48. $order_no = base64_decode($this->attach);
  49. $parameter = json_decode($this->parameter);
  50. $data = $this->setData($order_no, $parameter, self::SHOP_XFPAY_WECHAT);
  51. \Log::debug('-------- 商云客支付-微信支付: 验证数据正常->更新订单状态 start --------');
  52. $this->payResutl($data);
  53. $this->buildPaidRecord($order_no, $parameter, self::SHOP_XFPAY_WECHAT);
  54. \Log::debug('-------- 商云客支付-微信支付: 验证数据正常->更新订单状态 end --------');
  55. echo 'success';
  56. }
  57. protected function validator($param)
  58. {
  59. if (is_null($_GET[$param])){
  60. \Log::debug("-------- 商云客支付失败 未检测到第三方参数: $param--------");
  61. exit('fail');
  62. }
  63. return $_GET[$param];
  64. }
  65. protected function verifySign()
  66. {
  67. $xfpay = new Xfpay();
  68. $xfpay->setXfpayKey($this->key);
  69. $xfpay->setParams('attach', $this->attach);
  70. $xfpay->setParams('data', $this->parameter);
  71. $xfpay->getHmacParams();
  72. $hmac = $xfpay->getParams()['hmac'];
  73. return $hmac == $this->hmac;
  74. }
  75. /**
  76. * 支付回调操作
  77. * @param $data
  78. */
  79. public function payResutl($data)
  80. {
  81. try {
  82. $this->_payResutl($data);
  83. return true;
  84. } catch (\Exception $e) {
  85. $msg = $e->getMessage();
  86. \Log::debug('回调失败:',$msg);
  87. echo $msg;exit();
  88. }
  89. }
  90. /**
  91. * 支付回调参数
  92. *
  93. * @param $order_no
  94. * @param $parameter
  95. * @return array
  96. */
  97. public function setData($order_no, $parameter, $pay_type_id)
  98. {
  99. return [
  100. 'total_fee' => floatval($parameter->total_fee) * 100,
  101. 'out_trade_no' => $order_no,
  102. 'trade_no' => $parameter->trade_no,
  103. 'unit' => 'fen',
  104. 'pay_type' => '商云客聚合-微信支付',
  105. 'pay_type_id' => $pay_type_id,
  106. ];
  107. }
  108. protected function getUniacid(){
  109. $payOrder = PayOrder::select('uniacid')->where(['out_order_no' => base64_decode($this->attach)])->first();
  110. if ($payOrder){
  111. return $payOrder->uniacid;
  112. }
  113. \Log::debug('商城订单号未找到: ',base64_decode($this->attach));
  114. exit('fail');
  115. }
  116. protected function buildPaidRecord($order_no, $parameter, $pay_type_id){
  117. try {
  118. PaidRecord::create([
  119. 'uniacid' => \YunShop::app()->uniacid,
  120. 'order_no' => $order_no,
  121. 'trade_no' => $parameter->trade_no,
  122. 'total_fee' => $parameter->total_fee,
  123. 'pay_type_id' => $pay_type_id,
  124. ]);
  125. }catch (\Exception $e){
  126. \Log::debug('构建订单记录失败-订单号: ',base64_decode($this->attach));
  127. }
  128. }
  129. }