游戏对接实例
传奇游戏对接易支付实例
斩仙情缘对接易支付实例
莽荒纪H5平台币版对接易支付实例
-
+
首页
莽荒纪H5平台币版对接易支付实例
### 整体支付流程:游戏内点击充值-弹出窗口-使用用户余额购买以及充值余额  ### 支付页面示例:    ### **以下代码开始:** #### lib/epay.config.php 商户配置api配置文件: ``` <?php /* * * 配置文件 */ //支付接口地址 $epay_config['apiurl'] = 'https://cc.txyi.cc/'; //商户ID $epay_config['pid'] = '1'; //商户密钥 $epay_config['key'] = 'xxxxxxxxxxxxxxxxxxxxx'; ``` #### epayapi.php支付跳转页面(余额充值): ``` <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>正在为您跳转到支付页面,请稍候...</title> <style type="text/css"> body{margin:0;padding:0} p{position:absolute;left:50%;top:50%;height:35px;margin:-35px 0 0 -160px;padding:20px;font:bold 16px/30px "宋体",Arial;text-indent:40px;border:1px solid #c5d0dc} #waiting{font-family:Arial} </style> </head> <body> <?php require_once("lib/epay.config.php"); require_once("lib/EpayCore.class.php"); /**************************请求参数**************************/ $notify_url = "http://你的ip/notify_url.php"; $return_url = "http://你的ip/return_url.php"; // 商户订单号 $out_trade_no = date("YmdHis").mt_rand(100,999); // 支付方式 $type = $_GET['pay']; // 用户ID $user_id = $_GET['uid']; // 金额 $money = $_GET['km']; if($money < 10){ exit('最低充值金额10元'); } // 连接数据库创建订单记录 $servername = "localhost:3306"; $username = "pay.jjzfw.com"; $password = "pay.jjzfw.com"; $dbname = "account"; $conn = new mysqli($servername, $username, $password, $dbname); if ($conn->connect_error) { die("数据库连接失败:" . $conn->connect_error); } $conn->query('set names utf8'); $current_time = date("Y-m-d H:i:s"); $sql = "INSERT INTO `xianshang_log` (`danhao`,`uid`, `num`, `time`, `type`) VALUES ('$out_trade_no','$user_id', '$money', '$current_time', '1')"; if ($conn->query($sql) !== TRUE) { die("订单创建失败:" . $conn->error); } $conn->close(); /************************************************************/ // 构造参数 $parameter = array( "pid" => $epay_config['pid'], "type" => $type, "notify_url" => $notify_url, "return_url" => $return_url, "out_trade_no" => $out_trade_no, "name" => "平台充值", // 固定名称,因为我们pay.jjzfw.com平台是定义了商品名字的。 "money" => $money, "param" => $user_id // 业务扩展参数 ); // 生成支付表单并跳转 $epay = new EpayCore($epay_config); $html_text = $epay->pagePay($parameter); echo $html_text; ?> <p>正在为您跳转到支付页面,请稍候...</p> </body> </html> ``` #### notify_url.php异步通知页面(余额充值)(每一步我都做了log写入确保你们能正确配置成功): ``` <?php // 日志文件路径(如果出错在notify_log.txt文件看报错进行修正) $logFile = 'notify_log.txt'; $log = "===== " . date("Y-m-d H:i:s") . " 开始 =====" . PHP_EOL; require_once("lib/epay.config.php"); require_once("lib/EpayCore.class.php"); // 验证通知 $epay = new EpayCore($epay_config); $verify_result = $epay->verifyNotify(); $log .= "1. 签名验证结果:" . ($verify_result ? "成功" : "失败") . PHP_EOL; if($verify_result) { // 签名验证成功 // 获取回传的数据 $out_trade_no = $_GET['out_trade_no'] ?? '未知订单号'; // 商户订单号 $trade_no = $_GET['trade_no'] ?? '未知交易号'; // 易支付订单号 $trade_status = $_GET['trade_status'] ?? '未知状态'; // 支付状态 $type = $_GET['type'] ?? '未知支付方式'; // 支付方式 $name = $_GET['param'] ?? '未知用户ID'; // 用户ID $money = $_GET['money'] ?? '0'; // 支付金额(元) $log .= "2. 回传参数:订单号=$out_trade_no, 用户ID=$name, 金额=$money元, 状态=$trade_status" . PHP_EOL; // 3. 只有支付成功(TRADE_SUCCESS)才处理加币 if ($trade_status === 'TRADE_SUCCESS') { $log .= "3. 支付成功,开始处理加币..." . PHP_EOL; // 4. 连接数据库(用你的配置) $dbConfig = [ 'host' => '127.0.0.1:3306', 'user' => 'pay.jjzfw.com', 'pass' => 'pay.jjzfw.com', 'dbname' => 'account' ]; $con = mysqli_connect( $dbConfig['host'], $dbConfig['user'], $dbConfig['pass'], $dbConfig['dbname'] ); if (!$con) { $log .= "4. 数据库连接失败:" . mysqli_connect_error() . PHP_EOL; file_put_contents($logFile, $log . "===== 结束 =====" . PHP_EOL . PHP_EOL, FILE_APPEND); echo "fail"; // 通知易支付处理失败 exit; } $con->query('set names utf8'); $log .= "4. 数据库连接成功" . PHP_EOL; // 5. 检查订单是否存在且未处理(xianshang_log表) $orderSql = "SELECT * FROM `xianshang_log` WHERE `danhao` = '$out_trade_no' LIMIT 1"; $orderResult = $con->query($orderSql); $orderRow = $orderResult->fetch_array(); $pytype = $orderRow['type'] ?? ''; $log .= "5. 订单查询结果:type=$pytype" . PHP_EOL; if ($pytype != 1) { $log .= "5. 订单已处理(type不等于1)" . PHP_EOL; $con->close(); file_put_contents($logFile, $log . "===== 结束 =====" . PHP_EOL . PHP_EOL, FILE_APPEND); echo "success"; // 已处理仍返回success避免重复通知 exit; } if (empty($pytype)) { $log .= "5. 订单不存在(danhao=$out_trade_no)" . PHP_EOL; $con->close(); file_put_contents($logFile, $log . "===== 结束 =====" . PHP_EOL . PHP_EOL, FILE_APPEND); echo "fail"; exit; } // 6. 检查用户是否存在(account表) $userSql = "SELECT * FROM `account` WHERE `username` = '$name' LIMIT 1"; $userResult = $con->query($userSql); $userRow = $userResult->fetch_array(); if (empty($userRow)) { $log .= "6. 用户不存在(username=$name)" . PHP_EOL; $con->close(); file_put_contents($logFile, $log . "===== 结束 =====" . PHP_EOL . PHP_EOL, FILE_APPEND); echo "fail"; exit; } $log .= "6. 用户存在(username=$name)" . PHP_EOL; // 7. 计算平台币(1元=1000平台币) $addMoney = $money * 1000; $log .= "7. 计算加币:$money元 × 1000 = $addMoney平台币" . PHP_EOL; // 8. 记录支付日志(paylog表) $time = date("Y-m-d"); $logSql = "INSERT INTO `paylog` (sid,uid,money,ag,tid,name,time) VALUES ('0','$name','$money','{$userRow['ag']}','0','平台币充值','$time')"; $logResult = $con->query($logSql); $log .= "8. 写入paylog:" . ($logResult ? "成功" : "失败(错误:" . $con->error . ")") . PHP_EOL; // 9. 执行加币操作(更新account表) $updateSql = "UPDATE `account` SET `money` = `money` + $addMoney WHERE `username` = '$name'"; $updateResult = $con->query($updateSql); $log .= "9. 执行加币SQL:$updateSql" . PHP_EOL; $log .= "9. 加币结果:" . ($updateResult ? "成功" : "失败(错误:" . $con->error . ")") . PHP_EOL; // 10. 标记订单为已处理(xianshang_log表) if ($updateResult) { $con->query("UPDATE `xianshang_log` SET `type` = 3 WHERE `danhao` = '$out_trade_no'"); $log .= "10. 订单标记为已处理(type=3)" . PHP_EOL; echo "success"; // 通知易支付处理成功 } else { echo "fail"; } $con->close(); } else { $log .= "3. 支付未成功(状态:$trade_status),不处理" . PHP_EOL; echo "success"; // 非成功状态也返回success避免重复通知 } } else { $log .= "1. 签名验证失败(可能是伪造请求)" . PHP_EOL; echo "fail"; } // 写入日志 $log .= "===== 结束 =====" . PHP_EOL . PHP_EOL; file_put_contents($logFile, $log, FILE_APPEND); ?> ``` #### epayapia.php支付跳转页面(月卡购买): ``` <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>正在为您跳转到支付页面,请稍候...</title> <style type="text/css"> body{margin:0;padding:0} p{position:absolute;left:50%;top:50%;height:35px;margin:-35px 0 0 -160px;padding:20px;font:bold 16px/30px "宋体",Arial;text-indent:40px;border:1px solid #c5d0dc} #waiting{font-family:Arial} </style> </head> <body> <?php require_once("lib/epay.config.php"); require_once("lib/EpayCore.class.php"); /**************************请求参数**************************/ $notify_url = "http://你的ip/notify_urll.php"; $return_url = "http://你的ip/return_url.php"; // 商户订单号 $out_trade_no = date("YmdHis").mt_rand(100,999); // 支付方式 $type = $_GET['pay']; // 用户ID $user_id = $_GET['uid']; // 金额判断逻辑 $km = $_GET['km']; $money = 300; // 默认金额 if($km == 'xiao'){ $money = 999; // 若km为'xiao',金额设为999 } // 连接数据库创建订单记录(用真实用户ID和金额) $servername = "localhost:3306"; $username = "pay.jjzfw.com"; $password = "pay.jjzfw.com"; $dbname = "account"; $conn = new mysqli($servername, $username, $password, $dbname); if ($conn->connect_error) { die("数据库连接失败:" . $conn->connect_error); } $conn->query('set names utf8'); $current_time = date("Y-m-d H:i:s"); $sql = "INSERT INTO `xianshang_log` (`danhao`,`uid`, `num`, `time`, `type`) VALUES ('$out_trade_no','$user_id', '$money', '$current_time', '1')"; if ($conn->query($sql) !== TRUE) { die("订单创建失败:" . $conn->error); } $conn->close(); /************************************************************/ // 构造参数 $parameter = array( "pid" => $epay_config['pid'], "type" => $type, "notify_url" => $notify_url, "return_url" => $return_url, "out_trade_no" => $out_trade_no, "name" => "平台充值", "money" => $money, "param" => $user_id // ID ); // 生成支付表单并跳转 $epay = new EpayCore($epay_config); $html_text = $epay->pagePay($parameter); echo $html_text; ?> <p>正在为您跳转到支付页面,请稍候...</p> </body> </html> ``` #### notify_urll.php异步通知页面(月卡购买)(按照[开发文档](https://doc.jjzfw.com/doc/14/)编写,并非一定要使用该代码): ``` <?php require_once("lib/epay.config.php"); require_once("lib/EpayCore.class.php"); //计算得出通知验证结果 $epay = new EpayCore($epay_config); $verify_result = $epay->verifyNotify(); if($verify_result) {//验证成功 //商户订单号 $out_trade_no = $_GET['out_trade_no']; //易支付 $trade_no = $_GET['trade_no']; //交易状态 $trade_status = $_GET['trade_status']; //支付方式 $type = $_GET['type']; $name = $_GET['param'] ?? '未知用户ID'; //支付金额 $money = $_GET['money']; if ($_GET['trade_status'] == 'TRADE_SUCCESS') { $ip = "127.0.0.1:3306"; $ur = "pay.jjzfw.com"; $pd = "pay.jjzfw.com"; $showtime=date("Y-m-d"); $qu = 'account'; $con=mysqli_connect($ip,$ur,$pd,$qu); if(!$con) { echo '连接数据库失败'; return 0; } $row9 = $con->query("SELECT * FROM `xianshang_log` WHERE `danhao` = '$out_trade_no' LIMIT 1")->fetch_array(); $pytype = $row9['type']; if($pytype != 1){ exit('订单已处理'); } if($pytype == ''){ exit('订单不存在'); } $row5 = $con->query("SELECT * FROM `account` WHERE `username` = '$name' LIMIT 1")->fetch_array(); $ag = $row5['ag']; $rmbb = 100000; $payname = '月卡购买'; if($money == 999){ $payname = '年卡购买'; $rmbb = 400000; } $query1 = "INSERT INTO `paylog` (sid,uid,money,ag,tid,name,time) VALUES ('0','$name','$money','$ag','0','$payname','$showtime')"; $res=mysqli_query($con,$query1 ); $sql_2 = "UPDATE `account`.`account` SET `money` = money + $rmbb WHERE `username` = '$name'"; $result_2 = $con->query($sql_2); if ($result_2) { $aaaa = 3; if($money == 999){ $sql_3 = "UPDATE `account`.`xianshang_log` SET `type` = $aaaa WHERE `danhao` = '$out_trade_no'"; $result_9 = $con->query($sql_3); $showtimea = date("Ymd", strtotime("+365 days")); $sql_11 = "UPDATE `account`.`account` SET `card2` = $showtimea WHERE `username` = '$name'"; $result_91 = $con->query($sql_11); echo "success"; exit; } if($money == 300){ $sql_3 = "UPDATE `account`.`xianshang_log` SET `type` = $aaaa WHERE `danhao` = '$out_trade_no'"; $result_9 = $con->query($sql_3); $showtimea = date("Ymd", strtotime("+30 days")); $sql_11 = "UPDATE `account`.`account` SET `lv` = $showtimea WHERE `username` = '$name'"; $result_91 = $con->query($sql_11); echo "success"; } } else { echo "充值失败: " . $con->error; } } //验证成功返回 } else { //验证失败 echo "fail"; } ?> ``` #### 主支付界面pay.php: ``` <?php error_reporting(0); include "../config.php"; $jsonData = $_GET['orderInfoJson']; // 获取 POST 请求的原始数据 $requestDaa = base64_decode($jsonData); $orderInfo = json_decode($requestDaa, true); // 解码 JSON 数据为 PHP 数组 // 可以通过以下方式访问解码后的数据 $productCode = $orderInfo['productCode']; $uid = $orderInfo['uid']; $username = $orderInfo['username']; $userRoleId = $orderInfo['userRoleId']; $userRoleName = $orderInfo['userRoleName']; $serverId = $orderInfo['serverId']; $userServer = $orderInfo['userServer']; $userLevel = $orderInfo['userLevel']; $cpOrderNo = $orderInfo['cpOrderNo']; $amount = $orderInfo['amount']; $subject = $orderInfo['subject']; $desc = $orderInfo['desc']; $callbackUrl = $orderInfo['callbackUrl']; $extrasParams = $orderInfo['extrasParams']; $goodsId = $orderInfo['goodsId']; $count = $orderInfo['count']; $quantifier = $orderInfo['quantifier']; $partyName = $orderInfo['partyName']; $money = $amount*100; // 在这里处理解码后的数据 $conn = mysqli_connect(DBHOST,DBUSER,DBPASS,DBNAME,DBPORT) or die('1112, 数据库错误'); $conn->query('set names utf8'); $sql = "select * from `account` where `username`='$uid'"; $result = $conn->query($sql); $row = $result->fetch_array(); $moneya = $row['money']; $qid = $row['quid']; if($qid == ''){ $sql_2 = "UPDATE `account`.`account` SET `quid` = $serverId WHERE `username` = '$uid'"; $result_2 = $conn->query($sql_2); $qid = $serverId; } if($qid != $serverId){ $jis = $qid-1000000; $xinxix = '该账号已绑定'.$jis.'区,无法在其他区支付'; exit($xinxix); } ?> <!DOCTYPE html> <html lang="zh"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" /> <title>蛮荒记</title> <link rel="icon" href="http://58yx.top:81/images/favicon.ico" type="image/ico"> <meta name="author" content="yinqi"> <link href="css/bootstrap.min.css" rel="stylesheet"> <link href="css/materialdesignicons.min.css" rel="stylesheet"> <!--对话框--> <link rel="stylesheet" href="css/jquery-confirm.min.css"> <link href="css/style.min.css" rel="stylesheet"> <script type="text/javascript" src="js/jquery-2.1.1.min.js"></script> <script type="text/javascript" src="js/layer.js"></script> <script type="text/javascript" src="js/jquery.pjax.min.js"></script> <script type="text/javascript" src="js/clwl.js?ver=1.0"></script> <script type="text/javascript" src="js/bootstrap.min.js"></script> <script type="text/javascript" src="js/jconfirm/jquery-confirm.min.js"></script> <style> .lyear-wrapper { position: relative; } </style> </head> <body> <div class="lyear-wrapper" id="pjax"> <div style="margin: 0 auto;"> <div class="col-xs-12 col-sm-10 col-lg-8 center-block" style="float: none;"> <div class="panel panel-primary"> <div class="panel-body"> <div class="input-group"> <span class="input-group-addon">充值区服</span> <input type="text" name="quname" class="form-control" value="<?php echo $userServer;?>" disabled /> </div><br /> <div class="input-group"> <span class="input-group-addon">账号余额</span> <input type="text" name="user" class="form-control" value="<?php echo $moneya;?>" disabled /> </div><br /> <div class="input-group"> <span class="input-group-addon">消耗币额</span> <input type="text" name="money" class="form-control" value="<?php echo $money;?>" disabled /> </div><br /> <div class="input-group"> <span class="input-group-addon">角色名称</span> <input type="text" name="name" class="form-control" value="<?php echo $userRoleName;?>" disabled /> </div><br /> <div class="input-group"> <span class="input-group-addon">充值礼包</span> <input type="text" name="pay" class="form-control" value="<?php echo $subject;?>" disabled /> </div><br /> <div> <button type="button" id="formDemo" class="btn btn-info form-control" onclick="getshop()">确认购买</button> </div><br /> <button type="button" id="formDemo" class="btn btn-info form-control" onclick="getpay()">平台币充值</button> </div><br /> <table class="table table-bordered"> <tbody> <tr height="50"> <td> <!--<a href="/user/bind.php" class="btn btn-block btn-danger" pjax="exclude">换绑区服</a>--> <a class="btn btn-block btn-danger" onclick="getvip()">月卡购买</a> </td> <td> <a class="btn btn-block btn-danger" onclick="getyu()">月卡查询</a> </td> </tr> </tbody> </table> </div> </div> </div> </div> </div> <script> function getshop () { var uid = "<?php echo $uid;?>"; var data = '<?php echo $jsonData; ?>'; $('#formDemo').attr("disabled",true).addClass("layui-btn-disabled"); $.ajax({ url: '../api.php?type=charge', type: 'post', dataType: 'json', data: {uid:uid,data:data}, beforeSend: function() { // 发送请求前的操作,例如显示弹窗提示 layer.msg('正在叫醒收银小姐姐,请稍后...', {icon: 16, area: ['90%', '90%']}); }, success: function (data) { console.log(data); layer.closeAll('loading'); layer.msg(data.msg); setTimeout(function () { var index = parent.layer.getFrameIndex(window.name); parent.layer.close(index); }, 800); }, error: function (error) { layer.closeAll('loading'); layer.msg('系统错误,联系管理!'); } }); } function getpay () { var uid = "<?php echo $uid;?>"; $.confirm({ title: '温馨提示', content: '' + '<form class="formName">' + '<div class="form-group">' + '<label>平台币充值(比例1RMB=1000平台币)</label>' + '<input type="text" name="km" placeholder="请输入您要充值的金额" class="cdk form-control" required />' + '</div>' + '<div class="input-group">' + '<span class="input-group-addon">支付方式</span>' + '<select id="paytype" name="paytype" class="form-control">' + '<option value="alipay">支付宝</option>' + '<option value="wxpay">微信</option>' + '</select></div><br />' + '</form>', buttons: { formSubmit: { text: '提交', btnClass: 'btn-blue', action: function () { var km = $("input[name='km']").val(); var selecta = document.getElementById("paytype"); var pay = selecta.value; if(!km){ $.alert('请输入您的充值金额'); return false; } layer.load(1); var $uaer = "epayapi.php?&" + "uid=" + uid + "&km=" + km+ "&pay=" + pay; window.location.href = $uaer; } }, cancel: { text: '取消' }, }, onContentReady: function () { var jc = this; this.$content.find('form').on('submit', function (e) { e.preventDefault(); jc.$$formSubmit.trigger('click'); }); } }); } function getvip () { var uid = "<?php echo $uid;?>"; $.confirm({ title: '月卡购买', content: '' + '<form class="formName">' + '<div class="form-group">' + '<label>购买成功立即到账10w平台币(后续一个月每天自动到账13000)</label>' + '<label>月卡需支付300元每月(到期后才能再次购买)</label>' + '</div>' + '<div class="input-group">' + '<span class="input-group-addon">支付方式</span>' + '<select id="paytype" name="paytype" class="form-control">' + '<option value="alipay">支付宝</option>' + '<option value="wxpay">微信</option>' + '</select></div><br />' + '</form>', buttons: { formSubmit: { text: '提交', btnClass: 'btn-blue', action: function () { var selecta = document.getElementById("paytype"); var pay = selecta.value; layer.load(1); var $uaer = "epayapia.php?&" + "uid=" + uid + "&km=xiaowu&pay=" + pay; window.location.href = $uaer; } }, cancel: { text: '取消' }, }, onContentReady: function () { var jc = this; this.$content.find('form').on('submit', function (e) { e.preventDefault(); jc.$$formSubmit.trigger('click'); }); } }); } function getyu () { var uid = "<?php echo $uid;?>"; $('#formDemo').attr("disabled",true).addClass("layui-btn-disabled"); $.ajax({ url: '../api.php?type=yu', type: 'post', dataType: 'json', data: {uid:uid}, success: function (data) { console.log(data); layer.closeAll('loading'); layer.msg(data.msg); setTimeout(function () { var index = parent.layer.getFrameIndex(window.name); parent.layer.close(index); }, 800); }, error: function (error) { layer.closeAll('loading'); layer.msg('系统错误,联系管理!'); } }); } </script> </body> </html> ```
hechu
2025年11月2日 16:19
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码