Bridge.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. <?php
  2. namespace rbridge\wsd;
  3. require_once(BASE_HELPER_PATH . '/rbridge/wsd/config.php');
  4. require_once(BASE_HELPER_PATH . '/refill/RefillFactory.php');
  5. use rbridge\IBridge;
  6. use rbridge\wsd\config;
  7. use refill\RefillFactory;
  8. use refill_proxy;
  9. use Log;
  10. use member_info;
  11. use Exception;
  12. class Bridge implements IBridge
  13. {
  14. public function add($params)
  15. {
  16. if ($this->verify($params) === false) {
  17. return json_encode($this->errbody("签名不成功",$params));
  18. }
  19. $action = $params['action'];
  20. $chargeType = intval($params['chargeType']);
  21. if ($action != 'CZ') {
  22. return json_encode($this->errbody("不支持该业务",$params));
  23. }
  24. //业务类型
  25. //0:话费 1:Q币 2:QQ会员 3:游戏
  26. //4:水电气 5:流量 6:票务 7:固话 8:宽带 9:油卡
  27. if ($chargeType !== 0 && $chargeType !== 9) {
  28. return json_encode($this->errbody("不支持该类型业务",$params));
  29. }
  30. $mchid = config::MCHID;
  31. Model('merchant_query')->add_info(config::MCHID, $params['chargeId'], json_encode($params));
  32. $mchinfo = Model('merchant')->getMerchantInfo(['mchid' => $mchid]);
  33. $userid = intval($mchinfo['admin_id']);
  34. [$code, $msg] = RefillFactory::instance()->add($mchid, $userid, $params['chargeCash'], $params['chargeAcct'], $params['chargeId'], config::MCH_NOTIFY_URL);
  35. $ret = $this->retbody($code, $msg, $params);
  36. return json_encode($ret);
  37. }
  38. private function errbody($msg,$params)
  39. {
  40. //交易结果 0:未处理 1:充值成功 2:充值结果不确定 3:充值失败
  41. $retCode = 3;
  42. $retDetail = $msg;
  43. $result = [
  44. 'action' => 'CZ',
  45. 'chargeId' => $params['chargeId'],
  46. 'retCode' => $retCode,
  47. 'retDetail' => $retDetail,
  48. 'retRsn' => $params['retRsn']];
  49. $body = "{$params['chargeId']}{$retCode}{$params['retRsn']}" . config::BridgeKey;
  50. $sign = md5($body);
  51. $result['sign'] = $sign;
  52. return $result;
  53. }
  54. private function retbody($code, $msg, $params)
  55. {
  56. //交易结果 0:未处理 1:充值成功 2:充值结果不确定 3:充值失败
  57. if ($code === true) {
  58. $retCode = 0;
  59. $retDetail = '定单已接收';
  60. } else {
  61. $retCode = 3;
  62. $retDetail = $msg;
  63. }
  64. $result = [
  65. 'action' => 'CZ',
  66. 'chargeId' => $params['chargeId'],
  67. 'retCode' => $retCode,
  68. 'retDetail' => $retDetail,
  69. 'retRsn' => $params['retRsn']];
  70. $body = "{$params['chargeId']}{$retCode}{$params['retRsn']}" . config::BridgeKey;
  71. $sign = md5($body);
  72. $result['sign'] = $sign;
  73. return $result;
  74. }
  75. public function notify($params)
  76. {
  77. $proxy = new refill_proxy(config::MCH_KEY);
  78. [$verify, $data] = $proxy->notify($params);
  79. $mchid = config::MCHID;
  80. if ($verify) {
  81. $body = $this->notify_body($data);
  82. if ($body === false) {
  83. return true;
  84. }
  85. $header = ['Content-Type: application/json'];
  86. $encode = mb_detect_encoding($body, ['GB2312','GBK','UTF-8']);
  87. $body = mb_convert_encoding($body,$encode, 'GBK');
  88. $resp = http_post_data(config::BridgeNotifyURL, $body, $header);
  89. if ($resp === false) {
  90. $url = config::BridgeNotifyURL;
  91. Log::record("通知mchid = {$mchid} {$url}失败", Log::ERR);
  92. return false;
  93. } else {
  94. return true;
  95. }
  96. } else {
  97. Log::record("内部回调签名错误 mchid = {$mchid}", Log::ERR);
  98. return false;
  99. }
  100. }
  101. private function notify_body($params)
  102. {
  103. $mch_ordersn = $params['order_sn'];
  104. $query_info = Model('merchant_query')->query_info(config::MCHID, $mch_ordersn);
  105. if (empty($query_info)) {
  106. $mchid = config::MCHID;
  107. Log::record("查不到mchid={$mchid},mch_order:{$mch_ordersn}的原始订单信息", Log::ERR);
  108. return false;
  109. } else {
  110. $query_info = json_decode($query_info['request'], true);
  111. }
  112. $success = $params['state'] == 'SUCCESS';
  113. $retCode = $success ? 1 : 3;
  114. $body = [
  115. "action" => "CZ",
  116. "chargeId" => $query_info['chargeId'],
  117. "retCode" => $retCode,
  118. "retDetail" => $retCode == 1 ? "充值成功" : "充值失败",
  119. "retRsn" => $query_info['retRsn'],
  120. "userContent" => "",
  121. "retCost" => number_format($this->getCost(config::MCHID, $mch_ordersn), 3,'.',''),
  122. "retBalance" => number_format($this->getBalance(config::MCHID), 3,'.',''),
  123. "retCash" => number_format($query_info['chargeCash'], 3,'.','')
  124. ];
  125. $sign = md5("{$body['chargeId']}{$body['retCode']}{$body['retRsn']}" . config::BridgeKey);
  126. $body['sign'] = $sign;
  127. return json_encode($body);
  128. }
  129. private function getBalance($mchid)
  130. {
  131. try {
  132. $mchinfo = Model('merchant')->getMerchantInfo(['mchid' => $mchid]);
  133. $userid = intval($mchinfo['admin_id']);
  134. $info = new member_info($userid);
  135. return round($info->available_predeposit(), 3);
  136. } catch (Exception $ex) {
  137. Log::record("Bridge getBalance mchid={$mchid} what : {$ex->getMessage()}", Log::ERR);
  138. return 0.000;
  139. }
  140. }
  141. private function getCost($mchid, $mch_ordersn)
  142. {
  143. $refill_order = Model('refill_order');
  144. $items = $refill_order->getOrderInfo(['mchid' => $mchid, 'mch_order' => $mch_ordersn, 'inner_status' => 0]);
  145. if (!empty($items)) {
  146. $order = $items[0];
  147. return $order['mch_amount'];
  148. } else {
  149. return 0;
  150. }
  151. }
  152. private function verify($params)
  153. {
  154. //md5(chargeId + chargeAcct + var1 + var2 + var3 + var4 + chargeCash + md5key)
  155. $keys = ['chargeId', 'chargeAcct', 'var1', 'var2', 'var3', 'var4', 'chargeCash'];
  156. $body = "";
  157. foreach ($keys as $key) {
  158. $body .= $params[$key] ?? "";
  159. }
  160. $body .= config::BridgeKey;
  161. $sign = md5($body);
  162. Log::record("body={$body} sign={$sign} , orgsign={$params['sign']}",Log::DEBUG);
  163. return $params['sign'] == $sign;
  164. }
  165. }