h5wxpay.inc.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. <?php
  2. /**
  3. * [超级活动(xj_event.{modulename})] (C)2012-2099 Powered by 逍遥工作室.
  4. * Version: 1.0
  5. * Date: 2012-9-15 10:27
  6. */
  7. if(!defined('IN_DISCUZ')) {
  8. exit('Access Denied');
  9. }
  10. //调用核心类
  11. include 'source/plugin/xj_event/include/core.class.php';
  12. $eventcore = new xj_eventcore();
  13. //0元支付处理
  14. $tid = intval($_GET['tid']);
  15. $youhuiprice = $eventcore->GetYouHui($tid,$_G['uid']); //优惠计算
  16. $totalprice = $eventcore->GetEventPrice($tid,$_G['uid']); //总价格
  17. if(($totalprice-$youhuiprice)<=0){
  18. $applyid = DB::result_first("SELECT applyid FROM ".DB::table('xj_eventapply')." WHERE tid = '$tid' and uid=".$_G['uid']);
  19. DB::update('xj_eventapply',array('verify'=>1,'pay_state'=>1),"applyid=$applyid");
  20. showmessage(lang('plugin/xj_event','gxnbmcg'),$_G['siteurl']."forum.php?mod=viewthread&tid=$tid");
  21. exit;
  22. }
  23. //调用微信支付设置
  24. if (file_exists($xj_event_wxset = DISCUZ_ROOT . './data/sysdata/cache_xj_event_wxset.php')) {
  25. @include $xj_event_wxset;
  26. }
  27. $appid = $wxset['open_appid'];
  28. $apikey = $wxset['open_apikey'];
  29. //APIKEY
  30. $mch_id = $wxset['open_mch_id'];
  31. //获取活动内容和报名内容
  32. $items = DB::fetch_first("SELECT A.*,B.subject FROM ".DB::table('xj_event')." A,".DB::table('forum_thread')." B WHERE A.tid = $tid and A.tid=B.tid");
  33. $setting = unserialize($items['setting']);
  34. $pay_subject = $items['subject'];
  35. $pay_price = $items['use_cost'];
  36. $apply = DB::fetch_first("SELECT applyid,applynumber FROM ".DB::table('xj_eventapply')." WHERE tid = $tid and uid=".$_G['uid']);
  37. if($setting['nodaibaoming']){
  38. $pay_number = $apply['applynumber'];
  39. }else{
  40. $pay_number = DB::result_first("SELECT count(*) FROM ".DB::table('xj_eventapply')." WHERE tid = '$tid' and uid=".$_G['uid']);
  41. }
  42. //判断报名名额是否够,不够就不让支付
  43. if($items['event_number']>0){
  44. $applycountnumber = DB::result_first("SELECT SUM(applynumber) FROM ".DB::table('xj_eventapply')." WHERE tid='$tid' and verify=1");
  45. if($pay_number > ($items['event_number']-$applycountnumber)){
  46. showmessage(lang('plugin/xj_event','baomrsym'));
  47. exit();
  48. }
  49. }
  50. $pay_totalprice = $pay_price * $pay_number;
  51. //如果是多种报名
  52. if($setting['cost']){
  53. if($setting['nodaibaoming']){
  54. $capply = DB::fetch_first("SELECT * FROM ".DB::table('xj_eventapply')." WHERE tid = '$tid' and uid=".$_G['uid']);
  55. $capply['ufielddata'] = unserialize($capply['ufielddata']);
  56. $price = 0;
  57. $paytext = '';
  58. foreach($setting['cost'] as $value){
  59. $paytext = $paytext.$value['cost_name'].' '.$capply['ufielddata']['cost'.$value['id']].' x &yen;'.$value['cost_price'].'<br>';
  60. $price = $price+$capply['ufielddata']['cost'.$value['id']]*$value['cost_price'];
  61. }
  62. }else{
  63. $capply = DB::fetch_all("SELECT * FROM ".DB::table('xj_eventapply')." WHERE tid = '$tid' and uid=".$_G['uid']);
  64. $price = 0;
  65. $paytext = '';
  66. foreach($capply as $value){
  67. $value['ufielddata'] = unserialize($value['ufielddata']);
  68. $paytext = $paytext.$setting['cost'][$value['ufielddata']['costclass']]['cost_name'].' 1 x &yen;'.$setting['cost'][$value['ufielddata']['costclass']]['cost_price'].'<br>';
  69. $price = $price + $setting['cost'][$value['ufielddata']['costclass']]['cost_price'];
  70. }
  71. }
  72. if(!$_G['charset']=='gbk'){
  73. $paytext = iconv('GBK','UTF-8',$paytext);
  74. }
  75. $pay_totalprice = $price;
  76. }
  77. if($_G['charset']=='gbk'){
  78. $pay_subject = iconv('GBK','UTF-8',$pay_subject);
  79. }
  80. //VIP折扣
  81. if(file_exists(DISCUZ_ROOT.'./source/plugin/xj_event/module/vip/wsq_pay.php')) {
  82. @include 'module/vip/wsq_pay.php';
  83. }
  84. //prepay_id 获取,微信支付统一下单
  85. $parameters = array();
  86. $parameters["out_trade_no"] = getRandChar(20); //生成订单号
  87. $parameters["body"] = mb_substr($pay_subject,0,32,'utf-8');//cutstr($pay_subject,32,''); //商品描述
  88. $parameters["total_fee"] = intval($pay_totalprice*100); //总金额单位是分,不可以是小数
  89. $parameters["notify_url"] = $_G['siteurl'].'source/plugin/xj_event/event_pay_wx_notify.php'; //异步回调地址
  90. $parameters["trade_type"] = 'MWEB';
  91. $parameters["appid"] = $appid;
  92. $parameters["mch_id"] = $mch_id; //商户号
  93. $parameters["spbill_create_ip"] = $_G['clientip']; //客户端的IP地址
  94. $parameters["nonce_str"] = createNoncestr(); //随机字符串
  95. $parameters["sign"] = getSign($parameters);
  96. //数据库生成支付记录
  97. $paylog = array();
  98. $paylog['applyid'] = $apply['applyid'];
  99. $paylog['uid'] = $_G['uid'];
  100. $paylog['tid'] = $tid;
  101. $paylog['tradeno'] = $parameters["out_trade_no"];
  102. $paylog['paytype'] = 'wxpay';
  103. $paylog['subject'] = $items['subject'];
  104. $paylog['price'] = $pay_price;
  105. $paylog['buyer_email'] = $openid;
  106. $paylog['total_fee'] = $pay_totalprice;
  107. $paylog['create_time'] = $_G['timestamp'];
  108. $paylog['paystate'] = 1;
  109. DB::insert("xj_eventpay_log",$paylog);
  110. $xmldata = arrayToXml($parameters);
  111. $prepaystr = postXmlCurl($xmldata, "https://api.mch.weixin.qq.com/pay/unifiedorder");
  112. $postObj = xmlToArray($prepaystr);
  113. if ($postObj['return_code'] == 'FAIL') {
  114. if ($_G['charset'] == 'gbk') {
  115. echo iconv('UTF-8', 'GBK', $postObj['return_msg']);
  116. } else {
  117. echo $postObj['return_msg'];
  118. }
  119. exit ;
  120. }
  121. $url = $_G['siteurl'].'plugin.php?id=xj_event:wsqcenter&mod=event_view&tid='.$tid;
  122. $url = $postObj['mweb_url'].'&redirect_url='.urlencode(diconv($url, $_G['charset'], 'UTF-8'));;
  123. Header("Location: $url");
  124. exit();
  125. function std_class_object_to_array($stdclassobject)
  126. {
  127. $_array = is_object($stdclassobject) ? get_object_vars($stdclassobject) : $stdclassobject;
  128. foreach ($_array as $key => $value) {
  129. $value = (is_array($value) || is_object($value)) ? std_class_object_to_array($value) : $value;
  130. $array[$key] = $value;
  131. }
  132. return $array;
  133. }
  134. function postxml($url,$data){
  135. $ch = curl_init($url);
  136. curl_setopt($ch, CURLOPT_MUTE, 1);
  137. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
  138. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  139. curl_setopt($ch, CURLOPT_POST, 1);
  140. curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
  141. curl_setopt($ch, CURLOPT_POSTFIELDS, "$data");
  142. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  143. $output = curl_exec($ch);
  144. curl_close($ch);
  145. return $output;
  146. }
  147. function postXmlCurl($xml,$url,$second=30)
  148. {
  149. //初始化curl
  150. $ch = curl_init();
  151. //设置超时
  152. curl_setopt($ch, CURLOP_TIMEOUT, $second);
  153. //这里设置代理,如果有的话
  154. //curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');
  155. //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
  156. curl_setopt($ch,CURLOPT_URL, $url);
  157. curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
  158. curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
  159. //设置header
  160. curl_setopt($ch, CURLOPT_HEADER, FALSE);
  161. //要求结果为字符串且输出到屏幕上
  162. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  163. //post提交方式
  164. curl_setopt($ch, CURLOPT_POST, TRUE);
  165. curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
  166. //运行curl
  167. $data = curl_exec($ch);
  168. curl_close($ch);
  169. //返回结果
  170. if($data)
  171. {
  172. curl_close($ch);
  173. return $data;
  174. }
  175. else
  176. {
  177. $error = curl_errno($ch);
  178. echo "curlError, error code:$error"."<br>";
  179. echo "<a href='http://curl.haxx.se/libcurl/c/libcurl-errors.html'>The reason for the error query</a></br>";
  180. curl_close($ch);
  181. return false;
  182. }
  183. }
  184. function get($url) {
  185. $ch = curl_init();
  186. curl_setopt($ch, CURLOPT_URL, $url);
  187. # curl_setopt($ch, CURLOPT_HEADER, 1);
  188. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  189. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  190. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
  191. if (!curl_exec($ch)) {
  192. error_log(curl_error($ch));
  193. $data = '';
  194. } else {
  195. $data = curl_multi_getcontent($ch);
  196. }
  197. curl_close($ch);
  198. return $data;
  199. }
  200. function getRandChar($length){
  201. $str = null;
  202. $strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
  203. $max = strlen($strPol)-1;
  204. for($i=0;$i<$length;$i++){
  205. $str.=$strPol[rand(0,$max)];//rand($min,$max)生成介于min和max两个数之间的一个随机整数
  206. }
  207. return $str;
  208. }
  209. //生成指定大小的字符串
  210. function createNoncestr( $length = 32 ){
  211. $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
  212. $str ="";
  213. for ( $i = 0; $i < $length; $i++ ) {
  214. $str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
  215. }
  216. return $str;
  217. }
  218. /**
  219. * 作用:格式化参数,签名过程需要使用
  220. */
  221. function formatBizQueryParaMap($paraMap, $urlencode)
  222. {
  223. $buff = "";
  224. ksort($paraMap);
  225. foreach ($paraMap as $k => $v)
  226. {
  227. if($urlencode)
  228. {
  229. $v = urlencode($v);
  230. }
  231. //$buff .= strtolower($k) . "=" . $v . "&";
  232. $buff .= $k . "=" . $v . "&";
  233. }
  234. $reqPar;
  235. if (strlen($buff) > 0)
  236. {
  237. $reqPar = substr($buff, 0, strlen($buff)-1);
  238. }
  239. return $reqPar;
  240. }
  241. //生成签名
  242. function getSign($Obj){
  243. global $apikey;
  244. foreach ($Obj as $k => $v)
  245. {
  246. $Parameters[$k] = $v;
  247. }
  248. //签名步骤一:按字典序排序参数
  249. ksort($Parameters);
  250. $String = formatBizQueryParaMap($Parameters, false);
  251. //echo '【string1】'.$String.'</br>';
  252. //签名步骤二:在string后加入KEY
  253. $String = $String."&key=$apikey";
  254. //echo "【string2】".$String."</br>";
  255. //签名步骤三:MD5加密
  256. $String = md5($String);
  257. //echo "【string3】 ".$String."</br>";
  258. //签名步骤四:所有字符转为大写
  259. $result_ = strtoupper($String);
  260. //echo "【result】 ".$result_."</br>";
  261. return $result_;
  262. }
  263. /**
  264. * 作用:array转xml
  265. */
  266. function arrayToXml($arr)
  267. {
  268. $xml = "<xml>";
  269. foreach ($arr as $key=>$val)
  270. {
  271. if (is_numeric($val))
  272. {
  273. $xml.="<".$key.">".$val."</".$key.">";
  274. }
  275. else
  276. $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
  277. }
  278. $xml.="</xml>";
  279. return $xml;
  280. }
  281. /**
  282. * 作用:将xml转为array
  283. */
  284. function xmlToArray($xml)
  285. {
  286. //将XML转为array
  287. $array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
  288. return $array_data;
  289. }
  290. /**
  291. * 作用:生成可以获得code的url
  292. */
  293. function createOauthUrlForCode($redirectUrl)
  294. {
  295. global $appid;
  296. $urlObj["appid"] = $appid;
  297. $urlObj["redirect_uri"] = urlencode($redirectUrl);
  298. $urlObj["response_type"] = "code";
  299. $urlObj["scope"] = "snsapi_base";
  300. $urlObj["state"] = "STATE"."#wechat_redirect";
  301. $bizString = formatBizQueryParaMap($urlObj, false);
  302. return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;
  303. }
  304. /**
  305. * 作用:生成可以获得openid的url
  306. */
  307. function createOauthUrlForOpenid()
  308. {
  309. global $appid,$appsecret,$code;
  310. $urlObj["appid"] = $appid;
  311. $urlObj["secret"] = $appsecret;
  312. $urlObj["code"] = $code;
  313. $urlObj["grant_type"] = "authorization_code";
  314. $bizString = formatBizQueryParaMap($urlObj, false);
  315. return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString;
  316. }
  317. /**
  318. * 作用:通过curl向微信提交code,以获取openid
  319. */
  320. function getOpenid()
  321. {
  322. $url = createOauthUrlForOpenid();
  323. //初始化curl
  324. $ch = curl_init();
  325. //设置超时
  326. curl_setopt($ch, CURLOP_TIMEOUT, 30); //超时时间
  327. curl_setopt($ch, CURLOPT_URL, $url);
  328. curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
  329. curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
  330. curl_setopt($ch, CURLOPT_HEADER, FALSE);
  331. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  332. //运行curl,结果以jason形式返回
  333. $res = curl_exec($ch);
  334. curl_close($ch);
  335. //取出openid
  336. $data = json_decode($res,true);
  337. $return = $data['openid'];
  338. return $return;
  339. }
  340. //删除微社区嵌入点
  341. /*
  342. $pluginid = 'xj_event';
  343. require_once DISCUZ_ROOT.'./source/plugin/wechat/wechat.lib.class.php';
  344. WeChatHook::delAPIHook($pluginid);
  345. exit('fff');
  346. */
  347. ?>