Hqpay_payment.php 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. <?php
  2. $payment_lang = array(
  3. 'name' => 'HQ微信支付',
  4. 'merchantID' => '商户号ID',
  5. 'platpkey' => '密匙',
  6. );
  7. $config = array(
  8. 'merchantID' => array(
  9. 'INPUT_TYPE' => '0',
  10. ), //商户号
  11. 'platpkey' => array(
  12. 'INPUT_TYPE' => '0',
  13. ), //密匙
  14. );
  15. /* 模块的基本信息 */
  16. if (isset($read_modules) && $read_modules == true)
  17. {
  18. $module['class_name'] = 'Hqpay';
  19. /* 名称 */
  20. $module['name'] = $payment_lang['name'];
  21. /* 支付方式:1:在线支付;0:线下支付 2:仅wap支付 3:仅app支付 4:兼容wap和app*/
  22. $module['online_pay'] = '4';
  23. /* 配送 */
  24. $module['config'] = $config;
  25. $module['lang'] = $payment_lang;
  26. $module['reg_url'] = '';
  27. return $module;
  28. }
  29. // 支付模型
  30. require_once(APP_ROOT_PATH.'system/libs/payment.php');
  31. class Hqpay_payment implements payment {
  32. public function get_payment_code($payment_notice_id)
  33. {
  34. $pay = array();
  35. $pay['is_wap'] = 1;//
  36. $pay['is_without'] = 1;//跳转外部浏览器
  37. $pay['class_name'] = "Hqpay";
  38. $pay['url'] =SITE_DOMAIN.APP_ROOT.'/mapi/index.php?ctl=pay&act=get_display_code&pay_code=Hqpay&notice_id='.$payment_notice_id;
  39. $pay['sdk_code'] = array("pay_sdk_type"=>"yjwap","config"=>
  40. array(
  41. "url"=>SITE_DOMAIN.APP_ROOT.'/mapi/index.php?ctl=pay&act=get_display_code&pay_code=Hqpay&notice_id='.$payment_notice_id,
  42. "is_wap"=>1
  43. )
  44. );
  45. return $pay;
  46. }
  47. public function response($request)
  48. {
  49. $request = array_keys($request,"=");
  50. $payment = $GLOBALS['db']->getRow("select id,config from ".DB_PREFIX."payment where class_name='Hqpay'");
  51. $payment_info['config'] = unserialize($payment['config']);
  52. require_once(APP_ROOT_PATH . 'system/payment/Hqpay/Hqpay.php');
  53. $Hqpay = new Hqpay($payment_info['config']['merchantID'],$payment_info['config']['platpkey']);
  54. $result = $Hqpay->rsaDecrypt($request[0]);
  55. $result = $this->object_array(json_decode($result));
  56. if($result['type']=='charge.succeeded'){
  57. $payment_notice_sn = $result['data']['order_no'];
  58. $outer_notice_sn = $result['data']['order_id'];
  59. $payment_notice = $GLOBALS['db']->getRow("select * from ".DB_PREFIX."payment_notice where notice_sn = '".$payment_notice_sn."'");
  60. $user_diamonds = $GLOBALS['db']->getOne("select diamonds from ".DB_PREFIX."user where id = '".$payment_notice['user_id']."'");
  61. require_once APP_ROOT_PATH."system/libs/cart.php";
  62. $rs = payment_paid($payment_notice['notice_sn'],$outer_notice_sn);
  63. if($rs['status']==1)
  64. {
  65. echo '<!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=2.0, user-scalable=0,minimum-scale=0.5"><title></title></head><body><div style="width:120px;height:40px;line-height:40px;font-size:14px;text-align:center;background:#ff4d7f;color:#fff;margin:20px auto;border-radius:5px;" >付款成功!当前余额:'.$user_diamonds.'</div></body></html>';
  66. exit;
  67. }
  68. else
  69. {
  70. echo '<!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=2.0, user-scalable=0,minimum-scale=0.5"><title></title></head><body><div style="width:120px;height:40px;line-height:40px;font-size:14px;text-align:center;background:#ff4d7f;color:#fff;margin:20px auto;border-radius:5px;" >回调失败!关闭当前页面</div></body></html>';
  71. exit;
  72. }
  73. } else{
  74. echo '<!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=2.0, user-scalable=0,minimum-scale=0.5"><title></title></head><body><div style="width:120px;height:40px;line-height:40px;font-size:14px;text-align:center;background:#ff4d7f;color:#fff;margin:20px auto;border-radius:5px;" >'.$request['msg'].'请关闭当前页面,返回APP查看</div></body></html>';
  75. exit;
  76. }
  77. }
  78. public function notify($request)
  79. {
  80. $request = array_keys($request,"=");
  81. $payment = $GLOBALS['db']->getRow("select id,config from ".DB_PREFIX."payment where class_name='Hqpay'");
  82. $payment_info['config'] = unserialize($payment['config']);
  83. require_once(APP_ROOT_PATH . 'system/payment/Hqpay/Hqpay.php');
  84. $Hqpay = new Hqpay($payment_info['config']['merchantID'],$payment_info['config']['platpkey']);
  85. $result = $Hqpay->rsaDecrypt($request[0]);
  86. $result = $this->object_array(json_decode($result));
  87. if($result['type']=='charge.succeeded'){
  88. $payment_notice_sn = $result['data']['order_no'];
  89. $outer_notice_sn = $result['data']['order_id'];
  90. $payment_notice = $GLOBALS['db']->getRow("select * from ".DB_PREFIX."payment_notice where notice_sn = '".$payment_notice_sn."'");
  91. require_once APP_ROOT_PATH."system/libs/cart.php";
  92. $rs = payment_paid($payment_notice['notice_sn'],$outer_notice_sn);
  93. if($rs['status']==1)
  94. {
  95. echo 'success';
  96. }
  97. else
  98. {
  99. echo 'fail';
  100. }
  101. }
  102. }
  103. function get_display_code(){
  104. }
  105. public function display_code($payment_notice_id)
  106. {
  107. if($payment_notice_id) {
  108. $payment_notice = $GLOBALS['db']->getRow("select * from " . DB_PREFIX . "payment_notice where id = " . $payment_notice_id);
  109. $money = intval($payment_notice['money']*100);
  110. $payment_info = $GLOBALS['db']->getRow("select id,config,logo from " . DB_PREFIX . "payment where id=" . intval($payment_notice['payment_id']));
  111. $payment_info['config'] = unserialize($payment_info['config']);
  112. $m_config = load_auto_cache("m_config");
  113. $title_name = $m_config['ticket_name'];
  114. if($title_name=='')
  115. $title_name = '虚拟印币';
  116. if(empty($title_name))
  117. {
  118. $title_name = "充值".round($payment_notice['money'],2)."元";
  119. }
  120. $post_url = 'https://119.23.246.110:9001/mps/v1/charges';
  121. $order_no = $payment_notice['notice_sn'];
  122. $app_id = $payment_info['config']['merchantID'];
  123. $api_key = $payment_info['config']['platpkey'];
  124. $channel = 'wx_wap';
  125. $amount = $money;
  126. $client_ip = $this->get_ip();
  127. $subject = $title_name;
  128. $body = $title_name;
  129. $notify_url = 'http://live.huangjiaxiuchang.com/callback/payment/hqpay_notify.php';
  130. $result_url = 'http://live.huangjiaxiuchang.com/callback/payment/hqpay_response.php';
  131. $base64_apiKey = 'Authorization: basic '.base64_encode($api_key.":");
  132. $headers = [$base64_apiKey];
  133. $post_data = array(
  134. 'order_no' => $order_no,
  135. 'app[id]' => $app_id,
  136. 'channel' => $channel,
  137. 'amount' => $amount,
  138. 'client_ip' => $client_ip,
  139. 'subject' => $subject,
  140. 'body' => $body,
  141. 'extra[result_url]' => $result_url,
  142. 'notify_url'=>$notify_url
  143. );
  144. $data = $this->send_post($headers, $post_url, $post_data);
  145. $data = $this->object_array(json_decode($data));
  146. if($data['status']!=200){
  147. echo $data['error']['message'];
  148. }else{
  149. header('Location:'.$data['credential']['pay_url']);
  150. }
  151. }
  152. }
  153. function get_ip(){
  154. if(!empty($_SERVER["HTTP_CLIENT_IP"])){
  155. $cip = $_SERVER["HTTP_CLIENT_IP"];
  156. }
  157. elseif(!empty($_SERVER["HTTP_X_FORWARDED_FOR"])){
  158. $cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
  159. }
  160. elseif(!empty($_SERVER["REMOTE_ADDR"])){
  161. $cip = $_SERVER["REMOTE_ADDR"];
  162. }
  163. else{
  164. $cip = '';
  165. }
  166. preg_match("/[\d\.]{7,15}/",$cip,$cips);
  167. $cip = explode(',',$cip);
  168. $cip = $cip[0]?$cip[0]:'unknown';
  169. unset($cips);
  170. return $cip;
  171. }
  172. //
  173. function send_post($headers, $post_url, $post_data){
  174. $str = '';
  175. foreach($post_data as $k => $v){
  176. $str .= "$k=".urlencode($v).'&';
  177. }$post_data = substr($str,0,-1);
  178. $ch = curl_init();
  179. curl_setopt($ch, CURLOPT_URL,$post_url);
  180. curl_setopt($ch, CURLOPT_HEADER, 0);
  181. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  182. curl_setopt($ch, CURLOPT_POST, 1);
  183. curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
  184. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  185. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
  186. curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
  187. $result = curl_exec($ch);
  188. curl_close($ch);
  189. return $result;
  190. }
  191. function object_array($array)
  192. {
  193. if(is_object($array))
  194. {
  195. $array = (array)$array;
  196. }
  197. if(is_array($array))
  198. {
  199. foreach($array as $key=>$value)
  200. {
  201. $array[$key] = $this->object_array($value);
  202. }
  203. }
  204. return $array;
  205. }
  206. }
  207. ?>