paymentvi_bluepay.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. <?php
  2. defined('IN_WEB') or die('Include Error!');
  3. /**
  4. * BluePay支付
  5. */
  6. class ModelPaymentvi_Bluepay
  7. {
  8. private $producerId = 887;
  9. private $salt = 'Qs2HtcqnMyIqf7Ey';
  10. protected $goodsTable;//商品表
  11. protected $summaryListTable;//订单汇总表
  12. protected $paymentTable;//玩家订单表
  13. protected $allowCheckPriceType = array('cashcard');//当传递的价格和商品的价格不符时, 如果为cashcard类型,则重新查找一般商品
  14. protected $operator = array(//运营商类别
  15. 'googleplay' => 1,
  16. 'bluepay' => 2,
  17. 'ios' => 3,
  18. 'vinafone' => 14,
  19. 'mobifone' => 15,
  20. 'viettel' => 16,
  21. 'vtc' => 17,
  22. );
  23. public function __construct(){
  24. $this->goodsTable = otable::goods();
  25. $this->summaryListTable = otable::summarylist();
  26. }
  27. /**
  28. * BluePay的支付验证
  29. */
  30. public function verifyBluePay($param)
  31. {
  32. $price = oo::functions()->uint($param['price']);//价格
  33. $orderId = oo::functions()->escape($param['orderId']);//订单号
  34. $currency = oo::functions()->escape($param['currency']);//计费单位
  35. $operator = strtolower( oo::functions()->escape($param['operator']) );//运营商
  36. $interfacetype = strtolower( oo::functions()->escape($param['interfacetype']) );//计费类型
  37. oo::logs()->debug3(array('param' => $param), 'payment_bluepay.log');
  38. if( empty($price) || empty($orderId) || empty($currency) ){
  39. return false;
  40. }
  41. $now = time();
  42. //验证订单是否正确
  43. $sqlSummarylist = " SELECT sl_gid, sl_uid, sl_status FROM {$this->summaryListTable} WHERE sl_orderid = '{$orderId}' LIMIT 1 ";
  44. $ret = oo::commonOprDb('common')->getOne($sqlSummarylist, MYSQLI_ASSOC);
  45. if (empty($ret)) {
  46. oo::logs()->debug3(array('orderId' => $orderId, 'reason' => 'orderIdError', 'time' => $now),'payment_bluePayError.log');
  47. return false;
  48. }
  49. $uid = $ret['sl_uid'];
  50. //验证订单状态,是否已经支付过
  51. $status = intval($ret['sl_status']);
  52. if( $status == 2){
  53. oo::logs()->debug3(array('orderId' => $orderId, 'reason' => 'alreadyPayed', 'time' => $now),'payment_bluePayError.log');
  54. return false;
  55. }
  56. //验证商品信息是否正确
  57. $gid = $ret['sl_gid'];
  58. $sqlGoodsInfo = " SELECT gpriceThb FROM {$this->goodsTable} WHERE gid = {$gid} LIMIT 1 ";
  59. $retGoods = oo::commonOprDb('common')->getOne($sqlGoodsInfo, MYSQLI_ASSOC);
  60. if (empty($retGoods)) {
  61. oo::logs()->debug3(array('orderId' => $orderId, 'reason' => 'getGoodsErr', 'sqlGoodsInfo' => $sqlGoodsInfo, 'time' => $now),'payment_bluePayError.log');
  62. return false;
  63. }
  64. //验证价格是否匹配
  65. $gprice = intval($retGoods['gpriceThb']);
  66. if( $price != $gprice ){
  67. if( !in_array($interfacetype, $this->allowCheckPriceType) ){
  68. oo::logs()->debug3(array('orderId' => $orderId, 'reason' => 'priceError', 'price' => $price, 'gprice' => $gprice, 'time' => $now),'payment_bluePayError.log');
  69. return false;
  70. }else{
  71. $checkPriceAgain = $this->checkPriceAgain($price, $orderId, $operator, $uid);
  72. if( !$checkPriceAgain ){
  73. oo::logs()->debug3(array('orderId' => $orderId, 'reason' => 'priceError', 'operator' => $operator, 'price' => $price, 'gprice' => $gprice, 'time' => $now),'payment_bluePayError.log');
  74. return false;
  75. }
  76. }
  77. }
  78. //验证通过后,可以发奖了
  79. $retReward = oo::commonOprModel('payment')->pubDelivery($uid, $orderId);
  80. return $retReward;
  81. }
  82. /**
  83. * 当计费类型为充值卡,并且价格不匹配时,重新查找价格对应的商品, 找到后重新修改
  84. * 因为客户端下单时候,无法确认商品ID
  85. * @param int $orderId
  86. */
  87. protected function checkPriceAgain($price, $orderId = 0, $operator = 0, $uid = 0 ){
  88. if( $operator == 'test' ){
  89. $sql = " SELECT gid, gprice, gpriceThb FROM {$this->goodsTable} WHERE gchannel IN(4,5,6,7) ";
  90. }else{
  91. $gchannel = $this->operator[$operator];//支付商品渠道
  92. if( empty($gchannel) ){
  93. return false;
  94. }
  95. $gplatform = DEVICEID;
  96. //查询价格,和商品ID
  97. $sql = " SELECT gid, gprice, gpriceThb FROM {$this->goodsTable} WHERE gchannel = {$gchannel} AND gplatform = {$gplatform} AND gstatus = 1 ";
  98. }
  99. $goodsList = oo::commonOprDb('common')->getAll($sql, MYSQLI_ASSOC);
  100. if( empty($goodsList) ){
  101. return false;
  102. }
  103. $sl_gid = $sl_pusd = 0;//新的商品ID和价格(美元)
  104. $price = $price;
  105. foreach ($goodsList as $info){
  106. if( $info['gpriceThb'] == $price ){
  107. $sl_gid = intval($info['gid']);
  108. $sl_pusd = $info['gprice'];
  109. break;
  110. }
  111. }
  112. if( $sl_gid == 0 ){
  113. return false;
  114. }
  115. //更新订单汇总表
  116. $sqlU = " UPDATE {$this->summaryListTable} SET sl_gid = {$sl_gid}, sl_pusd = '{$sl_pusd}' WHERE sl_orderid = {$orderId} LIMIT 1";
  117. oo::commonOprDb('common')->query($sqlU);
  118. //更新玩家订单表中的订单ID
  119. $paymentTable = otable::payment($uid);
  120. $sqlPayment = " UPDATE {$paymentTable} SET gid = {$sl_gid}, pusd = '{$sl_pusd}' WHERE uid = {$uid} AND order_id = {$orderId} LIMIT 1 ";
  121. oo::commonOprDb('common')->query($sqlPayment);
  122. return true;
  123. }
  124. /**
  125. * 玩家发送 充值卡
  126. * @param $uid
  127. * @param $phone
  128. * @param $operation
  129. * @param $amount
  130. */
  131. public function sendPhonecard($uid, $phone, $operation, $amount){
  132. if (empty($uid) || empty($phone) || empty($operation) || empty($amount)){
  133. return -1;
  134. }
  135. $transId = $uid.time();//交易ID
  136. //准备加密参数
  137. $phone = '86'.$phone;
  138. $param = array(
  139. 'producer_id' => $this->producerId,
  140. 'pocket_id' => 2,
  141. 'amount' => $amount,
  142. 'msisdn' => $phone,
  143. 'trans_id' => $transId,
  144. 'telcoName' => $operation,
  145. 'description' => $operation.'Buy'
  146. );
  147. $md5enctype = $this->md5encrypt($param);
  148. if ($md5enctype === false){
  149. return -2;
  150. }
  151. ksort($param);
  152. $param['encrypt'] = $md5enctype;
  153. $url = 'http://award.BluePay.asia:9999/award/apply/';
  154. $rs = oo::functions()->curl($url, $param);
  155. return $rs;
  156. }
  157. /**
  158. * md5加密需要的参数
  159. * @param string $array
  160. */
  161. private function md5encrypt($array = ''){
  162. if (empty($array)){
  163. return false;
  164. }
  165. ksort($array);
  166. $s = '';
  167. foreach ($array as $k => $v){
  168. $s .= $k.'='.$v.'&';
  169. }
  170. $s = rtrim($s, '&').$this->salt;
  171. return md5($s);
  172. }
  173. }