Simo.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. <?php
  2. namespace app\api\complex;
  3. use ComplexThree\JuLe\joloRsa;
  4. /**
  5. * 司墨
  6. */
  7. class Simo implements ComplexInterface
  8. {
  9. private $channel = 'simo';
  10. /**
  11. * ## 登陆 - 校验
  12. *
  13. * @param $data
  14. * @param $polyChannelGame
  15. *
  16. * @return false
  17. */
  18. public function getSpecialParam($data, $polyChannelGame = [])
  19. {
  20. // 参数:user_id = uid, extparam = auth
  21. // {"appid":335,"sign":"01512cbbea69bc822ee0b6c9f4094faa","imeil":"ffffffff-bab6-5798-ffff-ffffef05ac4a","gameid":348,"channel_mark":"simo","device":"2","ext":"1","user_id":"2234424","extparam":"MjU5YzFiYjEwZmY0ZTQ2MUogZZmQj9yt719FCz3YG8doFOS_0vd9klL43PVEMa_Ml0pP_DGkSMMyFLtRLcm37995qqTHicusTujVGJgsrQeNq2-Ol7ZFjen1YtQBVthNiB8Evuu2dmo4DAHlEUitjYUOwvGGCiyGXGXZTFdKmyQxgp4DqferIFZ5Usfh-cwjzJnsW4U5FpAe9YildjUWXAWiXQMK8nYDKSU_dVC2FB2Ngnry_puqrHwBXmjBesENPj9AasvMH1ToX20qfkAr5akMvZX0KyBUOdln3I-EdIlTnAvIxO8tIth_fZceg6CPdPB5LjEJGfhY96g0DRz8DA","qmKey":"b743ca00f72bf6a55458e7451442b0e3"}
  22. if (empty($data['user_id']) || empty($data['extparam'])) {
  23. return false;
  24. }
  25. if (empty($polyChannelGame['param'])) {
  26. return false;
  27. }
  28. if (!$channelConfig = json_decode($polyChannelGame['param'], true)) {
  29. return false;
  30. }
  31. $param = [
  32. 'uid' => $data['user_id'],
  33. 'auth' => $data['extparam'],
  34. 'tm' => time(),
  35. ];
  36. $param['sign'] = $this->signData($param, $channelConfig['app_key']);
  37. $res = get_http_response('https://api.63yx.cn/user/loginVerify', $param);
  38. $res = json_decode($res, true);
  39. if ($res['code'] === 0) {
  40. return $res['data']['user_id'];
  41. } else {
  42. return false;
  43. }
  44. }
  45. // ## 登陆 - 登陆
  46. public function checkLogin($data, $polyChannelGame = [])
  47. {
  48. return ['user_id' => $data['username']];
  49. }
  50. // ## 下单 - 客户端需要的参数(客户端自己做了,这块暂时不用)
  51. public function getOrder($data)
  52. {
  53. return ['code' => 200, 'msg' => 'success', 'param' => []];
  54. }
  55. // ## 回调 - 效验
  56. public function paySign($data, $polyChannelGame = [])
  57. {
  58. $param = [
  59. 'tm' => $data['tm'], // 请求时间戳
  60. 'm_order_no' => $data['m_order_no'], // 007的平台订单号
  61. 'cp_order_no' => $data['cp_order_no'], // 对接007的上游的游戏订单号
  62. 'out_trade_no' => $data['out_trade_no'], // 平台支付订单号(其他第三方的)
  63. 'pay_status' => $data['pay_status'], // 支付结果 固定值1 支付成功 0 支付失败
  64. 'pay_amount' => $data['pay_amount'], // 订单金额(元)
  65. 'uid' => $data['uid'], // 用户Id唯一标识
  66. 'server_id' => $data['server_id'], // 区服ID
  67. 'server_name' => $data['server_name'], // 区服名称
  68. 'role_id' => $data['role_id'], // 角色ID
  69. 'role_name' => $data['role_name'], // 角色名称
  70. 'product_id' => $data['product_id'], // 道具ID
  71. 'product_name' => $data['product_name'], // 道具名称
  72. ];
  73. $getValues = array_values($param);
  74. if (empty(array_diff(['m_order_no', 'cp_order_no', 'out_trade_no', 'pay_status', 'pay_amount', 'uid'], $getValues))) {
  75. return false;
  76. }
  77. if (!$channelConfig = json_decode($polyChannelGame['param'], true)) {
  78. return false;
  79. }
  80. $sign = $data['sign'];
  81. $hadleSign = $this->notifySign($param, $channelConfig['pay_key']);
  82. if ($sign == $hadleSign) {
  83. return true;
  84. }
  85. return false;
  86. }
  87. // ## 回调 - 下单参数获取
  88. public function getData($data)
  89. {
  90. if (!isset($data['cp_order_no']) || !isset($data['pay_amount']) || !isset($data['m_order_no'])) {
  91. return false;
  92. }
  93. return [
  94. 'orderid' => $data['cp_order_no'], // 我方聚合订单
  95. 'amount' => $data['pay_amount'], // 充值金额(单位:元)
  96. 'sub_orderid' => $data['m_order_no'], // 渠道订单
  97. ];
  98. }
  99. // ## 回调 - 成功返回
  100. public function getSuccess($msg = '')
  101. {
  102. echo 'success';
  103. exit();
  104. }
  105. // ## 回调 - 失败返回
  106. public function getFail($msg = '')
  107. {
  108. log_message('getFail: '.$msg, 'error', LOG_PATH.'complexPaylog/simo/');
  109. echo 'fail';
  110. exit();
  111. }
  112. // 登陆签名
  113. private function signData($param, $app_key)
  114. {
  115. ksort($param);
  116. foreach ($param as $k => $v) {
  117. $tmp[] = $k . '=' . urlencode($v);
  118. }
  119. $str = implode('&', $tmp) . $app_key;
  120. return md5($str);
  121. }
  122. // 支付回调签名
  123. private function notifySign($params, $key)
  124. {
  125. $data = array(
  126. "tm" => $params['tm'],
  127. "m_order_no" => $params['m_order_no'],
  128. 'cp_order_no' => $params['cp_order_no'],
  129. 'out_trade_no' => $params['out_trade_no'],
  130. "pay_status" => $params['pay_status'],
  131. 'pay_amount' => $params['pay_amount'],
  132. 'uid' => $params['uid'],
  133. 'server_id' => $params['server_id'],
  134. 'server_name' => $params['server_name'],
  135. 'role_id' => $params['role_id'],
  136. "role_name" => $params['role_name'],
  137. "product_id" => $params['product_id'],
  138. "product_name" => $params['product_name'],
  139. );
  140. ksort($data);
  141. $dataSign = http_build_query($data);
  142. return md5($dataSign . $key);
  143. }
  144. }