【杂谈】PHP完成个人付出宝付出开辟(六)
2019-11-18杂谈搜奇网38°c
A+ A-
在前面的文章《PHP完成个人付出宝付出开辟(五)》中,我们为人人简朴引见了付出宝付出开辟小案例中的部份源码。
下面我们继承连系API接口文件源码来解说相干内容。
codepay.php(接口文件):
<?php /** * 功用:吸收网站参数 并建立定单 * 版本:4.4 * 修正日期:2018-3-27 * 申明: * 以下代码只是为了轻易商户测试而供应的样例代码,商户能够依据本身网站的须要,根据手艺文档编写,并不是一定要运用该代码。 * 该代码仅供进修和研讨接口运用,只是供应一个参考。 * * *************************注重***************** * 假如您是软件版您必需制造并先上传收款码或许是金额的二维码。 不然提醒无二维码 * 1、付出宝二维码制造教程:http://codepay.fateqq.com:52888/help/rknXG3lFx.html * 2、微信二维码制造教程:http://codepay.fateqq.com:52888/help/ByLyU3bFl.html * 其他操纵教程:http://codepay.fateqq.com:52888/help/web/ * *假如您在接口集成过程当中碰到问题,能够根据下面的门路来处置惩罚 *1、开辟文档中心:http://codepay.fateqq.com:52888/apiword/ *2、商户协助中心:http://codepay.fateqq.com:52888/help/ *3、联络客服:http://codepay.fateqq.com:52888/msg.html *假如想运用扩大功用,请按文档要求,自行增加到parameter数组即可。 ********************************************** */ //ob_clean(); //清空缓冲区 防备UTF-8 BOM头报错 //session_start(); //开启session require_once("codepay_config.php"); //导入配置文件 /** * 吸收表单的数据 无需修改 * 须要注重:pay_id 云端限定字符长度为100;太长会返回too long毛病 */ if (empty($_POST)) $_POST = $_GET; //假如为GET体式格局接见 $user = $_POST['user'];//提交的用户 也能够去session或许cookie中取登录用户 $_SESSION['uid'] $pay_id = $user; //网站唯一标识 须要充值的用户名,用户ID或许自行建立定单 发起通报用户的ID $price = (float)$_POST["price"]; //提交的价钱 $param = ''; //自定义参数 能够留空 通报什么返回什么 用于辨别游戏分区或用户身份 $type = (int)$_POST["type"]; //付出体式格局 if ($type < 1) $type = 1; //默许付出体式格局 付出宝 if ($price <= 0) $price = (float)$_POST["money"]; //假如没供应自定义输入金额则运用money参数 $codepay_path = $codepay_config['path']; //设置codepay静态资本运用途径 /** * * 增添付款纪录到数据库的要领演示代码 * require_once("includes/MysqliDb.class.php");//导入mysqli衔接 * require_once("includes/M.class.php");//导入mysqli操纵类 * $m=new M(); //建立衔接数据库类 * * //以下4个参数是为了演示向数据库插进去纪录 * $pay_no=time(); * $pay_time=time(); * $creat_time=time(); * $status=0; * * $sql="INSERT INTO `codepay_order` (`pay_id`, `money`, `price`, `type`, `pay_no`, `param`, `pay_time`, `pay_tag`, `status`, `creat_time`)values(?,?,?,?,?,?,?,?,?,?)"; * $rs = $m->execSQL( $sql, array('sddissisii', $pay_id, $price, $price, $type, $pay_no, $param, $pay_time, $pay_tag, $status, $creat_time), true); //$rs返回是不是实行胜利 true示意返回是不是胜利 * * * 查询1条信息演示代码 * $order_id=$_GET['order_id']; * $sql="select * from `codepay_order` where pay_no=?"; * $rs = $m->getOne( $sql, array('s', $order_id), false); //$rs返回查询到的效果 没有效果则返回false * * */ if ($price < $codepay_config['min']) exit('最低限定' . $codepay_config['min'] . '元'); //搜检最低限定 $price = number_format($price, 2, '.', '');// 四舍五入只保存2位小数。 if (empty($codepay_config) || (int)$codepay_config['id'] <= 1) { exit('请修正配置文件codepay_config.php 或进入<a href="install.php">install.php</a> 装置码付出接口测试数据'); } /** * 一些防进击的要领 须要先session_start(); * 3秒内制止革新页面 * 考证表单是不是正当 */ //$_SESSION["codepay_count"] += 1; //if ($_SESSION["codepay_count"] > 20 || ($_SESSION["codepay_endTime"] + 3) > time()) { // $_SESSION["codepay_count"] = 0; // exit("您的操纵太频仍请 <a href='javascript:history.go(-1);'>返回重试</a><script>setTimeout(function() { // history.back(-1) //},3000);</script>"); //} //$_SESSION["endTime"] = time(); // //$salt = $_POST["salt"]; //考证表单正当性的参数 // //if ($salt <> md5($_SESSION["uuid"])) exit('表单考证失利 请从新提交'); //防备跨站进击 if (empty($pay_id)&&empty($_POST['pay_id'])) exit('须要充值的用户唯一标识不能为空'); //唯一用户标识 不能为空 假如是登录状况能够直接取session中的ID或用户名 if ($codepay_config['pay_type'] == 1 && $type == 1) $codepay_config["qrcode_url"] = ''; //付出宝默许不走当地化二维码 //猎取客户端IP地点 function getIp() { //取IP函数 static $realip; if (isset($_SERVER)) { if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $realip = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { $realip = isset($_SERVER['HTTP_CLIENT_IP']) ? $_SERVER['HTTP_CLIENT_IP'] : $_SERVER['REMOTE_ADDR']; } } else { if (getenv('HTTP_X_FORWARDED_FOR')) { $realip = getenv('HTTP_X_FORWARDED_FOR'); } else { $realip = getenv('HTTP_CLIENT_IP') ? getenv('HTTP_CLIENT_IP') : getenv('REMOTE_ADDR'); } } return $realip; } /** * 这里能够自行建立站内定单将用户提交的数据保存到数据库生成定单号 * * 嫌贫苦pay_id直接传送用户ID或用户名(中文用户名请确认编码一致) * 我们支撑GBK,gb2312,utf-8 如发送中文碰到编码搅扰没法处置惩罚 能够只管运用UTF-8 * 全能处置惩罚要领:base64或许urlencode加密后发送我们. 处置惩罚营业的时刻转返来 */ //组织要要求的参数数组,无需修改 if($_POST['sign']){ //来自代办网关 考证署名 ksort($_POST); //排序post参数 reset($_POST); //内部指针指向数组中的第一个元素 $sign = ''; //加密字符串初始化 foreach ($_POST AS $key => $val) { if ($val == '' || $key == 'sign') continue; //跳过这些不署名 if ($sign) $sign .= '&'; //第一个字符串署名不加& 其他加&衔接起来参数 $sign .= "$key=$val"; //拼接为url参数情势 } if (md5($sign . $codepay_config['key']) != $_POST['sign']) { //不正当的数据 exit('署名考证失利'); }else{ $parameter = $_POST; //考证署名胜利后运用传入的参数 作为代办 } }else{ $parameter = array( "id" => (int)$codepay_config['id'],//平台ID号 "type" => $type,//付出体式格局 "price" => (float)$price,//原价 "pay_id" => $pay_id, //能够是用户ID,站内商户定单号,用户名 "param" => $param,//自定义参数 "act" => (int)$codepay_config['act'],//此参数行将弃用 "outTime" => (int)$codepay_config['outTime'],//二维码超时设置 "page" => (int)$codepay_config['page'],//定单建立返回JS 或许JSON "return_url" => $codepay_config["return_url"],//付款后附带加密参数跳转到该页面 "notify_url" => $codepay_config["notify_url"],//付款后关照该页面处置惩罚营业 "style" => (int)$codepay_config['style'],//付款页面作风 "pay_type" => $codepay_config['pay_type'],//付出宝运用官方接口 "user_ip" => getIp(),//付款人IP "qrcode_url" => $codepay_config['qrcode_url'],//当地化二维码 "chart" => trim(strtolower($codepay_config['chart']))//字符编码体式格局 //其他营业参数依据在线开辟文档,增加参数.文档地点:https://codepay.fateqq.com/apiword/ //如"参数名"=>"参数值" ); } //简朴的建立定单体式格局 //ksort($parameter); //从新排序$data数组 //reset($parameter); //内部指针指向数组中的第一个元素 // //$sign = ''; //初始化须要署名的字符为空 //$urls = ''; //初始化URL参数为空 // //foreach ($parameter AS $key => $val) { //遍历须要通报的参数 // if ($val == ''||$key == 'sign') continue; //跳过这些不参数署名 // if ($sign != '') { //背面追加&拼接URL // $sign .= "&"; // $urls .= "&"; // } // $sign .= "$key=$val"; //拼接为url参数情势 // $urls .= "$key=" . urlencode($val); //拼接为url参数情势并URL编码参数值 // //} //$query = $urls . '&sign=' . md5($sign .$codepay_config['key']); //建立定单所需的参数 //$url = "http://api2.fateqq.com:52888/creat_order/?{$query}"; //付出页面 // //header("Location:{$url}"); //跳转到付出页面 /** * 加密函数 * @param $params 须要加密的数组 * @param $codepay_key //码付出密钥 * @param string $host //运用哪一个域名 * @return array */ function create_link($params, $codepay_key, $host = "") { ksort($params); //从新排序$data数组 reset($params); //内部指针指向数组中的第一个元素 $sign = ''; $urls = ''; foreach ($params AS $key => $val) { if ($val == '') continue; if ($key != 'sign') { if ($sign != '') { $sign .= "&"; $urls .= "&"; } $sign .= "$key=$val"; //拼接为url参数情势 $urls .= "$key=" . urlencode($val); //拼接为url参数情势 } } $key = md5($sign . $codepay_key);//最先加密 $query = $urls . '&sign=' . $key; //建立定单所需的参数 $apiHost = ($host ? $host : "http://api2.fateqq.com:52888/creat_order/?"); //网关 $url = $apiHost . $query; //生成的地点 return array("url" => $url, "query" => $query, "sign" => $sign, "param" => $urls); } $back = create_link($parameter, $codepay_config['key']); switch ((int)$type) { case 1: $typeName = '付出宝'; break; case 2: $typeName = 'QQ'; break; default: $typeName = '微信'; } //预备传给前端输出的JSON $user_data = array( "return_url" => $parameter["return_url"], "type" => $parameter['type'], "outTime" => $parameter["outTime"], "codePay_id" => $parameter["id"], "out_trade_no" => $parameter["param"], "price" => $parameter['price'], 'money'=>$parameter['price'], 'order_id'=>$parameter["param"], "subject"=>'',//商品名字 ); //传给网页JS去实行 $user_data["qrcode_url"] = $codepay_config["qrcode_url"]; //当地二维码控制器 //中心那logo 默许为2秒后隐蔽 //改成本身的替代img目录下的use_开首的图片 你要保证你的二维码遮挡不会影响扫码 //二维码容错率决议你能遮挡若干部份 $user_data["logoShowTime"] = $user_data["qrcode_url"]?1:2*1000; /** * 高等形式 云端建立定单。(注重不要外泄密钥key) * 可自行依据定单返回的参数做一些高等功用。 以下demo只是简朴的功用 其他须要自行开辟 * 比方依据money type 参数挪用当地的二维码图片。 * 比方依据云端定单状况建立失利 展现自定义转账的二维码。 * 比方可自行开辟付款后的同步关照完成。 * 比方可自行开辟软件端某个付出体式格局掉线。 自动停用该付款体式格局。 * 如运用云端同步关照 请附带必要的参数 码付出的用户id,pay_id,type,money,order_id,tag,notiry_key * 必需将notiry_key参数返回 由于该参数为效劳解密参数(会随时变化)。不然影响云端同步关照 */ if ($parameter['page'] != 3) { //只需不为3 返回JS 就去效劳器加载资本 $parameter['page'] = "4"; //设置返回JSON $back = create_link($parameter, $codepay_config['key'], $codepay_config['gateway']); //生成付出URL if (function_exists('file_get_contents')) { //假如开启了猎取长途HTML函数 file_get_contents $codepay_json = file_get_contents($back['url']); //猎取长途HTML } else if (function_exists('curl_init')) { $ch = curl_init(); //运用curl要求 $timeout = 5; curl_setopt($ch, CURLOPT_URL, $back['url']); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); $codepay_json = curl_exec($ch); curl_close($ch); } } if (empty($codepay_json)) { //假如没有猎取到长途HTML 则走JS建立定单 $parameter['call'] = "callback"; $parameter['page'] = "3"; $back = create_link($parameter, $codepay_config['key'], 'https://codepay.fateqq.com/creat_order/?'); $codepay_html = '<script src="' . $back['url'] . '"></script>'; //JS数据 } else { //猎取到了JSON $codepay_data = json_decode($codepay_json); $qr = $codepay_data ? $codepay_data->qrcode : ''; $codepay_html = "<script>callback({$codepay_json})</script>"; //JSON数据 } ?> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=<?php echo $codepay_config['chart'] ?>"> <meta http-equiv="Content-Language" content="zh-cn"> <meta name="apple-mobile-web-app-capable" content="no"/> <meta name="apple-touch-fullscreen" content="yes"/> <meta name="format-detection" content="telephone=no,email=no"/> <meta name="apple-mobile-web-app-status-bar-style" content="white"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <title><?php echo $typeName ?>扫码付出</title> <link href="<?php echo $codepay_path ?>/css/wechat_pay.css" rel="stylesheet" media="screen"> <link href="<?php echo $codepay_path?>/css/toastr.min.css" rel="stylesheet"> <link href="<?php echo $codepay_path?>/css/font-awesome.min.css" rel="stylesheet"> </head> <body> <div class="body"> <h1 class="mod-title"> <span class="ico_log ico-<?php echo $type ?>"></span> </h1> <div class="mod-ct"> <div class="order"> </div> <div class="amount" id="money">¥<?php echo $price ?></div> <div class="qrcode-img-wrapper" data-role="qrPayImgWrapper"> <div data-role="qrPayImg" class="qrcode-img-area"> <div class="ui-loading qrcode-loading" data-role="qrPayImgLoading" style="display: none;">加载中</div> <div style="position: relative;display: inline-block;"> <img id='show_qrcode' alt="加载中..." src="<?php echo $qr ?>" width="210" height="210" style="display: block;"> <img onclick="$('#use').hide()" id="use" src="<?php echo $codepay_path ?>/img/use_<?php echo $type ?>.png" style="position: absolute;top: 50%;left: 50%;width:32px;height:32px;margin-left: -21px;margin-top: -21px"> </div> </div> </div> <!-- 这里能够输入你想要的提醒!--> <div class="time-item" id="msg"> <h1>二维码逾期时候</h1> <strong id="hour_show">0时</strong> <strong id="minute_show">0分</strong> <strong id="second_show">0秒</strong> </div> <div class="tip"> <div class="ico-scan"></div> <div class="tip-text"> <p>请运用<?php echo $typeName ?>扫一扫</p> <p>扫描二维码完成付出</p> <p><div id="kf" ></div></p> </div> </div> <div class="detail" id="orderDetail"> <dl class="detail-ct" id="desc" style="display: none;"> <dt>状况</dt> <dd id="createTime">定单建立</dd> </dl> <a href="javascript:void(0)" class="arrow"><i class="ico-arrow"></i></a> </div> <div class="tip-text"> </div> </div> <div class="foot"> <div class="inner"> <p>手机用户可保存上方二维码到手机中</p> <p>在<?php echo $typeName ?>扫一扫中挑选“相册”即可</p> </div> </div> </div> <div class="copyRight"> </div> <!--注重下面加载递次 递次紊乱会影响营业--> <script src="<?php echo $codepay_path ?>/js/jquery-1.10.2.min.js"></script> <!--[if lt IE 8]> <script src="<?php echo $codepay_path ?>/js/json3.min.js"></script><![endif]--> <script> var user_data =<?php echo json_encode($user_data);?> </script> <script src="<?php echo $codepay_path ?>/js/notify.js"></script> <script src="<?php echo $codepay_path ?>/js/codepay_util.js"></script> <?php echo $codepay_html; ?> <script src="<?php echo $codepay_path?>/js/toastr.min.js"></script> <script src="<?php echo $codepay_path?>/js/clipboard.min.js"></script> <script> setTimeout(function () { $('#use').hide() //2秒后隐蔽中心那LOGO }, user_data.logoShowTime || 2000); var clipboard = new Clipboard('.copy'); clipboard.on('success', function (e) { toastr.success("复制胜利,可扫码付款时刻粘贴到金额栏付款"); }); clipboard.on('error', function(e) { document.querySelector('.copy'); toastr.warning("复制失利,请记住下必需付款的金额 不能多不能少不然不能胜利"); }); </script> </body> </html>
我们在前台提交信息后挑选付出宝付出,这里的定单信息就会提交到我们的接口中,post猎取的信息以下:
type为1则示意挑选付出宝付出,price为金额,user为用户名。
信息肯定并提交,在前台返回的数据以下图所示。
然后我们就能够举行付款操纵,付款后,显现以下。
末了我们能够检察定单数据表中是不是有定单。
那末本篇文章就是关于PHP完成个人付出宝付出开辟的引见,其实在项目开辟中,付出宝接口挪用是异常简朴的,愿望关于个人付出宝付出开辟的一系列文章,能够对须要的朋侪有所协助!
相干文章:
《PHP完成个人付出宝付出开辟(一)》
《PHP完成个人付出宝付出开辟(二)》
《PHP完成个人付出宝付出开辟(三)》
《PHP完成个人付出宝付出开辟(四)》
《PHP完成个人付出宝付出开辟(五)》
以上就是PHP完成个人付出宝付出开辟(六)的细致内容,更多请关注ki4网别的相干文章!