paymentvnpt.php 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Administrator
  5. * Date: 2018/4/9
  6. * Time: 15:07
  7. */
  8. include PATH_MOD . 'msgtip.php';
  9. class ModelPaymentVnpt
  10. {
  11. private $_vnptList = [
  12. 'vinaphone' => [
  13. 'type' => 'VNP',
  14. 'urlCode' => 'VINA'
  15. ],
  16. 'mobifone' => [
  17. 'type' => 'VMS',
  18. 'urlCode' => 'MOBI'
  19. ],
  20. 'viettel' => [
  21. 'type' => 'VTT',
  22. 'urlCode' => 'VIETTEL'
  23. ]
  24. ];
  25. protected $goodsTable;//商品表
  26. protected $summaryListTable;//订单汇总表
  27. public function __construct()
  28. {
  29. $this->goodsTable = otable::goods();
  30. $this->summaryListTable = otable::summarylist();
  31. }
  32. /**
  33. * 发起支付
  34. * @param $orderId
  35. * @param $type
  36. * @param $Seri
  37. * @param $passwd
  38. * @return string
  39. */
  40. public function createPayment($orderId, $payOperator , $serial, $passwd)
  41. {
  42. $txtType = $this->_vnptList[$payOperator]['type'] ?? '';
  43. $txtUrlCode = $this->_vnptList[$payOperator]['urlCode'] ?? '';
  44. if(empty($txtType) || empty($txtUrlCode) || empty($serial) || empty($passwd) || empty($orderId)) {
  45. oo::logs()->debug3('param: operator:'.$payOperator.' txttype:'.$txtType.' urlCode:'.$txtUrlCode.' card:'.$serial.' passwd:'.$passwd.' orderId:'.$orderId, 'vnptpayment_fail.php');
  46. return oo::res(-1);
  47. }
  48. $result = oo::vnpt()->cardCharging($orderId, $txtType, $txtUrlCode, $serial, $passwd);
  49. $response = $this->getResponseInfo($result);
  50. if(isset($response['code']) && $response['code'] === 0) {//充值成功
  51. $price = $response['amount'];
  52. $ret = $this->vnptDelivery($orderId, $price, $payOperator);
  53. if($ret) {
  54. return oo::res(1);
  55. }else {
  56. oo::logs()->debug3('errormsg:发货失败 orderId:'.$orderId.' operator:'.$payOperator, 'vnptpayment_fail.php');
  57. return oo::res(-2);//发货失败
  58. }
  59. }else {
  60. $msg = $response['msg'];
  61. oo::logs()->debug3('errormsg:'.$msg.' orderId:'.$orderId.' operator:'.$payOperator, 'vnptpayment_fail.php');
  62. $resultCode = $response['result_code'];
  63. if('06' == $resultCode) {
  64. $code = -3;//卡号卡密不对
  65. }else if('05' == $resultCode) {
  66. $code = -4;//卡已使用过
  67. }else if('07' == $resultCode) {
  68. $code = -5;//卡无效未激活或过期
  69. }else {
  70. $code = -6;
  71. }
  72. return oo::res($code);//充值失败
  73. }
  74. }
  75. /**
  76. * 当计费类型为充值卡,并且价格不匹配时,重新查找价格对应的商品, 找到后重新修改
  77. * 因为客户端下单时候,无法确认商品ID
  78. * @param int $orderId
  79. */
  80. protected function checkPriceAgain($price, $orderId = 0, $operator = 0, $uid = 0 ){
  81. if( $operator == 'test' ){
  82. $sql = " SELECT gid, gprice, gpriceThb FROM {$this->goodsTable} WHERE gchannel IN(9,10,11) ";
  83. }else{
  84. $gchannel = $operator;//支付商品渠道
  85. if( empty($gchannel) ){
  86. return false;
  87. }
  88. $gplatform = 1;
  89. //查询价格,和商品ID
  90. $sql = " SELECT gid, gprice, gpriceThb FROM {$this->goodsTable} WHERE gchannel = {$gchannel} AND gplatform = {$gplatform} AND gstatus = 1 ";
  91. }
  92. $goodsList = oo::commonOprDb('common')->getAll($sql, MYSQLI_ASSOC);
  93. if( empty($goodsList) ){
  94. return false;
  95. }
  96. $sl_gid = $sl_pusd = 0;//新的商品ID和价格(美元)
  97. foreach ($goodsList as $info){
  98. if( $info['gpriceThb'] == $price ){
  99. $sl_gid = intval($info['gid']);
  100. $sl_pusd = $info['gprice'];
  101. break;
  102. }
  103. }
  104. if( $sl_gid == 0 ){
  105. return false;
  106. }
  107. //更新订单汇总表
  108. $sqlU = " UPDATE {$this->summaryListTable} SET sl_gid = {$sl_gid}, sl_pusd = '{$sl_pusd}' WHERE sl_orderid = {$orderId} LIMIT 1";
  109. oo::commonOprDb('common')->query($sqlU);
  110. //更新玩家订单表中的订单ID
  111. $paymentTable = otable::payment($uid);
  112. $sqlPayment = " UPDATE {$paymentTable} SET gid = {$sl_gid}, pusd = '{$sl_pusd}' WHERE uid = {$uid} AND order_id = {$orderId} LIMIT 1 ";
  113. oo::commonOprDb('common')->query($sqlPayment);
  114. return true;
  115. }
  116. /**
  117. * 验证发货
  118. * @param $orderId
  119. * @param $price
  120. * @param int $operator
  121. * @return bool
  122. */
  123. public function vnptDelivery($orderId, $price, $operator = 9)
  124. {
  125. $now = time();
  126. //验证订单是否正确
  127. $sqlSummarylist = " SELECT sl_gid, sl_uid, sl_status FROM {$this->summaryListTable} WHERE sl_orderid = {$orderId} LIMIT 1 ";
  128. $ret = oo::commonOprDb('common')->getOne($sqlSummarylist, MYSQLI_ASSOC);
  129. if (empty($ret)) {
  130. oo::logs()->debug3(array('orderId' => $orderId, 'reason' => 'orderIdError', 'time' => $now),'vnptpayment_fail.log');
  131. return false;
  132. }
  133. $uid = $ret['sl_uid'];
  134. //验证订单状态,是否已经支付过
  135. $status = intval($ret['sl_status']);
  136. if( $status == 2){
  137. oo::logs()->debug3(array('orderId' => $orderId, 'reason' => 'alreadyPayed', 'time' => $now),'vnptpayment_fail.log');
  138. return false;
  139. }
  140. //验证商品信息是否正确
  141. $gid = $ret['sl_gid'];
  142. $sqlGoodsInfo = " SELECT gpriceThb FROM {$this->goodsTable} WHERE gid = {$gid} LIMIT 1 ";
  143. $retGoods = oo::commonOprDb('common')->getOne($sqlGoodsInfo, MYSQLI_ASSOC);
  144. if (empty($retGoods)) {
  145. oo::logs()->debug3(array('orderId' => $orderId, 'reason' => 'getGoodsErr', 'sqlGoodsInfo' => $sqlGoodsInfo, 'time' => $now),'vnptpayment_fail.log');
  146. return false;
  147. }
  148. //验证价格是否匹配
  149. $gprice = intval($retGoods['gpriceThb']);
  150. if( $price != $gprice ){
  151. $checkPriceAgain = $this->checkPriceAgain($price, $orderId, $operator, $uid);
  152. if( !$checkPriceAgain ){
  153. oo::logs()->debug3(array('orderId' => $orderId, 'reason' => 'priceError', 'operator' => $operator, 'price' => $price, 'gprice' => $gprice, 'time' => $now),'vnptpayment_fail.log');
  154. return false;
  155. }
  156. }
  157. //验证通过后,可以发奖了
  158. $retReward = oo::commonOprModel('payment')->pubDelivery($uid, $orderId);
  159. return $retReward;
  160. }
  161. /**
  162. * 处理返回信息
  163. * @param $vnptResult
  164. * @return array
  165. */
  166. public function getResponseInfo($vnptResult){
  167. $respones = [];
  168. if(strpos($vnptResult,'RESULT:10') !== false){
  169. $respones['code'] = 0; //充值成功
  170. $respones['result_code'] = '10';
  171. $respones['amount'] = intval(str_replace('RESULT:10@','',$vnptResult));
  172. }else{
  173. $respones['code'] = 1; //充值失败
  174. $respones['result_code'] = trim(substr($vnptResult,7,2));
  175. $respones['amount'] = 0;
  176. }
  177. switch ($respones['result_code']){
  178. case '99':
  179. $respones['msg'] = msgtip::VNPT_IP_NOTALLOW;
  180. break;
  181. case '00':
  182. $respones['msg'] = msgtip::VNPT_SYSTEM_MAINTENANCE;
  183. break;
  184. case '01':
  185. $respones['msg'] = msgtip::VNPT_MD5KEY_ERROR;
  186. break;
  187. case '02':
  188. $respones['msg'] = msgtip::VNPT_CARD_SERVICENOTEXIT;
  189. break;
  190. case '03':
  191. $respones['msg'] = msgtip::VNPT_SERIALORPIN_WRONGFORMAT;
  192. break;
  193. case '04':
  194. $respones['msg'] = msgtip::VNPT_PARTNERID_NOTEXIT;
  195. break;
  196. case '05':
  197. $respones['msg'] = msgtip::VNPT_CARD_USEDBEFOR;
  198. break;
  199. case '06':
  200. $respones['msg'] = msgtip::VNPT_SERIALORPIN_ISINCORRECT;
  201. break;
  202. case '07':
  203. $respones['msg'] = msgtip::VNPT_SERIAL_INVALID;
  204. break;
  205. case '08':
  206. $respones['msg'] = msgtip::VNPT_CARD_EXIST;
  207. break;
  208. case '09':
  209. $respones['msg'] = msgtip::VNPT_CHANNEL_INACTIVE;
  210. break;
  211. case '10':
  212. $respones['msg'] = msgtip::K3_SUCCEED;
  213. break;
  214. case '11':
  215. $respones['msg'] = msgtip::DELAY_PENDING;
  216. break;
  217. case '12':
  218. $respones['msg'] = msgtip::VNPT_SERI_LENGTHERROR;
  219. break;
  220. default:
  221. $respones['msg'] = msgtip::VNPT_BADCARD_DATA;
  222. break;
  223. }
  224. return $respones;
  225. }
  226. }