Trylesson.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. <?php
  2. namespace app\api\controller;
  3. use app\common\controller\Api;
  4. use think\Db;
  5. /**
  6. * 试课
  7. */
  8. class Trylesson extends Api
  9. {
  10. // 无需登录的接口,*表示全部
  11. protected $noNeedLogin = [];
  12. // 无需鉴权的接口,*表示全部
  13. protected $noNeedRight = ['*'];
  14. public function lists(){
  15. $list = Db::name('trylesson')->where('is_show',1)->order('weigh desc')->autopage()->select();
  16. $list = list_domain_image($list,['image']);
  17. $list = $this->list_lang($list,['name','info','content']);
  18. $this->success(1,$list);
  19. }
  20. public function info(){
  21. $id = input('id');
  22. $info = Db::name('trylesson')->where('id',$id)->find();
  23. $info = info_domain_image($info,['image']);
  24. $info = $this->info_lang($info,['name','info','content']);
  25. $info['map_image'] = localpath_to_netpath(config('site.index_bottom_image'));
  26. $info['public_store_address'] = config('site.public_store_address');
  27. $trylesson_cancel_text = config('site.trylesson_cancel_text');
  28. if($this->lang == 'en'){
  29. $trylesson_cancel_text = config('site.trylesson_cancel_text_en');
  30. }
  31. $info['trylesson_cancel_text'] = $trylesson_cancel_text;
  32. $this->success(1,$info);
  33. }
  34. public function apply(){
  35. $id = input('id',0);
  36. $info = Db::name('trylesson')->where('id',$id)->where('is_show',1)->find();
  37. if(empty($info)){
  38. $this->error('该试课已下架');
  39. }
  40. //同一个试课只能买一次
  41. $check_map = [
  42. 'user_id' => $this->auth->id,
  43. 'order_status' => ['neq',0],
  44. 'trylesson_id' => $id,
  45. ];
  46. $check_order = Db::name('trylesson_order')->where($check_map)->find();
  47. if(!empty($check_order)){
  48. $this->error('您已经购买过此课程');
  49. }
  50. //试课数据
  51. // $field = ['firstname','lastname','mobile','email','height','age','weight','address','health','emergency','comefrom','is_first'];
  52. // $data = request_post_hub($field);
  53. $sysdata = [
  54. 'order_no' => createUniqueNo('T',$this->auth->id),
  55. 'user_id' => $this->auth->id,
  56. 'trylesson_id' => $id,
  57. 'lesson_ids' => $info['lesson_ids'],
  58. 'order_amount' => $info['price'],
  59. 'order_status' => 0,
  60. 'createtime' => time(),
  61. 'starttime' => time(),
  62. 'endtime' => time() + (30 * 86400),
  63. 'pay_type' => 1,
  64. ];
  65. // $data = array_merge($data,$sysdata);
  66. $data = $sysdata;
  67. //支付订单数据
  68. $pay_order = [];
  69. $pay_order['user_id'] = $sysdata['user_id'];
  70. $pay_order['out_trade_no'] = $sysdata['order_no'];
  71. $pay_order['order_amount'] = $sysdata['order_amount'];
  72. $pay_order['createtime'] = $sysdata['createtime'];
  73. $pay_order['pay_type'] = 'hitpay';
  74. $pay_order['platform'] = 'app';
  75. $pay_order['order_status'] = 0;
  76. $pay_order['table_name'] = 'trylesson_order';
  77. $pay_order['table_id'] = 0;
  78. $pay_order['args'] = '';
  79. //拉起支付
  80. $notify_url = config('notify_cdnurl');
  81. $hitpay_return = $this->hitpay_payment($pay_order['out_trade_no'],$pay_order['order_amount'],$notify_url);
  82. if($hitpay_return['status'] !== true){
  83. $this->error($hitpay_return['msg']);
  84. }
  85. //支付请求id
  86. $pay_order['payment_request_id'] = $hitpay_return['id'];
  87. //入库试课订单
  88. Db::startTrans();
  89. $id = Db::name('trylesson_order')->insertGetId($data);
  90. if(!$id){
  91. Db::rollback();
  92. $this->error('预约失败');
  93. }
  94. //支付订单下单
  95. $pay_order['table_id'] = $id;
  96. $pay_order_id = Db::name('pay_order')->insertGetId($pay_order);
  97. if(!$pay_order_id){
  98. Db::rollback();
  99. $this->error('下单失败');
  100. }
  101. Db::commit();
  102. $return = [
  103. 'url' => $hitpay_return['url'],
  104. 'id' => $hitpay_return['id'],
  105. ];
  106. $this->success(1,$return);
  107. }
  108. //拉起支付
  109. private function hitpay_payment($out_trade_no,$money,$notifyurl)
  110. {
  111. $return = [
  112. 'status' => false,
  113. 'msg' => '',
  114. 'url' => '',
  115. 'id' => 0,
  116. ];
  117. $apiKey = config('hitpay.apikey');
  118. $redirect_cdnurl = config('hitpay.trylesson_redirect_cdnurl').'?out_trade_no='.$out_trade_no.'&lang='.$this->lang;
  119. try {
  120. $hitPayClient = new \HitPay\Client($apiKey, true);
  121. $request = new \HitPay\Request\CreatePayment();
  122. $request->setAmount($money)
  123. ->setCurrency('SGD')
  124. ->setRedirectUrl($redirect_cdnurl)
  125. // ->setPaymentMethods(['paynow_online','card'])
  126. ->setPaymentMethods(['paynow_online'])
  127. ->setPurpose('Elin Dance Studio')
  128. ->setWebhook($notifyurl)
  129. ->setReferenceNumber($out_trade_no);
  130. $result = $hitPayClient->createPayment($request);
  131. $return['status'] = true;
  132. $return['url'] = $result->getUrl();
  133. $return['id'] = $result->getId();
  134. //print_r($result);
  135. /*$data = $hitPayClient->getPaymentStatus($result->getId());
  136. dump($data);
  137. dump($data->status);*/
  138. /*$data = $hitPayClient->deletePaymentRequest($data->getId());
  139. print_r($data);*/
  140. } catch (\Exception $e) {
  141. $return['msg'] = $e->getMessage();
  142. }
  143. return $return;
  144. }
  145. }