MemberCoinService.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. <?php
  2. namespace app\service;
  3. use app\common\logic\PayHandle;
  4. use app\common\model\MemberCoinPay;
  5. use think\Config;
  6. use think\Db;
  7. use think\Request;
  8. class MemberCoinService
  9. {
  10. protected $payRequestLimit = 5; //重复下单的限制时间
  11. /**
  12. * 充值平台币
  13. */
  14. public function payCoin($data)
  15. {
  16. // 转换支付标识为指定的标识
  17. // if ($data['paytype'] == 'qmf_wxmp_h5') {
  18. // $data['paytype'] = 'yyyb_wx_h5';
  19. // }
  20. // if ($data['paytype'] == 'pay_h5_001') { // 备用支付 - 001
  21. // $data['paytype'] = 'test';
  22. // }
  23. // if ($data['paytype'] == 'pay_h5_002') { // 备用支付 - 001
  24. // $data['paytype'] = 'test';
  25. // }
  26. $pay_scene = $data['paytype'];
  27. if(!in_array($data['paytype'], ['wx_h5', 'ali_h5']) && $data['device'] != 4) {
  28. // ## 随机为新的支付渠道 ##
  29. if (version_compare($data['version'], config('pay_handle_version'), '>')) {
  30. $payType = [
  31. 'wx_h5' => ['qzl_wx_h5', 'ldys_wx_h5', 'ybzf_wxmp_h5', 'yyyb_wx_h5', 'xty_wx_h5', 'qmf_wxmp_h5'],
  32. 'ali_h5' => ['old-zfb-wap', 'ldys_zfb_h5', 'xty_ali_h5', 'yyyb_ali_h5'],
  33. 'ali_app' => ['zfb'],
  34. ];
  35. } else {
  36. $payType = [
  37. 'wx_h5' => ['qzl_wx_h5', 'ldys_wx_h5', 'ybzf_wxmp_h5', 'yyyb_wx_h5', 'xty_wx_h5', 'qmf_wxmp_h5'],
  38. 'ali_h5' => [],
  39. 'ali_app' => [],
  40. ];
  41. }
  42. $pay_scene = '';
  43. if (in_array($data['paytype'], $payType['wx_h5'])) {
  44. $pay_scene = 'wx_h5';
  45. } else if (in_array($data['paytype'], $payType['ali_h5'])) {
  46. $pay_scene = 'ali_h5';
  47. } else if (in_array($data['paytype'], $payType['ali_app'])) {
  48. $pay_scene = 'ali_app';
  49. } else {
  50. // 不能这样判断,因为会有ptb
  51. // return ['code' => -111, 'msg' => '支付方式有误!', 'data' => []];
  52. }
  53. }
  54. // 新版本+支持的支付方式才会走获取随机支付,没有则走默认配置的
  55. if ((version_compare($data['version'], config('pay_handle_version'), '>') && $pay_scene) || (isInArrType($payType, $data['paytype']) && $pay_scene)) {
  56. $newPayType = (new PayHandle())->getPayChannel($pay_scene, $data['gameid'], $data['version']);
  57. if (empty($newPayType['data']['paytype'])) {
  58. return ['data' => '', 'code' => -110, 'msg' => '支付配置有误!当前游戏或者版本未开启支付!'];
  59. }
  60. $data['paytype'] = $newPayType['data']['paytype'];
  61. } else {
  62. $setPayType = model('common/Setting')->where(['name' => 'OLD_PAY_WX_TYPE'])->value('value');
  63. if ($setPayType) {
  64. if (strstr($data['paytype'], 'qmf_wxmp_h5') !== false)
  65. {
  66. if ($data['paytype'] == 'qmf_wxmp_h5') {
  67. $data['paytype'] = $setPayType;
  68. }
  69. }
  70. }
  71. }
  72. // ## 随机为新的支付渠道 - END ##
  73. $payData['userid'] = $data['member_id'];
  74. $payData['orderid'] = makeOrderid('COIN');
  75. $payData['amount'] = $data['amount'];
  76. if (in_array($data['paytype'], ['airwallexh5', 'airwallex'])) {
  77. $paytypeInfo = model('common/PayType')->where('paytype', $data['paytype'])->find();
  78. $payData['real_amount'] = priceFormat($data['amount'] * (1 + $paytypeInfo['commission']));
  79. } else {
  80. $payData['real_amount'] = $data['amount'];
  81. }
  82. $payData['paytype'] = $data['paytype'];
  83. $payData['ip'] = $data['ip'];
  84. $payData['create_time'] = NOW_TIMESTAMP;
  85. $payData['place_user_id'] = $data['place_user_id'];
  86. // 启动事务
  87. Db::startTrans();
  88. try {
  89. //指定时间内,禁止重复下单
  90. $cacheKey = 'pay_duplicate_' . $payData['userid'] . '_' . 'coin';
  91. if (!requestDuplicateCheck($cacheKey, $this->payRequestLimit)) {
  92. return ['code' => 0, 'msg' => '充值请求过多,请于' . $this->payRequestLimit . 's以后,再次进行充值操作'];
  93. }
  94. if (!$id = (new MemberCoinPay())->insertGetId($payData)) {
  95. // 回滚事务
  96. Db::rollback();
  97. return ['code' => 0, 'msg' => '订单生成失败1'];
  98. }
  99. // 提交事务
  100. Db::commit();
  101. } catch (\Exception $e) {
  102. // 回滚事务
  103. Db::rollback();
  104. return ['code' => 0, 'msg' => '订单生成失败' . $e->getMessage()];
  105. }
  106. /**
  107. * 微信支付:
  108. * 可用:'qzl_wx_h5', 'ybzf_wxmp_h5', 'yyyb_wx_h5', 'xty_wx_h5'
  109. * 不可用:'ldys_wx_h5'
  110. *
  111. * 支付宝:
  112. * 可用:'xty_ali_h5', 'yyyb_ali_h5'
  113. * 不可用:'old-zfb-wap', 'ldys_zfb_h5'
  114. */
  115. try {
  116. $device = Request::instance()->header('device', 0, 'intval');
  117. //支付方式是支付宝扫码
  118. $payBody = '平台币';
  119. $pay = new PayService();
  120. $payData['productname'] = $payBody;
  121. $payData['pay_amount'] = $payData['amount'];
  122. $payData['gameid'] = $data['gameid'];
  123. $payInfoRes = [];
  124. if ($data['paytype'] == 'zfb') { // 支付宝-app 扫码(官方支付宝快捷支付)
  125. $notify_url = Config::get('ali_pay_config')['notify_coin_url'];
  126. $payInfoRes = $pay->getAlipayAopParam($payData['orderid'], $payData['amount'], $payBody, '', $notify_url);
  127. } elseif (in_array($data['paytype'], ['zfb-wap', 'old-zfb-wap'])) { //支付宝-h5(官方支付宝h5支付)带referer
  128. $notify_url = Config::get('ali_pay_config')['notify_coin_url'];
  129. $httpType = "POST";
  130. if($device == 4){
  131. $httpType = "GET";
  132. }
  133. $payInfoRes = $pay->getAlipayWapPostAopParam($payData['orderid'], $payData['amount'], $payBody, '', $notify_url, $httpType);
  134. } elseif (in_array($data['paytype'], ['wxpay-h5', 'wx-wap'])) { // 微信-h5
  135. if ($payData['amount'] > 3000) {
  136. return ['code' => 0, 'msg' => '微信单笔支付限额3000元,您可选择其它支付'];
  137. }
  138. $notify_url = Config::get('wxpay-h5')['notify_coin_url'];
  139. $payInfoRes = $pay->getWxpayH5Param($payData['orderid'], $payData['amount'], $payBody, $payData['ip'], $notify_url, $data['gameid']);
  140. } elseif ($data['paytype'] == 'ybzf_wxmp_h5') { // 易宝-wxmp_h5
  141. $notify_url = Config::get('ybzf_pay')['notify_coin_url'];
  142. $payInfoRes = $pay->getYbzfParam($data['paytype'], $payData['orderid'], $payData['amount'], $payBody, $notify_url);
  143. } elseif (in_array($data['paytype'], ['ldys_zfb', 'ldys_wx_h5'])) { // 联动优势-zfb_H5
  144. $payType = 'payZfbH5';
  145. if (in_array($data['paytype'], ['ldys_wx_h5'])) {
  146. $payType = 'payWxmpH5V2';
  147. }
  148. $payData['is_coin'] = 1;
  149. $payInfoRes = $pay->getldysParam($payData, $payType);
  150. } elseif ($data['paytype'] == 'qzl_wx_h5') { // 趣智连-wxmp_h5
  151. $payData['notify_url'] = Config::get('qzl_pay')['notify_coin_url'];
  152. $payInfoRes = $pay->getqzlParam($payData, 'payWxH5');
  153. } elseif (in_array($data['paytype'], ['yyyb_wx_h5', 'yyyb_ali_h5'])) { // 优亿支付-H5
  154. $payData['notify_url'] = Config::get('yyyb_pay')['notify_coin_url'];
  155. $payType = 'WX_H5';
  156. if (in_array($data['paytype'], ['yyyb_ali_h5'])) {
  157. $payType = 'ALI_H5';
  158. }
  159. $payInfoRes = $pay->getYyYbPayParam($payData, $payType);
  160. } elseif (in_array($data['paytype'], ['xty_wx_h5', 'xty_ali_h5'])) { // 喜钛游支付-H5
  161. $payData['notify_url'] = Config::get('xty_pay')['notify']['notify_coin_url'];
  162. $payType = 'payWxH5';
  163. if (in_array($data['paytype'], ['xty_ali_h5'])) {
  164. $payType = 'payAliH5';
  165. }
  166. $payInfoRes = $pay->getXtyPayParam($payData, $payType);
  167. } elseif ($data['paytype'] == 'test') {
  168. return ['data' => '', 'code' => 0, 'msg' => '当前支付方式开发中...'];
  169. }
  170. if($payInfoRes && $data['paytype'] != 'coinpay'){
  171. if($payInfoRes['error'] == true){
  172. trace("充值方式下单失败 - {$data['paytype']}: " . json_encode($payInfoRes), 'MemberCoinService@payCoin.$payInfoRes');
  173. ddMsg("warning", '', ['充值方式-'.$data['paytype'], $payInfoRes['msg'], json_encode(['orderid'=>$payData['orderid'], 'username' => $data['username'], 'gameid'=>$data['gameid']], JSON_UNESCAPED_UNICODE)]);
  174. return ['data' => '', 'code' => 0, 'msg' => $payInfoRes['msg']];
  175. }
  176. // TODO: 新加支付方式时,这块判断要加上
  177. if (in_array($data['paytype'], ['zfb'])) {
  178. $result = ['alipay_app_param' => $payInfoRes['data'], 'wxpayh5_param' => ['mweb_url' => '']];
  179. } elseif (in_array($data['paytype'], ['old-zfb-wap', 'xty_ali_h5', 'ldys_zfb', 'yyyb_ali_h5'])) {
  180. $result = ['alipay_param' => $payInfoRes['data']];
  181. if($device == 4){
  182. $result = ['pay_url' => $payInfoRes['data']['mweb_url']];
  183. }
  184. } elseif (in_array($data['paytype'], ['wxpay-h5', 'ybzf_wxmp_h5', 'wx-wap', 'qzl_wx_h5', 'qzl_wx_h5', 'ldys_wx_h5', 'yyyb_wx_h5', 'ybzf_wxmp_h5', 'qmf_wxmp_h5', 'xty_wx_h5'])) {
  185. $result = ['wxpayh5_param' => $payInfoRes['data']];
  186. if($device == 4){
  187. $result = ['pay_url' => $payInfoRes['data']['mweb_url']];
  188. }
  189. } else {
  190. return ['data' => '', 'code' => 0, 'msg' => $data['paytype'].' - 订单支付类型配置有误!!'];
  191. }
  192. }
  193. $result['orderid'] = $payData['orderid'];
  194. $result['paytype'] = $data['paytype'];
  195. return ['code' => 1, 'msg' => '订单生成成功', 'data' => $result];
  196. } catch (\Exception $e) {
  197. // 回滚事务
  198. // Db::rollback();
  199. return ['code' => 0, 'msg' => '订单生成失败:' . $e->getMessage()];
  200. }
  201. }
  202. }