国内流行的内容管理系统(CMS)多端全媒体解决方案 https://www.dedebiz.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

330 lines
15KB

  1. <?php
  2. /**
  3. * 积分钱包
  4. *
  5. * @version $id:buy_action.php 8:38 2023年02月13日 tianya $
  6. * @package DedeBIZ.User
  7. * @copyright Copyright (c) 2022 DedeBIZ.COM
  8. * @license https://www.dedebiz.com/license
  9. * @link https://www.dedebiz.com
  10. */
  11. require_once(dirname(__FILE__)."/config.php");
  12. CheckRank(0, 0);
  13. $dopost = isset($dopost)? $dopost : '';
  14. $menutype = 'mydede';
  15. $menutype_son = 'op';
  16. require_once DEDEINC.'/dedetemplate.class.php';
  17. $product = isset($product) ? trim(HtmlReplace($product, 1)) : '';
  18. $mid = $cfg_ml->M_ID;
  19. $ptype = '';
  20. $pname = '';
  21. $price = '';
  22. $mtime = time();
  23. $paytype = isset($paytype)? intval($paytype) : 0;
  24. $buyid = isset($buyid)? HtmlReplace($buyid, 1) : '';
  25. if ($dopost === "bank_ok") {
  26. $moRow = $dsql->GetOne("SELECT * FROM `#@__member_operation` WHERE buyid='$buyid' AND mid={$mid}");
  27. if (empty($moRow)) {
  28. ShowMsg("订单查询错误,请确保是您自己发起的订单", "javascript:;");
  29. exit;
  30. }
  31. if ($moRow['sta'] == 2) {
  32. ShowMsg("已完成支付,无需重复付款", "javascript:;");
  33. exit;
  34. }
  35. $query = "UPDATE `#@__member_operation` SET sta = '1' WHERE buyid = '{$moRow['buyid']}'";
  36. $dsql->ExecuteNoneQuery($query);
  37. ShowMsg("已经完成付款,等待管理员审核", "operation.php");
  38. exit;
  39. } else if ($dopost === "wechat_ok") {
  40. $moRow = $dsql->GetOne("SELECT * FROM `#@__member_operation` WHERE buyid='$buyid' AND mid={$mid}");
  41. if (empty($moRow)) {
  42. ShowMsg("订单查询错误,请确保是您自己发起的订单", "javascript:;");
  43. exit;
  44. }
  45. $pInfo = $dsql->GetOne("SELECT * FROM `#@__sys_payment` WHERE id = 1");
  46. $pData = (array)json_decode($pInfo['config']);
  47. try {
  48. $config = array(
  49. "appid" => $pData['AppID'],
  50. "mch_id" => $pData['MchID'],
  51. "mch_key" => $pData['APIv2Secret'],
  52. );
  53. $wechat = new \WeChat\Pay($config);
  54. $options = array(
  55. 'out_trade_no' => $buyid,
  56. );
  57. $result = $wechat->queryOrder($options);
  58. } catch (Exception $e) {
  59. ShowMsg("生成微信支付信息失败,请联系网站管理员", "javascript:;");
  60. exit;
  61. }
  62. if ($result['return_code'] === "SUCCESS" && $result['trade_state'] === "SUCCESS") {
  63. if ($moRow['product'] === "card") {
  64. $row = $dsql->GetOne("SELECT * FROM `#@__moneycard_type` WHERE tid='{$moRow['pid']}'");
  65. $query = "UPDATE `#@__member_operation` SET sta = '2' WHERE buyid = '$buyid'";
  66. $dsql->ExecuteNoneQuery($query);
  67. $query = "UPDATE `#@__member` SET money = money+{$row['num']} WHERE mid = '$mid'";
  68. $dsql->ExecuteNoneQuery($query);
  69. } else if ($moRow['product'] === "member") {
  70. $row = $dsql->GetOne("SELECT * FROM `#@__member_type` WHERE aid='{$moRow['pid']}'");
  71. $rank = $row['rank'];
  72. $exptime = $row['exptime'];
  73. $rs = $dsql->GetOne("SELECT uptime,exptime FROM `#@__member` WHERE mid='".$moRow['mid']."'");
  74. if ($rs['uptime']!=0 && $rs['exptime']!=0) {
  75. $nowtime = time();
  76. $mhasDay = $rs['exptime'] - ceil(($nowtime - $rs['uptime'])/3600/24) + 1;
  77. $mhasDay=($mhasDay>0)? $mhasDay : 0;
  78. }
  79. $memrank = $dsql->GetOne("SELECT money,scores FROM `#@__arcrank` WHERE `rank`='$rank'");
  80. //更新会员信息
  81. $sqlm = "UPDATE `#@__member` SET `rank`='$rank',`money`=`money`+'{$memrank['money']}',scores=scores+'{$memrank['scores']}',exptime='$exptime'+'$mhasDay',uptime='".time()."' WHERE mid='".$moRow['mid']."'";
  82. $sqlmo = "UPDATE `#@__member_operation` SET sta='2',oldinfo='会员升级成功' WHERE buyid='{$moRow['pid']}' ";
  83. if (!($dsql->ExecuteNoneQuery($sqlm) && $dsql->ExecuteNoneQuery($sqlmo))) {
  84. ShowMsg("升级会员失败", "javascript:;");
  85. exit;
  86. }
  87. }
  88. ShowMsg("已经完成付款", "index.php");
  89. exit;
  90. } else {
  91. ShowMsg("尚未完成付款操作", "index.php");
  92. exit;
  93. }
  94. }
  95. if (isset($pd_encode) && isset($pd_verify) && md5("payment".$pd_encode.$cfg_cookie_encode) == $pd_verify) {
  96. $result = json_decode(mchStrCode($pd_encode, 'DECODE'));
  97. $product = preg_replace("#[^0-9a-z]#i", "", $result->product);
  98. $pid = preg_replace("#[^0-9a-z]#i", "", $result->pid);
  99. $row = $dsql->GetOne("SELECT * FROM `#@__member_operation` WHERE mid='$mid' AND sta=0 AND product='$product'");
  100. if (!isset($row['buyid'])) {
  101. ShowMsg("请不要重复提交表单", 'javascript:;');
  102. exit();
  103. }
  104. if ($paytype === 0) {
  105. ShowMsg("请选择支付方式", 'javascript:;');
  106. exit();
  107. }
  108. $buyid = $row['buyid'];
  109. } else {
  110. $buyid = 'M'.$mid.'T'.$mtime.'RN'.mt_rand(100, 999);
  111. //删除会员旧的未付款的同类记录
  112. if (!empty($product)) {
  113. $dsql->ExecuteNoneQuery("DELETE FROM `#@__member_operation` WHERE mid='$mid' AND sta=0 AND product='$product'");
  114. }
  115. }
  116. if (empty($product)) {
  117. ShowMsg("请选择一个产品", 'javascript:;');
  118. exit();
  119. }
  120. $pid = isset($pid) && is_numeric($pid) ? $pid : 0;
  121. if ($product == 'member') {
  122. $ptype = "会员升级";
  123. $row = $dsql->GetOne("SELECT * FROM `#@__member_type` WHERE aid='{$pid}'");
  124. if (!is_array($row)) {
  125. ShowMsg("无法识别您的订单", 'javascript:;');
  126. exit();
  127. }
  128. $pname = $row['pname'];
  129. $price = $row['money'];
  130. } else if ($product == 'card') {
  131. $ptype = "积分购买";
  132. $row = $dsql->GetOne("SELECT * FROM `#@__moneycard_type` WHERE tid='{$pid}'");
  133. if (!is_array($row)) {
  134. ShowMsg("无法识别您的订单", 'javascript:;');
  135. exit();
  136. }
  137. $pname = $row['pname'];
  138. $price = $row['money'];
  139. }
  140. if ($paytype === 0) {
  141. $inquery = "INSERT INTO `#@__member_operation` (`buyid`,`pname`,`product`,`money`,`mtime`,`pid`,`mid`,`sta`,`oldinfo`) VALUES ('$buyid','$pname','$product','$price','$mtime','$pid','$mid','0','$ptype');";
  142. $isok = $dsql->ExecuteNoneQuery($inquery);
  143. if (!$isok) {
  144. echo "数据库出错,请重新尝试".$dsql->GetError();
  145. exit();
  146. }
  147. if ($price == '') {
  148. echo "无法识别您的订单";
  149. exit();
  150. }
  151. //获取支付接口设置
  152. $payment_list = array();
  153. $dsql->SetQuery("SELECT * FROM `#@__sys_payment` WHERE `status`=1 ORDER BY sortrank ASC");
  154. $dsql->Execute();
  155. $i = 0;
  156. while ($row = $dsql->GetArray()) {
  157. $payment_list[] = $row;
  158. $i++;
  159. }
  160. $pr_encode = array();
  161. foreach ($_REQUEST as $key => $val) {
  162. if (!in_array($key, array('product', 'pid'))) {
  163. continue;
  164. }
  165. $val = preg_replace("#[^0-9a-z]#i", "", $val);
  166. $pr_encode[$key] = $val;
  167. }
  168. $pr_encode = str_replace('=', '', mchStrCode(json_encode($pr_encode)));
  169. $pr_verify = md5("payment".$pr_encode.$cfg_cookie_encode);
  170. $tpl = new DedeTemplate();
  171. $tpl->LoadTemplate(DEDEMEMBER.'/templets/buy_action_payment.htm');
  172. $tpl->Display();
  173. } else {
  174. $moRow = $dsql->GetOne("SELECT * FROM `#@__member_operation` WHERE buyid='$buyid'");
  175. if ($moRow['sta'] == 2) {
  176. ShowMsg("已完成支付,无需重复付款", "javascript:;");
  177. exit;
  178. }
  179. if ($paytype === 1) {
  180. //微信支付
  181. include_once(DEDEINC.'/libraries/oxwindow.class.php');
  182. $pInfo = $dsql->GetOne("SELECT * FROM `#@__sys_payment` WHERE id = $paytype");
  183. $pData = (array)json_decode($pInfo['config']);
  184. $config = array(
  185. "appid" => $pData['AppID'],
  186. "mch_id" => $pData['MchID'],
  187. "mch_key" => $pData['APIv2Secret'],
  188. );
  189. try {
  190. $wechat = new \WeChat\Pay($config);
  191. $options = array(
  192. 'product_id' => $buyid,
  193. 'body' => $row['pname'],
  194. 'out_trade_no' => $buyid,
  195. 'total_fee' => $row['money']*100,
  196. 'trade_type' => 'NATIVE',
  197. 'notify_url' => $GLOBALS['cfg_basehost'].$GLOBALS['cfg_phpurl'].'/notify.php?dopost=wechat',
  198. );
  199. //生成预支付码
  200. $result = $wechat->createOrder($options);
  201. $payurl = $result['code_url'];
  202. $msg = "<div>打开微信扫一扫,扫描以下二维码支付<div><div id='qrcode' style='margin:15px 0;width:200px;height:200px'></div><div><a href='buy_action.php?dopost=wechat_ok&buyid={$buyid}' class='btn btn-success btn-sm'>已完成支付</a> <a href='operation.php' class='btn btn-outline-success btn-sm'>返回订单管理</a></div>";
  203. $script = '<script type="text/javascript">var qrcode = new QRCode(document.getElementById("qrcode"), {
  204. width : 300,
  205. height : 300,
  206. correctLevel : 3
  207. });qrcode.makeCode("'.$payurl.'");</script>';
  208. $wintitle = "微信支付";
  209. $wecome_info = " ";//这个空格不要去
  210. $win = new OxWindow();
  211. $win->AddMsgItem($msg);
  212. $winform = $win->GetWindow("hand", false);
  213. $win->Display(DEDEMEMBER."/templets/win_templet.htm");
  214. } catch (Exception $e) {
  215. ShowMsg("生成微信支付信息失败,请联系网站管理员", "javascript:;");
  216. exit;
  217. }
  218. } elseif ($paytype === 2) {
  219. include_once(DEDEINC.'/libraries/oxwindow.class.php');
  220. $pInfo = $dsql->GetOne("SELECT * FROM `#@__sys_payment` WHERE id = $paytype");
  221. $pData = (array)json_decode($pInfo['config']);
  222. $config = array(
  223. "sign_type" => $pData['SignType'],
  224. "appid" => $pData['APPID'],
  225. "private_key" => $pData['PrivateKey'],
  226. "public_key" => $pData['CertPublicKey'],
  227. "notify_url" => $GLOBALS['cfg_basehost'].$GLOBALS['cfg_phpurl'].'/notify.php?dopost=alipay',
  228. "return_url" => $GLOBALS['cfg_basehost'].$GLOBALS['cfg_phpurl'].'/return.php?dopost=alipay',
  229. );
  230. //var_dump($config);exit;
  231. //支付宝
  232. try {
  233. //实例支付对象
  234. $pay = \AliPay\Web::instance($config);
  235. $result = $pay->apply(array(
  236. 'out_trade_no' => $buyid,//商户订单号
  237. 'total_amount' => $row['money'],//支付金额
  238. 'subject' => $row['pname'],//支付订单描述
  239. ));
  240. echo $result;
  241. } catch (Exception $e) {
  242. ShowMsg("生成微信支付信息失败,请联系网站管理员", "javascript:;");
  243. exit;
  244. }
  245. } elseif ($paytype === 3) {
  246. include_once(DEDEINC.'/libraries/oxwindow.class.php');
  247. //银行转账
  248. $pInfo = $dsql->GetOne("SELECT * FROM `#@__sys_payment` WHERE id = $paytype");
  249. $pData = (array)json_decode($pInfo['config']);
  250. $msg = "<p>请汇款至如下账户:</p><p>账户名:{$pData['AccountName']}</p><p>账号:{$pData['AccountNO']}</p><p>开户行:{$pData['Name']}</p><p>备注:{$buyid}</p><p>如您已经完成转账,请点击下面按钮,等待管理员确认后即可完成充值</p><div><a href='buy_action.php?dopost=bank_ok&buyid={$buyid}' class='btn btn-success btn-sm'>已完成银行转账</a> <a href='operation.php' class='btn btn-outline-success btn-sm'>返回订单管理</a></div>";
  251. $wintitle = "银行转账";
  252. $wecome_info = " ";//这个空格不要去
  253. $win = new OxWindow();
  254. $win->AddMsgItem($msg);
  255. $winform = $win->GetWindow("hand", false);
  256. $win->Display(DEDEMEMBER."/templets/win_templet.htm");
  257. } elseif ($paytype === 4) {
  258. //余额付款
  259. if ($cfg_ml->M_UserMoney < $row['money']) {
  260. ShowMsg("余额不足,请确保当前账户有足够金币支付", "javascript:;");
  261. exit;
  262. }
  263. $query = "UPDATE `#@__member_operation` SET sta = '2' WHERE buyid = '$buyid'";
  264. if ($product == 'card') {
  265. $dsql->ExecuteNoneQuery($query);
  266. $query = "UPDATE `#@__member` SET money = money+{$row['num']} WHERE mid = '$mid'";
  267. $dsql->ExecuteNoneQuery($query);
  268. $query = "UPDATE `#@__member` SET user_money = user_money-{$row['money']} WHERE mid = '$mid'";
  269. $dsql->ExecuteNoneQuery($query);
  270. } else if ($product == 'member') {
  271. $rank = $row['rank'];
  272. $exptime = $row['exptime'];
  273. $rs = $dsql->GetOne("SELECT uptime,exptime FROM `#@__member` WHERE mid='".$mid."'");
  274. if ($rs['uptime']!=0 && $rs['exptime']!=0) {
  275. $nowtime = time();
  276. $mhasDay = $rs['exptime'] - ceil(($nowtime - $rs['uptime'])/3600/24) + 1;
  277. $mhasDay=($mhasDay>0)? $mhasDay : 0;
  278. }
  279. $memrank = $dsql->GetOne("SELECT money,scores FROM `#@__arcrank` WHERE `rank`='$rank'");
  280. //更新会员信息
  281. $sqlm = "UPDATE `#@__member` SET `rank`='$rank',`money`=`money`+'{$memrank['money']}',scores=scores+'{$memrank['scores']}',exptime='$exptime'+'$mhasDay',uptime='".time()."' WHERE mid='".$mid."'";
  282. $sqlmo = "UPDATE `#@__member_operation` SET sta='2',oldinfo='会员升级成功' WHERE buyid='$buyid' ";
  283. if (!($dsql->ExecuteNoneQuery($sqlm) && $dsql->ExecuteNoneQuery($sqlmo))) {
  284. ShowMsg("升级会员失败", "javascript:;");
  285. exit;
  286. }
  287. }
  288. ShowMsg("成功使用余额付款", "javascript:;");
  289. exit;
  290. } elseif ($paytype === 5) {
  291. //货到付款
  292. ShowMsg("虚拟物品,不支持货到付款", "javascript:;");
  293. exit;
  294. }
  295. }
  296. /**
  297. * 加密函数
  298. *
  299. * @access public
  300. * @param string $string 字符串
  301. * @param string $operation 操作
  302. * @return string
  303. */
  304. function mchStrCode($string, $operation = 'ENCODE')
  305. {
  306. $key_length = 4;
  307. $expiry = 0;
  308. $key = md5($GLOBALS['cfg_cookie_encode']);
  309. $fixedkey = md5($key);
  310. $egiskeys = md5(substr($fixedkey, 16, 16));
  311. $runtokey = $key_length ? ($operation == 'ENCODE' ? substr(md5(microtime(true)), -$key_length) : substr($string, 0, $key_length)) : '';
  312. $keys = md5(substr($runtokey, 0, 16).substr($fixedkey, 0, 16).substr($runtokey, 16).substr($fixedkey, 16));
  313. $string = $operation == 'ENCODE' ? sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$egiskeys), 0, 16).$string : base64_decode(substr($string, $key_length));
  314. $i = 0;
  315. $result = '';
  316. $string_length = strlen($string);
  317. for ($i = 0; $i < $string_length; $i++) {
  318. $result .= chr(ord($string[$i]) ^ ord($keys[$i % 32]));
  319. }
  320. if ($operation == 'ENCODE') {
  321. return $runtokey.str_replace('=', '', base64_encode($result));
  322. } else {
  323. if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$egiskeys), 0, 16)) {
  324. return substr($result, 26);
  325. } else {
  326. return '';
  327. }
  328. }
  329. }
  330. ?>