FastPayService.php 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. <?php
  2. namespace addons\HuifuPay\common\service;
  3. use addons\HuifuPay\common\models\HuifuPayFastpayOrder;
  4. use addons\HuifuPay\common\models\HuifuPayOrderModel;
  5. use addons\HuifuPay\common\models\HuifuPayUserBankcard;
  6. use addons\HuifuPay\common\service\HuifuService;
  7. use common\enums\AddonsEnum;
  8. use common\enums\StatusEnum;
  9. use common\models\common\PaymentTrade;
  10. use common\models\common\UserBankCard;
  11. use yii\db\Exception;
  12. use \Yii;
  13. class FastPayService extends PayService
  14. {
  15. public $config = [];
  16. public $mall_id = 0;
  17. public $public_key='';
  18. public function __construct($mall_id = null)
  19. {
  20. if (!empty($mall_id)) {
  21. $this->mall_id = $mall_id;
  22. $this->config = \Yii::$app->services->setting->addons->get($mall_id, AddonsEnum::ADDONS_NAME_HUIFU_PAY, 'basic');
  23. }
  24. }
  25. /**
  26. * 快捷支付-发送签约短信
  27. * @desc 签约第一步
  28. * @param int $card_id UserBankCard->id
  29. * @throws Exception
  30. * @return bool
  31. */
  32. public function sendSignSms($card_id)
  33. {
  34. $card = HuifuPayUserBankcard::findOne(['card_id' => $card_id]);
  35. if (!$card) {
  36. throw new Exception('银行卡信息不存在');
  37. }
  38. $order_id = HuifuPayFastpayOrder::createOrder($card->mall_id, $card->user_id, $card_id, 0.01);
  39. $orderInfo = HuifuPayFastpayOrder::findOne(['id' => $order_id]);
  40. $data=[
  41. 'user_id'=>$card->user_id,
  42. 'huifu_id'=>$this->config['huifupay_huifu_id'],
  43. 'order_no'=>$orderInfo->order_no,
  44. 'bank_card_no'=>$card->bank_card_no,
  45. 'payer_name'=>$card->payer_name,
  46. 'id_no'=>$card->id_no,
  47. 'is_longer'=>$card->is_longer,
  48. 'sdate'=>$card->sdate,
  49. 'edate'=>$card->edate,
  50. 'mobile_no'=>$card->mobile_no,
  51. ];
  52. $huifuService=new HuifuService($card->mall_id);
  53. $result= $huifuService->signCard($data);
  54. if(isset($result['trans_id']))
  55. {
  56. $orderInfo->hf_order_no=$result['trans_id'];
  57. $orderInfo->save();
  58. }
  59. return $result;
  60. }
  61. /**
  62. * 快捷支付-签约
  63. * @desc 签约第二步 END
  64. * @param $card_info
  65. * @param $sms_code
  66. * @throws Exception
  67. * @return bool
  68. */
  69. public function sign($card_id, $sms_code)
  70. {
  71. $card_info = UserBankCard::findOne([
  72. 'id' => $card_id,
  73. 'status' => StatusEnum::ENABLED,
  74. ]);
  75. /** @var HuifuPayUserBankcard $card_info */
  76. $huifupay_card_info = HuifuPayUserBankcard::findOne([
  77. 'card_id' => $card_id,
  78. 'status' => StatusEnum::ENABLED,
  79. 'is_sign' => 0,
  80. ]);
  81. if (empty($card_info) || empty($huifupay_card_info)) throw new \Exception('银行卡不存在');
  82. /** @var HuifuPayFastpayOrder $orderInfo */
  83. $orderInfo = HuifuPayFastpayOrder::find()
  84. ->where(['bank_card_id' => $card_info->id,'user_id'=>$card_info->user_id])
  85. ->orderBy('id desc')
  86. ->one();
  87. if (empty($orderInfo)) throw new \Exception('签约订单未找到');
  88. $data=[
  89. 'user_id'=>$huifupay_card_info->user_id,
  90. 'huifu_id'=>$this->config['huifupay_huifu_id'],
  91. 'order_no'=>$orderInfo->order_no,
  92. 'bank_card_no'=>$huifupay_card_info->bank_card_no,
  93. 'payer_name'=>$huifupay_card_info->payer_name,
  94. 'id_no'=>$huifupay_card_info->id_no,
  95. 'is_longer'=>$huifupay_card_info->is_longer,
  96. 'sdate'=>$huifupay_card_info->sdate,
  97. 'edate'=>$huifupay_card_info->edate,
  98. 'mobile_no'=>$huifupay_card_info->mobile_no,
  99. 'trans_id'=>$orderInfo->hf_order_no,
  100. 'code'=>$sms_code
  101. ];
  102. $huifuService=new HuifuService($card_info->mall_id);
  103. $result= $huifuService->confirmBindSms($data);
  104. if(isset($result['token_no'])&&$result['trans_status']=='S')
  105. {
  106. $huifupay_card_info->sign_no = $result['token_no'] ?? '';
  107. $huifupay_card_info->is_sign = !empty($result['token_no']) ? 1 : 0;
  108. $huifupay_card_info->cust_id=$result['cust_id'];
  109. $huifupay_card_info->updated_at = time();
  110. if(!$huifupay_card_info->save()){
  111. throw new Exception($huifupay_card_info->getErrorMessage());
  112. }
  113. $orderInfo->updated_at = time();
  114. if(!$orderInfo->save()){
  115. throw new Exception($orderInfo->getErrorMessage());
  116. }
  117. return true;
  118. }
  119. return false;
  120. }
  121. /**
  122. * 解约
  123. * @param $card_info
  124. * @return bool
  125. * @throws Exception
  126. */
  127. public function unsign($card_info)
  128. {
  129. try {
  130. if (!$card_info->sign_no) { // 未签约(直接解绑)
  131. $card_info->is_sign = 0;
  132. if (!$card_info->save()) {
  133. throw new Exception($card_info->getErrorMessage());
  134. }
  135. return true;
  136. }
  137. $bankInfo = [
  138. 'huifu_id' => $this->config['huifupay_huifu_id'],
  139. 'user_id' => $card_info->user_id,
  140. 'sign_no' => $card_info->sign_no,
  141. ];
  142. $huifuService = new HuifuService($card_info['mall_id']);
  143. $result = $huifuService->unbindBankCard($bankInfo);
  144. if (!$result) {
  145. throw new Exception('解约失败');
  146. }
  147. $card_info->is_sign = 0;
  148. if (!$card_info->save()) {
  149. throw new Exception($card_info->getErrorMessage());
  150. }
  151. } catch (\Exception $e) {
  152. throw new Exception($e->getMessage());
  153. }
  154. return true;
  155. }
  156. /**
  157. * 支付短信接口
  158. * @param $trade_id 支付流水id
  159. * @param $card_id 银行卡记录id
  160. * @throws Exception
  161. * @return bool
  162. */
  163. public function sendPaySms(int $trade_id, $card_info, $mall_id)
  164. {
  165. $trade = PaymentTrade::find()
  166. ->select('*,out_trade_no as order_no')
  167. ->where(['id' => $trade_id])
  168. ->one();
  169. $order_setting = \Yii::$app->services->setting->mall->get($mall_id, 'order');
  170. $order_auto_handle_time = 30;
  171. if (!empty($order_setting)) {
  172. $order_auto_handle_time = $order_setting['payment_expire_time'];
  173. }
  174. $expireDate = time() + ($order_auto_handle_time * 60);
  175. $huifuService = new HuifuService($trade->mall_id);
  176. $notify_url = \Yii::$app->services->setting->platform->get('system.api_url') . "/huifu-pay/notify/notify2";
  177. $result = [];
  178. //分账对象
  179. $splitAccount = [];
  180. if ($this->config['huifupay_ledger_status'] && !empty(json_decode($this->config['huifupay_ledger_list'], true))) {
  181. $sList = json_decode($this->config['huifupay_ledger_list'], true);
  182. foreach ($sList as $key => $value) {
  183. $scale = bcdiv($value['num'], 100);
  184. $price = bcmul($trade->pay_fee, $scale, 2);
  185. $item = [
  186. 'num' => $price,
  187. 'id' => $value['id']
  188. ];
  189. $splitAccount[] = $item;
  190. }
  191. }
  192. // 发送快捷支付短信
  193. $data = [
  194. 'cust_id' => $card_info->cust_id,
  195. 'amount' => $trade->pay_fee,
  196. 'huifu_id' => $this->config['huifupay_huifu_id'],
  197. 'sign_no'=>$card_info->sign_no,
  198. 'delay_acct_flag' => PayService::getSplitAccount($trade)
  199. ];
  200. $huifuService=new HuifuService($mall_id);
  201. $expireDate = time() + (91 * 60);
  202. $result = $huifuService->sendPaySms($data, $notify_url, $expireDate, $splitAccount);
  203. if($result)
  204. {
  205. //添加记录
  206. $order = new HuifuPayOrderModel();
  207. $order->mall_id = $trade->mall_id;
  208. $order->hf_order_no = $result['req_seq_id']; //汇付流水号
  209. $order->trade_no = $trade->out_trade_no;
  210. $order->created_at = time();
  211. $order->updated_at = time();
  212. $order->payment_id = $trade->id;
  213. $order->trade_type = 'fast_pay';
  214. $order->save();
  215. $trade->trade_type='fast_pay';
  216. $trade->save();
  217. }
  218. return $result;
  219. }
  220. }