GamePayService_bak.php 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639
  1. <?php
  2. namespace app\service;
  3. use app\common\logic\PayHandle;
  4. use app\common\model\ChannelFrozen;
  5. use app\common\model\Cpurl;
  6. use app\common\model\Members;
  7. use app\common\model\Game;
  8. use app\common\model\Pay as PayModel;
  9. use app\common\model\PayCpinfo;
  10. use app\common\model\MemberChannelGame;
  11. use app\common\logic\Pay as PayLogic;
  12. use app\common\model\Subaccount;
  13. use think\Config;
  14. use think\Db;
  15. use think\Exception;
  16. use app\common\model\App;
  17. class GamePayService_bak
  18. {
  19. protected $payRequestLimit = 5; //重复下单的限制时间
  20. /**
  21. * 游戏支付
  22. * @param $data
  23. */
  24. public function gamePay($data, $urlType = 1)
  25. {
  26. // ## 随机为新的支付渠道 ##
  27. $paytype = $data['paytype'];// 支付方式
  28. $pay_scene = $data['paytype'];
  29. if(!in_array($paytype, ['wx_h5', 'ali_h5', 'ali_app']) && $data['device'] != 4){
  30. if (version_compare($data['version'], config('pay_handle_version'), '>')) {
  31. $payType = [
  32. 'wx_h5' => ['qzl_wx_h5', 'ldys_wx_h5', 'ybzf_wxmp_h5', 'yyyb_wx_h5', 'xty_wx_h5', 'qmf_wxmp_h5'],
  33. 'ali_h5' => ['old-zfb-wap', 'ldys_zfb_h5', 'xty_ali_h5', 'yyyb_ali_h5'],
  34. 'ali_app' => ['zfb'],
  35. ];
  36. } else {
  37. $payType = [
  38. 'wx_h5' => ['qzl_wx_h5', 'ldys_wx_h5', 'ybzf_wxmp_h5', 'yyyb_wx_h5', 'xty_wx_h5', 'qmf_wxmp_h5'],
  39. 'ali_h5' => ['old-zfb-wap', 'xty_ali_h5'],
  40. 'ali_app' => [],
  41. ];
  42. }
  43. $newPayType = handlePayType($payType);
  44. if (in_array($data['paytype'], $newPayType['wx_h5'])) {
  45. $pay_scene = 'wx_h5';
  46. } else if (in_array($data['paytype'], $newPayType['ali_h5'])) {
  47. $pay_scene = 'ali_h5';
  48. } else if (in_array($data['paytype'], $newPayType['ali_app'])) {
  49. $pay_scene = 'ali_app';
  50. } else {
  51. // 不能这样判断,因为会有ptb
  52. // return ['code' => -111, 'msg' => '支付方式有误!', 'data' => []];
  53. }
  54. }
  55. // 新版本+支持的支付方式才会走获取随机支付,没有则走默认配置的
  56. if ((version_compare($data['version'], config('pay_handle_version'), '>') && $pay_scene) || (isInArrType($newPayType, $paytype) && $pay_scene)) {
  57. $newPayType = (new PayHandle())->getPayChannel($pay_scene, $data['gameid'], $data['version']);
  58. if (empty($newPayType['data']['paytype'])) {
  59. return ['data' => '', 'code' => -110, 'msg' => '支付配置有误!当前游戏或者版本未开启支付!'];
  60. }
  61. $paytype = $newPayType['data']['paytype'];
  62. if (substr($data['paytype'], 0, 4) == 'mix-') {
  63. $data['paytype'] = 'mix-' . $paytype;
  64. } else if (substr($data['paytype'], 0, 5) == 'coin-') {
  65. $data['paytype'] = 'coin-' . $paytype;
  66. } else {
  67. $data['paytype'] = $newPayType['data']['paytype'];
  68. }
  69. } else {
  70. // 老版支付使用指定
  71. $setPayType = model('common/Setting')->where(['name' => 'OLD_PAY_WX_TYPE'])->value('value');
  72. if ($setPayType) {
  73. if (strstr($data['paytype'], 'qmf_wxmp_h5') !== false) {
  74. $paytype = $setPayType;
  75. if ($data['paytype'] == 'qmf_wxmp_h5') {
  76. $data['paytype'] = $setPayType;
  77. } else if ($data['paytype'] == 'mix-qmf_wxmp_h5') {
  78. $data['paytype'] = 'mix-' . $setPayType;
  79. } else if ($data['paytype'] == 'coin-qmf_wxmp_h5') {
  80. $data['paytype'] = 'coin-' . $setPayType;
  81. }
  82. }
  83. }
  84. }
  85. // ## 随机为新的支付渠道 - END ##
  86. $time = NOW_TIMESTAMP;
  87. $data['orderid'] = $orderid = makeOrderid();
  88. $pay_status = 0; //cy_pay表的支付状态
  89. $cp_payflag = 0; //cy_paycpinfo表的支付状态
  90. $memberModel = new Members();
  91. $frozenModel = new ChannelFrozen();
  92. $cpurlModel = new Cpurl();
  93. $gameModel = new Game;
  94. $payModel = new PayModel;
  95. $payCpinfoModel = new PayCpinfo;
  96. $memberChannelGameModel = new MemberChannelGame;
  97. $payLogic = new PayLogic();
  98. //当前游戏的包是否禁止消费(非归属渠道)
  99. if (isFrozenOption($data['channel_id'], $data['gameid'], 'consume')) {
  100. return ['data' => '', 'code' => 0, 'msg' => '您所在渠道已经被禁止在此游戏消费'];
  101. }
  102. if (empty($data['ptb_amt']) && (substr($data['paytype'], 0, 4) == 'mix-' || $data['paytype'] == 'ptb')) {
  103. return ['code' => 0, 'msg' => '请输入专属币使用数量'];
  104. }
  105. if (empty($data['coin_amt']) && (substr($data['paytype'], 0, 5) == 'coin-' || $data['paytype'] == 'coinpay')) {
  106. return ['code' => 0, 'msg' => '请输入平台币使用数量'];
  107. }
  108. if (empty($data['coupon_member_id']) && $data['paytype'] == 'coupon') {
  109. return ['code' => 0, 'msg' => '请选择代金券'];
  110. }
  111. $memberInfo = $memberModel->field('id,username,amount')->where(['id' => $data['member_id']])->find();
  112. if (empty($memberInfo)) {
  113. return ['code' => 0, 'msg' => '用户不存在'];
  114. }
  115. //子账号用户名
  116. $subaccountData = (new Subaccount())->field(['sub_username', 'channel_id'])->where(['member_id' => $data['member_id'], 'game_id' => $data['gameid']])->find();
  117. $data['sub_username'] = $subaccountData['sub_username']??'';
  118. if (!$data['sub_username']) {
  119. return ['data' => '', 'code' => 0, 'msg' => '账号异常'];
  120. }
  121. //玩家在这款游戏的归属渠道
  122. $data['channel_id'] = $subaccountData['channel_id']??'';
  123. // $channel_id = $memberChannelGameModel->where(['member_id' => $data['member_id'], 'game_id' => $data['gameid']])->value('channel_id');
  124. if (empty($data['channel_id'])) {
  125. return ['data' => '', 'code' => 0, 'msg' => '无关联的归属渠道信息'];
  126. }
  127. // $data['channel_id'] = $channel_id;
  128. //判断渠道包是否合法
  129. $channelInfo = model('Channel')->where(['status' => 1, 'id' => $data['channel_id']])->find();
  130. if (!$channelInfo && intval($data['channel_id']) <> config('EMPTY_CHANNEL_ID')) {
  131. return ['data' => '', 'code' => 0, 'msg' => '当前渠道已禁用'];
  132. } else if ($channelInfo['level'] <> 3) {
  133. return ['data' => '', 'code' => 0, 'msg' => '非推广员渠道,不能进行推广,请联系客服'];
  134. }
  135. //当前游戏的渠道是否禁止消费(非归属渠道)
  136. if (isFrozenOption($data['channel_id'], $data['gameid'], 'consume')) {
  137. return ['data' => '', 'code' => 0, 'msg' => '您所在渠道已经被禁止在此游戏消费'];
  138. }
  139. $appModel = new App();
  140. if (!isset($data['appInfo'])) {
  141. $data['appInfo'] = $appModel->field('id,appkey,client_appkey,gameid')->where(['gameid' => $data['gameid']])->find()->toArray();
  142. }
  143. //充值回调地址
  144. if ($urlType == 1) {
  145. $cpurl = $cpurlModel->where(['appid' => $data['appInfo']['id']])->value('url');
  146. } else {
  147. $cpurl = $cpurlModel->where(['appid' => $data['appInfo']['id']])->value('web_url');
  148. if (!$gameServerInfo = model('GameServer')->field('serverid,servername')->where(['game_id' => $data['gameid'], 'serverid' => $data['serverid']])->find()) {
  149. return ['data' => '', 'code' => 0, 'msg' => '游戏区服id参数错误'];
  150. }
  151. $data['servername'] = $gameServerInfo['servername'];
  152. if (!$memberGameServerInfo = model('MemberGameServer')->where(['member_id' => $data['member_id'], 'game_id' => $data['gameid'], 'serverid' => $data['serverid'], 'roleid' => $data['roleid']])->find()) {
  153. return ['data' => '', 'code' => 0, 'msg' => '游戏角色信息不存在'];
  154. }
  155. $data['rolename'] = $memberGameServerInfo['rolename'];
  156. $data['rolelevel'] = $memberGameServerInfo['rolelevel'];
  157. }
  158. if (empty($cpurl)) {
  159. return ['data' => '', 'code' => 0, 'msg' => '没有回调地址,请通知我方配置'];
  160. }
  161. //游戏信息
  162. $gameInfo = $gameModel->field('order_recheck,is_pay')->where(['id' => $data['gameid']])->find();
  163. if (empty($gameInfo)) {
  164. return ['data' => '', 'code' => 0, 'msg' => '游戏id参数错误'];
  165. }
  166. if ($gameInfo['is_pay'] != 1) {
  167. return ['data' => '', 'code' => 0, 'msg' => '游戏已停止充值'];
  168. }
  169. if ($data['amount'] > 100000) {
  170. return ['data' => '', 'code' => 0, 'msg' => '您的充值金额过大,请确认是否为合法充值'];
  171. }
  172. $data['discount'] = $discount = getDiscount($data['member_id'], $data['gameid'], $data['channel_id']); // 折扣比例
  173. if ($data['ptb_amt'] > 0 && $data['coin_amt'] > 0) {
  174. return ['data' => '', 'code' => 0, 'msg' => '平台币和专属币不能同时使用'];
  175. }
  176. $data['coupon_amount'] = 0;
  177. $amount = $data['amount'];
  178. //代金券使用
  179. if ($data['coupon_member_id'] > 0) {
  180. $list = model('common/CouponMember')->getPayCoupon($data['member_id'], $data['gameid'], $data['amount'], $data['coupon_member_id']);
  181. if (count($list) != 1) {
  182. return ['data' => '', 'code' => 0, 'msg' => '代金券不存在'];
  183. }
  184. if ($list[0]['is_pay'] != 1) {
  185. return ['data' => '', 'code' => 0, 'msg' => '代金券不可使用'];
  186. }
  187. if ($list[0]['money'] > $data['amount']) {
  188. if ($data['paytype'] != 'coupon') {
  189. return ['data' => '', 'code' => 0, 'msg' => '支付类型错误'];
  190. }
  191. $data['coupon_amount'] = $data['amount'];
  192. $amount = 0;
  193. } else {
  194. $data['coupon_amount'] = $list[0]['money'];
  195. $amount = priceFormat($data['amount'] - $data['coupon_amount']);
  196. }
  197. }
  198. //有使用专属币时
  199. if (!empty($data['ptb_amt'])) {
  200. if ($data['ptb_amt'] > $amount) {
  201. return ['data' => '', 'code' => 0, 'msg' => '游戏专属币支付金额选择异常,平台币使用金额大于总金额'];
  202. }
  203. $userCoinInfo = model('MemberZscoin')->field('id,userid,username,game_id,amount,status')->where(['userid' => $data['member_id'], 'game_id' => $data['gameid']])->find();
  204. if (empty($userCoinInfo)) {
  205. return ['data' => '', 'code' => 0, 'msg' => '您的游戏专属币余额不足'];
  206. } else if (!$userCoinInfo['status']) {
  207. return ['data' => '', 'code' => 0, 'msg' => '您的游戏专属币账户已被冻结,不能使用'];
  208. } else if ($userCoinInfo['amount'] < $data['ptb_amt']) {
  209. return ['data' => '', 'code' => 0, 'msg' => '您的游戏专属币余额不足'];
  210. }
  211. $arrPayAmount = $payLogic->calPayAmount($amount, $data['ptb_amt'],$discount);
  212. } else if (!empty($data['coin_amt'])) { //有使用平台币时
  213. if ($data['coin_amt'] > $amount) {
  214. return ['data' => '', 'code' => 0, 'msg' => '游戏平台币支付金额选择异常,平台币使用金额大于总金额'];
  215. }
  216. if ($memberInfo['amount'] < $data['coin_amt']) {
  217. return ['data' => '', 'code' => 0, 'msg' => '您的游戏平台币余额不足'];
  218. }
  219. $arrPayAmount = $payLogic->calCoinPayAmount($amount, $data['coin_amt'],$discount);
  220. } else{
  221. $arrPayAmount = $payLogic->calPayAmount($amount,0,$discount);
  222. }
  223. // // 全民付 替换其他支付
  224. // if (strstr($data['paytype'], 'qmf_wxmp_h5')) {
  225. // if ($data['paytype'] == 'qmf_wxmp_h5') {
  226. // $data['paytype'] = 'yyyb_wx_h5';
  227. // } else if ($data['paytype'] == 'mix-qmf_wxmp_h5') {
  228. // $data['paytype'] = 'mix-yyyb_wx_h5';
  229. // } else if ($data['paytype'] == 'coin-qmf_wxmp_h5') {
  230. // $data['paytype'] = 'coin-yyyb_wx_h5';
  231. // }
  232. // }
  233. // // ## 支付方式适配 -- 未使用
  234. // if (strstr($data['paytype'], 'pay_h5_001')) { // 备用支付 - 001
  235. // if ($data['paytype'] == 'pay_h5_001') {
  236. // $data['paytype'] = 'test';
  237. // } else if($data['paytype'] == 'mix-pay_h5_001'){
  238. // $data['paytype'] = 'mix-test';
  239. // } else if($data['paytype'] == 'coin-pay_h5_001'){
  240. // $data['paytype'] = 'coin-test';
  241. // }
  242. // }
  243. // if (strstr($data['paytype'], 'pay_h5_002')) { // 备用支付 - 002
  244. // if ($data['paytype'] == 'pay_h5_002') {
  245. // $data['paytype'] = 'test';
  246. // } else if($data['paytype'] == 'mix-pay_h5_002'){
  247. // $data['paytype'] = 'mix-test';
  248. // } else if($data['paytype'] == 'coin-pay_h5_002'){
  249. // $data['paytype'] = 'coin-test';
  250. // }
  251. // }
  252. //实际支付金额为0时
  253. if ($arrPayAmount['real_amount'] == 0) {
  254. $pay_status = 1; //支付成功
  255. $cp_payflag = 1;
  256. //付款时间
  257. $payData['pay_time'] = NOW_TIMESTAMP;
  258. } elseif ($arrPayAmount['real_amount'] > 0 && $data['paytype'] == 'ptb') {//有实际支付金额并且支付方式是平台币时
  259. return ['data' => '', 'code' => 0, 'msg' => '平台币余额不足,请使用混合支付'];
  260. } elseif ($arrPayAmount['real_amount'] > 0 && $arrPayAmount['real_ptb'] > 0 && substr($data['paytype'], 0, 4) <> 'mix-') {
  261. return ['data' => '', 'code' => 0, 'msg' => '请选择正确的支付方式.'];
  262. } //有实际支付金额并且支付方式是平台币时
  263. elseif ($arrPayAmount['real_amount'] > 0 && $data['paytype'] == 'coinPay') {
  264. return ['data' => '', 'code' => 0, 'msg' => '平台币余额不足,请使用混合支付'];
  265. } elseif ($arrPayAmount['real_amount'] > 0 && $arrPayAmount['real_coin'] > 0 && substr($data['paytype'], 0, 5) <> 'coin-') {
  266. return ['data' => '', 'code' => 0, 'msg' => '请选择正确的支付方式..'];
  267. }
  268. //指定时间内,禁止重复下单
  269. if (!requestDuplicateCheck('pay_duplicate_' . $data['member_id'] . '_' . $data['gameid'], $this->payRequestLimit)) {
  270. return ['data' => '', 'code' => 0, 'msg' => '充值请求过多,请于' . $this->payRequestLimit . 's以后,再次进行充值操作'];
  271. }
  272. //订单已重复
  273. if ($payModel->where(['attach' => $data['attach'], 'gameid' => $data['gameid']])->find()) {
  274. //解锁
  275. requestDuplicateCheckUnlock('pay_duplicate_' . $data['member_id'] . '_' . $data['gameid']);
  276. return ['data' => '', 'code' => 0, 'msg' => '游戏合作方的订单参数不能重复'];
  277. }
  278. //游戏防沉迷限制
  279. $authentication = (new CommonService())->authentication($data['member_id'], $data['gameid'], $data['amount']);
  280. if ($authentication['code'] == 0) {
  281. return $authentication;
  282. }
  283. //海外支付添加比例
  284. if (in_array($data['paytype'], ['airwallexh5', 'airwallex', 'coin-airwallexh5', 'coin-airwallex'])) {
  285. $airPaytype = $data['paytype'];
  286. if ($data['paytype'] == 'coin-airwallexh5') {
  287. $airPaytype = 'airwallexh5';
  288. } elseif ($data['paytype'] == 'coin-airwallex') {
  289. $airPaytype = 'airwallex';
  290. }
  291. $paytypeInfo = model('common/PayType')->where('paytype', $airPaytype)->find();
  292. $arrPayAmount['real_amount'] = priceFormat($arrPayAmount['real_amount'] * (1 + $paytypeInfo['commission']));
  293. }
  294. //订单参数
  295. $payData = $this->orderData($data, $arrPayAmount, $memberInfo, $gameInfo, $pay_status);
  296. try {
  297. // 启动事务
  298. Db::startTrans();
  299. $id = $payModel->insertGetId($payData);
  300. //如果是自己聚合自己时,支付回调地址固定
  301. if (mb_substr($data['attach'], 0, 8, 'UTF-8') == 'xkhyn###') {
  302. $cpurl = Config::get('self_complex_callback_url');
  303. $attach = str_replace("xkhyn###", "", $data['attach']); //聚合的订单编号,去掉[aoyou###]前缀
  304. } else {
  305. $attach = $data['attach'];
  306. }
  307. //给Cp的用户名用子账号名
  308. $paycp_username = (!empty($data['sub_username']) ? $data['sub_username'] : $memberInfo['username']);
  309. $str = "orderid=" . urlencode($orderid) . "&username=" . urlencode($paycp_username) . "&gameid=" . $data['gameid'] . "&roleid=" . urlencode($data['roleid']) . "&serverid=" . urlencode($data['serverid']) . "&paytype=" . urlencode($data['paytype']) . "&amount=" . $data['amount'] . "&paytime=" . $time . "&attach=" . urlencode($attach);
  310. $param = $str . "&appkey=" . urlencode($data['appInfo']['appkey']);
  311. $md5params = md5($param);
  312. $params = $str . "&sign=" . urlencode($md5params);
  313. // 订单通知游戏数据
  314. // log_message('order_id: ' . $orderid .' - URL: '. $cpurl ." - sign_data: ".$param. " - md5: ". $md5params, 'log', LOG_PATH . 'notify_msg/');
  315. trace('CP_SIGN - order_id: ' . $orderid .' - URL: '. $cpurl ." - sign_data: ".$param. " - md5: ". $md5params, 'GamePayService@gamePay.cp_notify_body');
  316. $paycpData['orderid'] = $orderid;
  317. $paycpData['fcallbackurl'] = $cpurl;
  318. $paycpData['params'] = $params;
  319. $paycpData['create_time'] = $time;
  320. $paycpData['payflag'] = $cp_payflag;
  321. //写入cy_paycpinfo表数据
  322. $payCpinfoModel->insert($paycpData);
  323. //代金券状态修改
  324. if ($payData['coupon_amount'] > 0) {
  325. if(!$payLogic->saveCouponData($payData)){
  326. return ['data' => '', 'code' => 0, 'msg' => '代金券使用失败'];
  327. }
  328. }
  329. //如果使用了专属币
  330. if ($arrPayAmount['real_ptb'] > 0) {
  331. $payLogic->saveCoinData($userCoinInfo, $payData);
  332. } else if ($arrPayAmount['real_coin'] > 0) {
  333. if (!$payLogic->saveCoinPayData($memberInfo, $payData)) {
  334. return ['data' => '', 'code' => 0, 'msg' => '金额异常.'];
  335. }
  336. }else if($payData['paytype'] == 'coupon'){
  337. //纯代金券支付
  338. }else {
  339. // $arrPayAmount = $payLogic->calPayAmount($payData['amount']);
  340. if ($arrPayAmount['real_amount'] <= 0) {
  341. return ['data' => '', 'code' => 0, 'msg' => '金额异常..'];
  342. }
  343. }
  344. $real_amount = $arrPayAmount['real_amount'];
  345. //全部平台币支付,并且支付成功时
  346. if ($pay_status) {
  347. //更新member表的total_pay_amount
  348. $memberModel->where(['id' => $data['member_id']])->update(['total_pay_amount' => Db::raw('total_pay_amount+' . $data['amount']), 'update_time' => time()]);
  349. }
  350. // 提交事务
  351. Db::commit();
  352. } catch (Exception $e) {
  353. // 回滚事务
  354. Db::rollback();
  355. return ['data' => '', 'code' => 0, 'msg' => '订单生成失败: ' . $e->getMessage()];
  356. }
  357. try {
  358. //第三方支付用的商品简单描述 (去除&+等特殊字符)
  359. $payBody = preg_replace("/[\&\+]+/", '', $data['productname']);
  360. $pay = new PayService();
  361. $payData['real_amount'] = $real_amount;
  362. // dump($payData);
  363. $payInfoRes = [];
  364. if (in_array($data['paytype'], ['zfb', 'coin-zfb', 'mix-zfb', 'coin-mix-zfb'])) { // 支付宝-app
  365. $notify_url = Config::get('ali_pay_config')['notify_url'];
  366. $payInfoRes = $pay->getAlipayAopParam($orderid, $real_amount, $payBody, '', $notify_url);
  367. } elseif (in_array($data['paytype'], ['old-zfb-wap', 'coin-old-zfb-wap', 'mix-old-zfb-wap', 'coin-mix-old-zfb-wap'])) { // 支付宝-h5
  368. $notify_url = Config::get('ali_pay_config')['notify_url'];
  369. $payInfoRes = $pay->getAlipayWapPostAopParam($orderid, $real_amount, $payBody, '', $notify_url);
  370. } elseif (in_array($data['paytype'], ['wxpay-h5', 'coin-wxpay-h5', 'wx-wap', 'coin-wx-wap'])) { // 微信-h5
  371. if ($real_amount > 3000) {
  372. requestDuplicateCheckUnlock('pay_duplicate_' . $data['member_id'] . '_' . $data['gameid']);
  373. return ['data' => '', 'code' => 0, 'msg' => '微信单笔支付限额3000元,您可选择其它支付'];
  374. }
  375. $notify_url = Config::get('wxpay-h5')['notify_url'];
  376. $payInfoRes = $pay->getWxpayH5Param($orderid, $real_amount, $payBody, $data['ip'], $notify_url, $data['gameid']);
  377. } elseif (in_array($data['paytype'], ['ybzf_wxmp_h5', 'coin-ybzf_wxmp_h5', 'mix-ybzf_wxmp_h5'])) { // 易宝wxmp-h5
  378. $notify_url = Config::get('ybzf_pay')['notify_url'];
  379. $payInfoRes = $pay->getYbzfParam($data['paytype'], $orderid, $real_amount, $payBody, $notify_url);
  380. } elseif (in_array($data['paytype'], ['ldys_zfb_h5', 'coin-ldys_zfb_h5', 'mix-ldys_zfb_h5', 'ldys_wx_h5', 'coin-ldys_wx_h5', 'mix-ldys_wx_h5'])) { // 联动优势
  381. $payType = 'payZfbH5';
  382. if (in_array($data['paytype'], ['ldys_wx_h5', 'coin-ldys_wx_h5', 'mix-ldys_wx_h5'])) {
  383. $payType = 'payWxmpH5V2';
  384. }
  385. $payData['is_coin'] = 0;
  386. $payInfoRes = $pay->getldysParam($payData, $payType);
  387. } elseif (in_array($data['paytype'], ['qzl_wx_h5', 'coin-qzl_wx_h5', 'mix-qzl_wx_h5'])) { // 趣智连支付-H5
  388. $payData['notify_url'] = Config::get('qzl_pay')['notify_url'];
  389. $payInfoRes = $pay->getqzlParam($payData, 'payWxH5');
  390. } elseif (in_array($data['paytype'], ['yyyb_wx_h5', 'coin-yyyb_wx_h5', 'mix-yyyb_wx_h5', 'yyyb_ali_h5', 'coin-yyyb_ali_h5', 'mix-yyyb_ali_h5'])) { // 优亿支付-H5
  391. $payData['notify_url'] = Config::get('yyyb_pay')['notify_url'];
  392. $payType = 'WX_H5';
  393. if (in_array($data['paytype'], ['yyyb_ali_h5', 'coin-yyyb_ali_h5', 'mix-yyyb_ali_h5'])) {
  394. $payType = 'ALI_H5';
  395. }
  396. $payInfoRes = $pay->getYyYbPayParam($payData, $payType);
  397. } elseif (in_array($data['paytype'], ['xty_wx_h5', 'coin-xty_wx_h5', 'mix-xty_wx_h5', 'xty_ali_h5', 'coin-xty_ali_h5', 'mix-xty_ali_h5'])) { // 喜钛游支付-H5
  398. $payData['notify_url'] = Config::get('xty_pay')['notify']['notify_url'];
  399. $payType = 'payWxH5';
  400. if (in_array($data['paytype'], ['xty_ali_h5', 'coin-xty_ali_h5', 'mix-xty_ali_h5'])) {
  401. $payType = 'payAliH5';
  402. }
  403. $payInfoRes = $pay->getXtyPayParam($payData, $payType);
  404. } elseif (in_array($data['paytype'], ['test', 'coin-test', 'mix-test'])) {
  405. return ['data' => '', 'code' => 0, 'msg' => "当前支付方式开发中..."];
  406. }
  407. if($data['device'] == 4){
  408. }
  409. // TODO: 新加支付方式时,这块判断要加上支付方式的返回判断。
  410. if ($payInfoRes && $data['paytype'] != 'coinpay') {
  411. if ($payInfoRes['error'] == true) {
  412. trace("支付方式下单失败 - {$data['paytype']}: " . json_encode($payInfoRes), 'GamePayService@gamePay.$payInfoRes');
  413. ddMsg("warning", '', ['支付方式-' . $data['paytype'], $payInfoRes['msg'], json_encode(['orderid' => $orderid, 'username' => $paycp_username, 'gameid' => $data['gameid']], JSON_UNESCAPED_UNICODE)]);
  414. return ['data' => '', 'code' => 0, 'msg' => "发起下单失败!(" . $data['paytype'] . ")"];
  415. }
  416. if (in_array($data['paytype'], ['zfb', 'coin-zfb', 'mix-zfb', 'coin-mix-zfb'])) {
  417. $result = ['alipay_app_param' => $payInfoRes['data'], 'wxpayh5_param' => ['mweb_url' => '']];
  418. } elseif (in_array($data['paytype'], [
  419. 'old-zfb-wap', 'coin-old-zfb-wap', 'mix-old-zfb-wap', 'coin-mix-old-zfb-wap',
  420. 'ldys_zfb_h5', 'coin-ldys_zfb_h5', 'mix-ldys_zfb_h5',
  421. 'yyyb_ali_h5', 'coin-yyyb_ali_h5', 'mix-yyyb_ali_h5',
  422. 'xty_ali_h5', 'coin-xty_ali_h5', 'mix-xty_ali_h5',
  423. ])) {
  424. $result = ['alipay_param' => $payInfoRes['data']];
  425. } elseif (in_array($data['paytype'], [
  426. 'wxpay-h5', 'coin-wxpay-h5',
  427. 'wx-wap', 'coin-wx-wap',
  428. 'qzl_wx_h5', 'coin-qzl_wx_h5', 'mix-qzl_wx_h5',
  429. 'qmf_wxmp_h5', 'coin-qmf_wxmp_h5', 'mix-qmf_wxmp_h5',
  430. 'ybzf_wxmp_h5', 'coin-ybzf_wxmp_h5', 'mix-ybzf_wxmp_h5',
  431. 'ldys_wx_h5', 'coin-ldys_wx_h5', 'mix-ldys_wx_h5',
  432. 'yyyb_wx_h5', 'coin-yyyb_wx_h5', 'mix-yyyb_wx_h5',
  433. 'xty_wx_h5', 'coin-xty_wx_h5', 'mix-xty_wx_h5'
  434. ])) {
  435. $result = ['wxpayh5_param' => $payInfoRes['data']];
  436. } else {
  437. return ['data' => '', 'code' => 0, 'msg' => '支付渠道未配置返回类型!'];
  438. }
  439. }
  440. // TODO: 有使用时,在开启
  441. // if ($data['paytype'] == 'zfb-h5') {
  442. // // 支付宝H5支付
  443. // $notify_url = Config::get('alipayAop')['notify_url'];
  444. // $alipayParam = $pay->getAlipayWapAopParam($orderid, $real_amount, $payBody, '', $notify_url);
  445. // $result = ['alipay_param' => $alipayParam];
  446. //
  447. // } elseif ($data['paytype'] == 'zfb-wap' || $data['paytype'] == 'mix-zfb-wap' || $data['paytype'] == 'coin-zfb-wap') {
  448. // // 支付宝WAP
  449. // $notify_url = Config::get('alipayAop')['notify_url'];
  450. // $alipayParam = $pay->getAlipayWapPostAopParam($orderid, $real_amount, $payBody, '', $notify_url);
  451. // $result = ['alipay_param' => $alipayParam];
  452. //
  453. // } elseif ($data['paytype'] == 'wx-wap' || $data['paytype'] == 'mix-wx-wap' || $data['paytype'] == 'coin-wx-wap') {
  454. // // 微信汇付宝支付参数
  455. // $notify_url = Config::get('wxwappay-h5')['notify_url'];
  456. // $wxParam = $pay->getWxWapPostAopParam($orderid, $real_amount, $payBody, '', $data['ip'], $notify_url);
  457. // $result = ['wxpayh5_param' => $wxParam];
  458. //
  459. // } elseif ($data['paytype'] == 'wxsmzf' || $data['paytype'] == 'mix-wxsmzf' || $data['paytype'] == 'coin-wxsmzf') {
  460. // // 微信汇付宝扫码支付参数
  461. // $notify_url = Config::get('wxwappay-h5')['notify_url'];
  462. // $wxsmParam = $pay->getWxWapsmPostAopParam($orderid, $real_amount, $payBody, '', $data['ip'], $notify_url);
  463. // $result = ['wxpaysm_param' => $wxsmParam];
  464. //
  465. // } elseif ($data['paytype'] == 'kdh5' || $data['paytype'] == 'mix-kdh5' || $data['paytype'] == 'coin-kdh5') {
  466. // $notify_url = Config::get('kdh5')['notify_url'];
  467. // $kdh5_param = $pay->getkdh5weixinParam($orderid, $real_amount, $payBody, $notify_url);
  468. // $result = ['kdh5_param' => $kdh5_param];
  469. //
  470. // } elseif ($payData['paytype'] == 'kdsm' || $data['paytype'] == 'mix-kdsm' || $data['paytype'] == 'coin-kdsm') {
  471. // // 微信扫码 酷点扫码
  472. // $notify_url = Config::get('kdh5')['notify_url'];
  473. // if (!$kdsm_param = $pay->getkdsmweixinParam($payData['orderid'], $real_amount, $payBody, $notify_url)) {
  474. // return ['code' => 0, 'msg' => '订单生成失败'];
  475. // }
  476. // $dataPay = [
  477. // 'id' => $id,
  478. // 'orderid' => $payData['orderid'],
  479. // 'kdsm_param' => $kdsm_param,
  480. // 'real_amount' => priceFormat($real_amount),
  481. // 'create_time' => date('Y-m-d', $payData['create_time']),
  482. // 'goods' => $data['productname'],
  483. // ];
  484. // $pay_url = Config::get('kdh5')['pay_url'] . '?data=' . opensslEncrypt(json_encode($dataPay));
  485. // $result = ['kdsm_param' => ['mweb_url' => $pay_url]];
  486. //
  487. // } elseif ($data['paytype'] == 'zfbsmzf' || $data['paytype'] == 'mix-zfbsmzf' || $data['paytype'] == 'coin-zfbsmzf') {
  488. // // 支付宝扫码支付
  489. // $notify_url = Config::get('alipayAop')['notify_url'];
  490. // $qrcodePay = $pay->chargeByZfbWap($orderid, $real_amount, $payBody, '', $notify_url);
  491. // $result1['mweb_url'] = $qrcodePay;
  492. // $result['zfbsmzf_param'] = $result1;
  493. // $result['orderid'] = $orderid;
  494. // $result['referer'] = "com.yiyou.zfb";
  495. //
  496. // } elseif ($data['paytype'] == 'xzzfbzf' || $data['paytype'] == 'mix-xzzfbzf' || $data['paytype'] == 'coin-xzzfbzf') {
  497. // // 第三方现金支付 支付宝
  498. // $notify_url = Config::get('h5_alipay_config')['notify_url'];
  499. // $urlPays = $pay->chargeByxzzfbzf($orderid, $real_amount, $payBody, '', $notify_url);
  500. // $result['xzzfbzf_param'] = $urlPays;
  501. //
  502. // } elseif ($data['paytype'] == 'airwallex' || $data['paytype'] == 'mix-airwallex' || $data['paytype'] == 'coin-airwallex') {
  503. // Cache::set('memberCoin:real_amount:' . $orderid, $payData['real_amount'], 60 * 60);
  504. // $pay_url = WEBSITE_DOMAIN . '/pay/airwallex.html?orderid=' . $orderid . '&goods=' . urlencode($payBody) . '&urltype=3';
  505. // $result = ['airwallex_param' => ['mweb_url' => $pay_url], 'referer' => ''];
  506. // } elseif ($data['paytype'] == 'airwallexh5' || $data['paytype'] == 'mix-airwallexh5' || $data['paytype'] == 'coin-airwallexh5') {
  507. // Cache::set('memberCoin:real_amount:' . $orderid, $payData['real_amount'], 60 * 60);
  508. // $pay_url = MOBILE_SITE_DOMAIN . '/coin_airwallex/airwallex.html?orderid=' . $orderid . '&goods=' . urlencode($payBody) . '&urltype=3';
  509. // $result = ['airwallexh5_param' => ['mweb_url' => $pay_url], 'referer' => ''];
  510. //
  511. // } elseif ($data['paytype'] == 'qmf-zfb-h5') {
  512. // // 全民付H5
  513. // $notify_url = Config::get('qmf_pay')['notify_url'];
  514. // $alipayParam = $pay->getQmfWapH5Param($data['paytype'], $orderid, $real_amount, $payBody, $notify_url);
  515. // $result = ['mweb_url' => $alipayParam];
  516. // }
  517. requestDuplicateCheckUnlock('pay_duplicate_' . $data['member_id'] . '_' . $data['gameid']);
  518. } catch (Exception $e) {
  519. // 回滚事务
  520. // Db::rollback();
  521. return ['data' => '', 'code' => 0, 'msg' => '订单生成失败.:' . $e->getMessage()];
  522. }
  523. $result['pay_status'] = $pay_status; //支付状态
  524. $result['orderid'] = $orderid;
  525. $result['channel_id'] = $data['channel_id'];
  526. $result['paytype'] = $paytype;
  527. return ['data' => $result, 'code' => 1, 'msg' => '订单生成成功'];
  528. }
  529. /**
  530. * 订单参数
  531. * @param $data
  532. * @param $arrPayAmount
  533. * @param $memberInfo
  534. * @param $gameInfo
  535. */
  536. public function orderData($data, $arrPayAmount, $memberInfo, $gameInfo, $pay_status)
  537. {
  538. if ($arrPayAmount['real_amount'] > 0) {
  539. $real_amount = $arrPayAmount['real_amount'];
  540. } else {
  541. $real_amount = 0;
  542. }
  543. $payData['orderid'] = $data['orderid'];
  544. $payData['discount'] = $data['discount'] ?: 1;
  545. $payData['amount'] = $data['amount'];
  546. $payData['real_amount'] = $real_amount;
  547. $payData['real_ptb'] = $arrPayAmount['real_ptb'] ?: 0;
  548. $payData['real_coin'] = $arrPayAmount['real_coin'] ?: 0;
  549. $payData['coupon_amount'] = $data['coupon_amount'];
  550. // $payData['real_ptb_amount'] = $arrPayAmount['real_ptb_amount'];
  551. $payData['userid'] = $data['member_id'];
  552. $payData['username'] = $memberInfo['username'];
  553. $payData['roleid'] = $data['roleid'];
  554. $payData['rolename'] = $data['rolename'];
  555. $payData['rolelevel'] = $data['rolelevel'];
  556. $payData['paytype'] = $data['paytype'];
  557. $payData['productname'] = $data['productname'];
  558. $payData['serverid'] = $data['serverid'];
  559. $payData['servername'] = $data['servername'];
  560. $payData['gameid'] = $data['gameid'];
  561. $payData['status'] = $pay_status;
  562. $payData['ip'] = $data['ip'];
  563. $payData['imeil'] = $data['imeil'];
  564. $payData['create_time'] = NOW_TIMESTAMP;
  565. $payData['channel_id'] = $data['channel_id'];
  566. $payData['recheck_status'] = $gameInfo['order_recheck'];
  567. $payData['attach'] = $data['attach'];
  568. $payData['coupon_member_id'] = $data['coupon_member_id'];
  569. $payData['pay_amount'] = $data['amount'];
  570. if($payData['discount'] > 0 && $payData['discount'] < 1){
  571. $payData['pay_amount'] = number_format($data['amount'] * $payData['discount'], 2);
  572. }
  573. return $payData;
  574. }
  575. }