PayHandler.php 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <?php
  2. namespace common\pay\jiedeng;
  3. use backend\models\Config;
  4. use backend\models\Deposit;
  5. use backend\models\SyncDesposit;
  6. use backend\models\Member;
  7. use backend\helpers\MailHelper;
  8. use common\pay\BasePayHandler;
  9. use Yii;
  10. use yii\helpers\VarDumper;
  11. class PayHandler extends BasePayHandler
  12. {
  13. public $payUrl; //网关地址
  14. public $merId; //mid
  15. public $privateKey; //商户私钥
  16. /**
  17. * @inheritdoc
  18. */
  19. public function init()
  20. {
  21. parent::init();
  22. if ($this->payUrl == null) {
  23. $this->payUrl = Yii::$app->params['jiedeng.payUrl']; //网关地址
  24. }
  25. if ($this->merId == null) {
  26. $this->merId = Yii::$app->params['jiedeng.merId']; //商户号码
  27. }
  28. if ($this->privateKey == null) {
  29. $this->privateKey = Yii::$app->params['jiedeng.Key']; //商户私钥
  30. }
  31. }
  32. /**
  33. * @param array $deposit
  34. * @param array $params
  35. * @return string
  36. */
  37. public function outPay($deposit, $params = [])
  38. {
  39. $data['amount'] = $deposit['rmb'] * 100; //订单金额(港币)
  40. $data['time'] = date('YmdHis'); //交易时间
  41. $data['orderid'] = $deposit['order_sn']; //订单号码
  42. $data['remark'] = $deposit['order_sn']; //订单备注
  43. $data['merId'] = $this->merId; //商户号码
  44. $data['returnUrl'] = $this->returnUrl; //支付完成返回地址(这个是必须有的)
  45. $data['notifyUrl'] = $this->notifyUrl; //异步回调地址
  46. $data['sign'] = PayUtils::makeSign($data,$this->privateKey);
  47. $result = PayUtils::sendPost($this->payUrl, $data); //对数据判断,然后发生邮件
  48. // 对返回的数据进行转化
  49. $result_array = json_decode($result,true);
  50. $memberInfo = Member::findById($deposit['member_id']); // 通过用户id拿到用户的信息 获取到用户的邮箱地址
  51. $config = Config::findOne(1); //获取邮件模板信息
  52. // 如果成功
  53. if($result_array['code']=='00'){
  54. $payurl = $result_array['payurl']; //拿到地址,通过邮件返给前端
  55. $pay_usermame = $result_array['name']; //拿到登录账号,通过邮件返给前端
  56. $pay_password = $result_array['password']; //拿到登录密码,通过邮件返给前端
  57. $email_address = $memberInfo['username']; //获取到用户的地址
  58. //邮件中需要替换的信息
  59. $paramArray=[
  60. 'payurl'=>$payurl, //登录网址
  61. 'name' =>$pay_usermame, //登录账号
  62. 'password'=>$pay_password //登录密码
  63. ];
  64. $mail_status = MailHelper::sendMail("訂單信息", $email_address, $paramArray, '', $config->mail_url); // 获取到需要替换的邮件内容
  65. if($mail_status=='1'){
  66. return PayHandler::createGetHtml(); //支付成功时返回提示页面
  67. }else{
  68. return "邮件系统繁忙,请更换其他支付方式";
  69. }
  70. }else{
  71. return $result;
  72. }
  73. }
  74. /**
  75. * @param array $data
  76. * @return bool
  77. */
  78. public function handleNotify($data)
  79. {
  80. $string = print_r($data,true);
  81. file_put_contents('postshuju.txt',$string);
  82. if (isset($data['sign']) && trim($data['sign']) !== '') {
  83. if (PayUtils::checkSign($data,$this->privateKey)) {
  84. file_put_contents('huidiao.txt','验签成功');
  85. if ($data['respCode'] == '00') {
  86. $merOrderId = trim($data['orderId']); //data函数
  87. $reuslt = Deposit::find()->where(['order_sn' => $merOrderId])->asArray()->limit(1)->one();
  88. if ($reuslt['type'] != 1) {
  89. $res = Deposit::updateAll(['type' => 1], "order_sn = $merOrderId");
  90. $configData = Config::find()->asArray()->one();
  91. if ($configData['auto_deposit'] == 1 && $res) {
  92. $syncDespositModel = new SyncDesposit();
  93. $syncDespositModel->login = $reuslt['login'];
  94. $syncDespositModel->amount = $reuslt['amount'];
  95. $syncDespositModel->comment = 'Deposit';
  96. $syncDespositModel->memo = $merOrderId;
  97. $syncDespositModel->type = 2;
  98. $syncDespositModel->in_time = time();
  99. $syncDespositModel->save();
  100. }
  101. }
  102. return true;
  103. }else{
  104. return false;
  105. }
  106. }
  107. }
  108. return false;
  109. }
  110. public function outNotify($success)
  111. {
  112. if ($success == true) {
  113. return "ok";
  114. } else {
  115. return "fail";
  116. }
  117. }
  118. /**
  119. * @param array $data
  120. * @return bool
  121. */
  122. public function handleReturn($data)
  123. {
  124. //Yii::warning('支付同步通知参数,' . VarDumper::dumpAsString($data), __METHOD__);
  125. if (isset($data['sign']) && trim($data['sign']) !== '') {
  126. if (PayUtils::checkSign($data,$this->privateKey)) {
  127. if ($data['respCode'] == '00') {
  128. $merOrderId = trim($data['orderId']);
  129. $reuslt = Deposit::find()->where(['order_sn' => $merOrderId])->asArray()->limit(1)->one();
  130. if ($reuslt) {
  131. return true;
  132. }
  133. }
  134. }
  135. }
  136. return false;
  137. }
  138. public function outReturn($success)
  139. {
  140. }
  141. // 生成html模板文件
  142. public static function createGetHtml()
  143. {
  144. $html = <<<eot
  145. <div style="border: 1px solid green;width:800px;height: 300px;margin:10% auto;text-align: center;border-radius:30px;padding-top:70px; ">
  146. <h4>重要通知</h4>
  147. <p>含有訂單地址的邮件已经发送到邮箱,请前往邮箱.</p>
  148. <p>邮件中含有重要的訂單信息,<span style="color:red;">请勿泄露给其他人</span>.</p>
  149. </div>
  150. eot;
  151. return $html;
  152. }
  153. }