游戏对接实例
传奇游戏对接易支付实例
斩仙情缘对接易支付实例
莽荒纪H5平台币版对接易支付实例
-
+
首页
传奇游戏对接易支付实例
>i **以下代码全都是按照客户需求依照易支付开发文档V1来写的,大部分关键部分我都有做标注**  #### ldconfig.php(配置文件): ``` <?php ini_set("error_reporting","E_ALL & ~E_NOTICE"); header("Content-type: text/html; charset=utf-8"); // 这里易支付配置 $pid = "1"; // 商户ID $userkey = "xxxxxxxxxx"; // 商户秘钥 $payurl = "https://cc.txyi.cc/submit.php"; // 易支付地址 // 通知地址 $notifyurl = 'http://'.$_SERVER['HTTP_HOST'].'/pay/ldpayapi.php'; $returnurl = 'http://'.$_SERVER['HTTP_HOST'].'/pay/ldpayreturn.php'; // 区服配置 $qus=array( 's1'=>array( 'name'=>'高爆一区', 'DB_HOST'=>'127.0.0.1', 'DB_PORT'=>3306, 'DB_USER'=>'root', 'DB_PSWD'=>'123456', 'DB_NAME'=>'actor_1', //确保表明要对,才能写入充值数据 'id' => 1 ), ); // 商品配置 $charges=array( "pay.jjzfw.com10" => '2W元宝', "pay.jjzfw.com30" => '6W元宝', "pay.jjzfw.com50" => '10W元宝', "pay.jjzfw.com100" => '20W元宝', "pay.jjzfw.com300" => '60W元宝', "pay.jjzfw.com500" => '100W元宝', "pay.jjzfw.com1000" => '200W元宝', "pay.jjzfw.com3000" => '1000W元宝', ); ?> ``` #### ldpay.php(支付页面): ``` <?php error_reporting(0); require 'ldconfig.php'; $pram=$_GET; $q_id = $pram['serverId']; $serverinfo = $qus[$q_id]; $productName = $pram['productName']; $amount = $pram['amount']; $actorid = $pram['actorid']; $productId = $pram['productId']; $orderid = 'BXCQ'.time(); // 商户订单号(确保订单号唯一,否则会出现白嫖等问题) // 数据库查询 $conn=mysqli_connect($serverinfo['DB_HOST'],$serverinfo['DB_USER'],$serverinfo['DB_PSWD']); mysqli_select_db($conn,$serverinfo['DB_NAME']); $sql='SELECT * FROM actors WHERE actorid="'.$actorid.'"'; $obj=mysqli_query($conn,$sql); $row1=mysqli_fetch_array($obj); $uid = $row1['actorid']; $rolename = $row1['actorname']; $serverid = $serverinfo['name']; $accountid = $serverinfo['accountid']; $remark = $actorid."_".$q_id."_".$productId.'_'.$rolename; // 业务扩展参数 ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> <title>支付页面示例</title> <link rel="stylesheet" href="css/plays.css" /> <script type="text/javascript" src="js/jquery.min.js"></script> </head> <body> <div class="plays_box"> <div class="plays_box_cc"> <div class="plays_box_s1"><img src="https://pay.jjzfw.com/czlogo.png"></div> <div class="plays_box_kk_cc_s1"><img src="https://pay.jjzfw.com/czlogo.png"></div> <div class="plays_box_kk_cc_s2"><img src="https://pay.jjzfw.com/czlogo.png"></div> <div class="plays_box_s2"> <div class="plays_box_s2_item"> <div class="plays_box_s2_item_s1">平台订单:</div> <div class="plays_box_s2_item_s2"><?php echo $orderid; ?></div> </div> <div class="plays_box_s2_item"> <div class="plays_box_s2_item_s1">充值账号:</div> <div class="plays_box_s2_item_s2"><?php echo $uid;?></div> </div> <div class="plays_box_s2_item"> <div class="plays_box_s2_item_s1">元宝数量:</div> <div class="plays_box_s2_item_s2"><?php echo $productName;?></div> </div> <div class="plays_box_s2_item"> <div class="plays_box_s2_item_s1">充值区服:</div> <div class="plays_box_s2_item_s2"><?php echo $q_id;?>区</div> </div> <div class="plays_box_s2_item"> <div class="plays_box_s2_item_s1">付款金额:</div> <div class="plays_box_s2_item_s2">¥ <span><?php echo $amount;?></span> 元</div> </div> </div> <!-- 支付表单(客户PHP版本太低POST写出来总有问题所以改用GET了,无伤大雅) --> <form action="ldpay.php" method="get"> <div class="plays_box_s3"> <div class="plays_box_s3_s1"> <div class="plays_box_s3_item"> <div class="plays_box_s3_item_s1"><img src="img/logo_1.png"></div> <div class="plays_box_s3_item_s2">支付宝</div> <div class="plays_box_s3_item_s3" onclick="type('ali')"><img id="img3" src="img/ic-2.png"></div> </div> <div class="plays_box_s3_item"> <div class="plays_box_s3_item_s1"><img src="img/logo_2.png"></div> <div class="plays_box_s3_item_s2">微信</div> <div class="plays_box_s3_item_s3" onclick="type('wx')"><img id="img4" src="img/ic-1.png"></div> </div> <input type="hidden" id="paytype" name="type" value="alipay" > <input type='hidden' name='rolename' value='<?php echo $rolename;?>' /> <input type='hidden' name='serverid' value='<?php echo $serverid;?>' /> <input type='hidden' name='productId' value='<?php echo $productId;?>' /> <input type='hidden' name='money' value='<?php echo $amount;?>' /> <input type='hidden' name='accountid' value='<?php echo $accountid;?>' /> <input type='hidden' name='out_trade_no' value='<?php echo $orderid;?>' /> <input type='hidden' name='remark' value='<?php echo $remark;?>' /> <button type="submit" class="plays_box_s3_bnt">立即支付</button> </div> </div> </form> </div> </div> </body> <script type="text/javascript"> function type(pay) { if(pay == 'ali'){ $("#img4").attr("src","img/ic-1.png"); $("#img3").attr("src","img/ic-2.png"); $('#paytype').val('alipay'); }else{ $("#img4").attr("src","img/ic-2.png"); $("#img3").attr("src","img/ic-1.png"); $('#paytype').val('wxpay'); } } </script> </html> ``` #### ldpay.php(跳转 + 签名): ``` <?php require 'ldconfig.php'; // 获取表单参数 $type = $_GET['type']; // 支付方式(alipay/wxpay)(usdt可选,不过客户用不到) $out_trade_no = $_GET['out_trade_no']; // 商户订单号 $money = number_format($_GET['money'], 2, '.', ''); // 金额保留2位小数(参考开发文档) $remark = $_GET['remark']; // 扩展参数 $productId = $_GET['productId']; $productName = $charges[$productId]; // 商品名称 // 签名参数(按ASCII排序) $params = array( 'pid' => $pid, 'type' => $type, 'out_trade_no' => $out_trade_no, 'notify_url' => $notifyurl, 'return_url' => $returnurl, 'name' => $productName, 'money' => $money, 'param' => $remark ); ksort($params); // 参数名排序 // 生成签名(务必确保没有多余的连接符,在这里卡了老久) $sign_parts = array(); foreach ($params as $k => $v) { if ($v !== '' && $k != 'sign' && $k != 'sign_type') { $sign_parts[] = "{$k}={$v}"; } } $sign_str = implode('&', $sign_parts) . $userkey; // 拼接秘钥 $sign = md5($sign_str); // 生成MD5签名 // 构建跳转 $pay_params = array_merge($params, array( 'sign' => $sign, 'sign_type' => 'MD5' )); $pay_url = $payurl . '?' . http_build_query($pay_params); // 跳转支付 header("Location: " . $pay_url); exit; ?> ``` #### ldpayapi.php(异步通知) ``` <?php require 'ldconfig.php'; // 禁止输出多余内容(确保可以正常返回success) ob_clean(); // 获取异步通知参数 $pid = $_GET['pid']; $trade_no = $_GET['trade_no']; $out_trade_no = $_GET['out_trade_no']; $type = $_GET['type']; $name = $_GET['name']; $money = $_GET['money']; $trade_status = $_GET['trade_status']; $param = $_GET['param']; $sign = $_GET['sign']; // 验证签名 $params = array( 'pid' => $pid, 'trade_no' => $trade_no, 'out_trade_no' => $out_trade_no, 'type' => $type, 'name' => $name, 'money' => $money, 'trade_status' => $trade_status, 'param' => $param ); ksort($params); // 排序 // 生成验证签名 $sign_parts = array(); foreach ($params as $k => $v) { if ($v !== '' && $k != 'sign' && $k != 'sign_type') { $sign_parts[] = "{$k}={$v}"; } } $sign_str = implode('&', $sign_parts) . $userkey; $mysign = md5($sign_str); // 验证通过且支付成功 if ($sign == $mysign && $trade_status == 'TRADE_SUCCESS') { // 解析参数(玩家信息) $array = explode("_", $param); if (count($array) < 4) { echo "fail"; // 参数错误 exit; } $serverKey = $array[1]; $serverinfo = $qus[$serverKey]; if (!$serverinfo) { echo "fail"; // 区服错误 exit; } // 连接数据库写入订单 $conn = mysqli_connect($serverinfo['DB_HOST'], $serverinfo['DB_USER'], $serverinfo['DB_PSWD']); if (!$conn) { echo "fail"; exit; } mysqli_select_db($conn, $serverinfo['DB_NAME']); $actorid = $array[0]; $accountname = $array[3]; $proid = $array[2]; $tt = date('Y-m-d H:i:s', time()); $serverid = $serverinfo['id']; $sql = "insert into feecallback values(null,10003,$serverid,$actorid,'$accountname','$proid',1,'',0,'$tt',0,1)"; mysqli_query($conn, $sql); mysqli_close($conn); // 一样的必须返回success echo "success"; exit; } // 验证失败 echo "fail"; ?> ``` #### ldpayreturn.php(页面跳转通知) ``` <?php require 'ldconfig.php'; // 获取参数 $pid = $_GET['pid']; $trade_no = $_GET['trade_no']; $out_trade_no = $_GET['out_trade_no']; $type = $_GET['type']; $name = $_GET['name']; $money = $_GET['money']; $trade_status = $_GET['trade_status']; $param = $_GET['param']; $sign = $_GET['sign']; // 验证签名 $params = array( 'pid' => $pid, 'trade_no' => $trade_no, 'out_trade_no' => $out_trade_no, 'type' => $type, 'name' => $name, 'money' => $money, 'trade_status' => $trade_status, 'param' => $param ); ksort($params); // 生成签名 $sign_parts = array(); foreach ($params as $k => $v) { if ($v !== '' && $k != 'sign' && $k != 'sign_type') { $sign_parts[] = "{$k}={$v}"; } } $sign_str = implode('&', $sign_parts) . $userkey; $mysign = md5($sign_str); // 通过 if ($sign == $mysign && $trade_status == 'TRADE_SUCCESS') { echo "<script>alert('支付成功!即将返回游戏。');window.location.href='../';</script>"; //替换为游戏首页,也可以使用 window.open() 脚本打开支付页面,然后用window.close()关闭标签页具体我放在下面。 } else { echo "<script>alert('支付失败,请重试!');history.back();</script>"; } ?> ``` ### 修改支付打开方式: 将表单提交改为通过 window.open() 打开支付页,然后回调后关掉 ``` <button type="button" class="plays_box_s3_bnt" onclick="openPayWindow()">立即支付</button> <script> function openPayWindow() { const type = document.getElementById('paytype').value; const outTradeNo = '<?php echo $orderid; ?>'; const money = '<?php echo $amount; ?>'; const remark = '<?php echo $remark; ?>'; const productId = '<?php echo $productId; ?>'; const rolename = '<?php echo $rolename; ?>'; const serverid = '<?php echo $serverid; ?>'; const accountid = '<?php echo $accountid; ?>'; // 拼接 const payUrl = `ldpay.php?type=${type}&out_trade_no=${outTradeNo}&money=${money}&remark=${encodeURIComponent(remark)}&productId=${productId}&rolename=${encodeURIComponent(rolename)}&serverid=${serverid}&accountid=${accountid}`; // 用window.open打开支付页 window.open(payUrl, '_blank', 'width=800,height=600,top=100,left=100'); } </script> ``` ``` if ($sign == $mysign && $trade_status == 'TRADE_SUCCESS') { echo "<script> alert('支付成功!即将返回游戏。'); window.close(); // 关闭当前支付标签页 </script>"; } else { echo "<script>alert('支付失败,请重试!');history.back();</script>"; } ```
hechu
2025年10月29日 05:17
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码