JinepayController.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * Name: 芸众商城系统
  5. * Author: 广州市芸众信息科技有限公司
  6. * Profile: 广州市芸众信息科技有限公司位于国际商贸中心的广州,专注于移动电子商务生态系统打造,拥有芸众社交电商系统、区块链数字资产管理系统、供应链管理系统、电子合同等产品/服务。官网 :www.yunzmall.com www.yunzshop.com
  7. * Date: 2022/12/1
  8. * Time: 14:13
  9. */
  10. namespace app\payment\controllers;
  11. use app\common\helpers\Url;
  12. use app\common\models\PayOrder;
  13. use app\common\models\PayType;
  14. use app\payment\PaymentController;
  15. use Yunshop\Jinepay\models\NotifyLog;
  16. use Yunshop\Jinepay\models\XmlToArray;
  17. use Yunshop\Jinepay\services\JinePay;
  18. class JinepayController extends PaymentController
  19. {
  20. const PAY_ID = 104;
  21. public function notifyUrl()
  22. {
  23. $strData = request()->getContent();
  24. \Log::debug(self::class . '--: 锦银E付回调通知: ' . $strData);
  25. $strData = explode('&', $strData);
  26. // 遍历data 把值用 = 号切割转成一维关联数组
  27. $data = [];
  28. foreach ($strData as $value) {
  29. $explode = explode('=', $value);
  30. $data[$explode[0]] = $explode[1];
  31. }
  32. $payOrder = PayOrder::where('out_order_no', $data['out_trade_no'])->first();
  33. if (!$payOrder) {
  34. \Log::debug(self::class . '--: 未找到支付订单');
  35. echo 'fail';
  36. return;
  37. }
  38. \YunShop::app()->uniacid = $payOrder->uniacid;
  39. \Setting::$uniqueAccountId = $payOrder->uniacid;
  40. $jinePay = new JinePay;
  41. try {
  42. $res = $jinePay->verifySign($data);
  43. } catch (\Exception $e) {
  44. \Log::debug(self::class . '--验签失败 失败原因: ' . $e->getMessage());
  45. $res = false;
  46. }
  47. if (!$res) {
  48. // 出发自主查询
  49. $jinePay->setReqData([
  50. 'service' => 'query_order_service',
  51. 'out_trade_no' => $data['out_trade_no'],
  52. 'partner' => $jinePay->set['merchant'],
  53. ]);
  54. $queryData = XmlToArray::convert($jinePay->queryOrder());
  55. $verify = $jinePay->verifySign($queryData);
  56. // 自主查询付款成功后
  57. if ($queryData['trade_state'] === '0' && $verify) {
  58. $res = true;
  59. }
  60. }
  61. if (!$res) {
  62. \Log::debug(self::class . '--: 验签失败');
  63. echo 'fail';
  64. return;
  65. }
  66. if ($data['trade_state'] === '0') {
  67. NotifyLog::create([
  68. 'uniacid' => $payOrder->uniacid,
  69. 'out_trade_no' => $data['out_trade_no'],
  70. 'params' => json_encode($data, 320),
  71. ]);
  72. $currentPayType = $this->currentPayType(self::PAY_ID);
  73. $payResultData = $this->setData($data['out_trade_no'], $data['out_trade_no'], ($data['total_fee'] * 100), $currentPayType['id'], $currentPayType['name']);
  74. $this->payResutl($payResultData);
  75. \Log::debug(self::class . '订单支付成功--订单号: ' . $data['out_trade_no']);
  76. echo 'success';
  77. exit;
  78. } else {
  79. \Log::debug(self::class . '订单支付失败--订单号: ' . json_encode($data, 320));
  80. echo 'fail';
  81. exit;
  82. }
  83. }
  84. public function returnUrl()
  85. {
  86. $request = request()->all();
  87. $order_info = unserialize(base64_decode($request['afford']));
  88. \YunShop::app()->uniacid = $order_info['i'];
  89. \Setting::$uniqueAccountId = $order_info['i'];
  90. $currentPayType = $this->currentPayType(self::PAY_ID);
  91. $payOrder = PayOrder::getPayOrderInfo($order_info['order_no'])->first();
  92. $jinePay = new JinePay;
  93. $jinePay->setReqData([
  94. 'service' => 'query_order_service',
  95. 'out_trade_no' => $order_info['order_no'],
  96. 'partner' => $jinePay->set['merchant'],
  97. ]);
  98. $res = $jinePay->queryOrder();
  99. \Log::debug(self::class . '-锦银E付同步通知-: ' . $res);
  100. $data = XmlToArray::convert($res);
  101. $verify = $jinePay->verifySign($data);
  102. if ($payOrder && $data['trade_state'] === '0' && $verify) {
  103. $data = $this->setData($order_info['out_trade_no'], $order_info['out_trade_no'], ($request['total_fee'] * 100), $currentPayType['id'], $currentPayType['name']);
  104. $this->payResutl($data);
  105. \Log::debug(self::class . '订单支付成功--订单号: ' . $order_info['order_no']);
  106. redirect(Url::absoluteApp('member/payYes', ['i' => $order_info['i']]))->send();
  107. }
  108. if (!$payOrder) {
  109. \Log::debug(self::class . '订单支付失败--订单号: ' . $order_info['order_no']);
  110. \Log::debug(self::class . '订单支付失败原因: ' . json_encode($data, 320));
  111. redirect(Url::absoluteApp('member/payErr', ['i' => $order_info['i']]))->send();
  112. }
  113. }
  114. /**
  115. * 支付回调参数
  116. *
  117. * @param $order_no
  118. * @param $parameter
  119. * @return array
  120. */
  121. public function setData($order_no, $trade_no, $total_fee, $pay_type_id, $pay_type)
  122. {
  123. return [
  124. 'total_fee' => $total_fee,
  125. 'out_trade_no' => $order_no,
  126. 'trade_no' => $trade_no,
  127. 'unit' => 'fen',
  128. 'pay_type' => $pay_type,
  129. 'pay_type_id' => $pay_type_id,
  130. ];
  131. }
  132. public function currentPayType($payId)
  133. {
  134. return PayType::find($payId);
  135. }
  136. }