由于我是高中生,没法申请支付接口。于是在度娘上找到了Bufpay。这个平台提供的接口可以大大方便个人开发者首付款,节约成本。我根据官方demo以及开发文档编写了用于discuz!的积分充值系统,用于我的论坛
官方demo文档存在错误!在我这已更正
我的论坛地址
1⃣️在bufpay官网申请接入
2⃣️编写前台文件
这里使用html
<!DOCTYPE html>
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" /><meta name="author" content="bufpay.com">
<title></title>
</head>
<body>
<div class="box" style="text-align: center;">欢迎来到I Love Share 支付界面!</div>
<div class="box" style="text-align: center;">请完成一下信息:</div>
<div class="box" style="text-align: center;"> uid: </div>
<div class="box" style="text-align: center;"> <input id="uid" name="uid" type="number" /></div>
<div class="box" style="text-align: center;"> 支付方式(alipay/wechat)</div>
<div class="box" style="text-align: center;"><input id="pay_type" type="text" /></div>
<div class="box" style="text-align: center;">金额:</div>
<div class="box" style="text-align: center;"> <input id="price" min="0" palceholder="0.01" type="number" value="输入金额" /><button onclick="pay()"> 支付</button></div>
<script>
var pay = function () {
var price = document.getElementById("price").value;
var uid = document.getElementById("uid").value;
var pay_type = document.getElementById("pay_type").value;
if(parseFloat(price)<=0) return false;
location.href = "/xxxx.php?price=" + price + "&uid=" + uid + "&pay_type=" + pay_type;
};
</script></body>
</html>
这里把支付信息提交到下一步的PHP文件。
3⃣️编写支付请求php
这里使用平台提供的支付接口,使用post与md5加密
#!/usr/bin/env php
<?php
#注意: 使用之前先到 bufpay 后台上传微信、支付宝App生成的收款二维码
$price = $_GET['price']; # 获取充值金额
$order_id = rand(); # 自己创建的本地订单号
$order_uid = $_GET['uid']; # 订单对应的用户id
$name = '#####'; # 订单商品名称
$pay_type = $_GET['pay_type']; # 付款方式
$notify_url = 'https://###/notify.php'; # 回调通知地址
$return_url = 'https://###/return.html'; # 支付成功页面跳转地址
$secret = '##############################'; # app secret, 在个人中心配置页面查看
$api_url = 'https://bufpay.com/api/pay/###'; # 付款请求接口,在个人中心配置页面查看
function sign($data_arr) {
return md5(join('',$data_arr));
};
$sign = sign(array($name, $pay_type, $price, $order_id, $order_uid, $notify_url, $return_url, $secret));
echo '<html>
<head><title>redirect...</title></head>
<body>
<form id="post_data" action="'.$api_url.'" method="post">
<input type="hidden" name="name" value="'.$name.'"/>
<input type="hidden" name="pay_type" value="'.$pay_type.'"/>
<input type="hidden" name="price" value="'.$price.'"/>
<input type="hidden" name="order_id" value="'.$order_id.'"/>
<input type="hidden" name="order_uid" value="'.$order_uid.'"/>
<input type="hidden" name="notify_url" value="'.$notify_url.'"/>
<input type="hidden" name="return_url" value="'.$return_url.'"/>
<input type="hidden" name="sign" value="'.$sign.'"/>
</form>
<script>document.getElementById("post_data").submit();</script>
</body>
</html>';
?>
用http post的方式模拟表格将支付请求提交到服务器。
4⃣️编写回调文件notify.php
我编写的参考如下
#!/usr/bin/env php
<?php
/*
-aoid, bufpay平台订单唯一标识
- order_id, 你传入的 order_id 参数
- order_uid, 你传入的 order_uid 参数
- price, 订单价格
- pay_price, 用户支付的金额
- sign, 签名, 参数 aoid + order_id + order_uid + price + pay_price + app secret 顺序拼接后 MD5
*/
//获取平台返回支付数据
$aoid = $_REQUEST["aoid"];
$order_id = $_REQUEST["order_id'"];
$order_uid = $_REQUEST["order_uid"];
$price = $_REQUEST["price"];
$pay_price = $_REQUEST["pay_price"];
//$sign = $_REQUEST["sign"]; //按需添加md5校验
/*测试数据
$aoid=121212;
$order_id=121212;
$order_uid=1;
$price=1;
$pay_price=1;
*/
/*z准备数据库*/
$servername = "localhost";
$username = "xxx";
$password = "xxx";
$dbname = "xxx";
$conn = new mysqli($servername, $username, $password, $dbname); //连接数据库
$sql = "SELECT `xxx` FROM `pre_common_member_count` where `uid` = '$order_uid'";
//读取原来积分
$res = mysqli_query($conn,$sql);
$oldd = mysqli_fetch_row($res); //print $oldd[0] ;
$old = number_format($oldd[0]); //转换为数字
$new = number_format($pay_price) * 10;
$now = $old + $new ; //计算现在的积分数值
//print $new ; print $now;
$sql = "UPDATE `pre_common_member_count` SET `extcredits2` = $now WHERE `pre_common_member_count`.`uid` = '$order_uid' "; //写入新的积分值
/*判断是否支付成功*/
if ($price == $pay_price)
{
$re=mysqli_query($conn,$sql);
if ($re){print 'ok';}
// return "200";
}
?>
在这个文件中我直接对数据库进行了操作,比较简单。有必要的可以只在这里进行md5校验,另用文件处理操作。
5⃣️编写return文件
这个文件是用户支付成功后跳转到的页面。根据需要编写neirong。
6⃣️校验支付结果
利用下面文件实现
<?php
# 签名函数
function sign($data_arr) {
return md5(join('',$data_arr));
};
$sign = sign(array($_POST['aoid'], $_POST['order_id'], $_POST['order_uid'], $_POST['price'], $_POST['pay_price'], 'your app secret'));
# 对比签名
if($sign == $_POST['sign']) {
# do something update database
echo 'ok';
} else {
header("HTTP/1.0 405 Method Not Allowed");
exit();
};
?>
总结
通过以上代码可以实现简单的支付与回调。未来可以添加更多细节。
2020年11月15日更新
通过以下修改过后的代码可实现在网页中显示二维码,不用跳转
#!/usr/bin/env php
<?php
#注意: 使用之前先到 bufpay 后台上传微信、支付宝App生成的收款二维码
$price = $_GET['price']; # 获取充值金额
$order_id = rand(); # 自己创建的本地订单号
$order_uid = $_GET['uid']; # 订单对应的用户id
$name = 'vip year fee'; # 订单商品名称
$pay_type = $_GET['pay_type']; # 付款方式
$notify_url = 'https://lt.300c.top:8000/pay/notify.php'; # 回调通知地址
$return_url = 'https://lt.300c.top:8000/pay/return.html'; # 支付成功页面跳转地址
$secret = '867e413de8884797b703394b5e8c0a94'; # app secret, 在个人中心配置页面查看
$api_url = 'https://bufpay.com/api/pay/103310'; # 付款请求接口,在个人中心配置页面查看
function sign($data_arr) {
return md5(join('',$data_arr));
};
$sign = sign(array($name, $pay_type, $price, $order_id, $order_uid, $notify_url, $return_url, $secret));
//POST请求
//要提交的内容.
$post_data['name'] = $name;
$post_data['pay_type'] = $pay_type;
$post_data['price'] = $price;
$post_data['order_id'] = $order_id;
$post_data['order_uid'] = $order_uid;
$post_data['notify_url'] = $notify_url;
$post_data['return_url'] = $return_url;
$post_data['secret'] = $secret;
$post_data['sign'] = $sign;
$post_data['format'] = 'json';
function curl_post($url,$array){
$curl = curl_init();
//设置提交的url
curl_setopt($curl, CURLOPT_URL, $url);
//设置头文件的信息作为数据流输出
curl_setopt($curl, CURLOPT_HEADER, 0);
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
//设置post方式提交
curl_setopt($curl, CURLOPT_POST, 1);
//设置post数据
$post_data = $array;
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
//执行命令
$data = curl_exec($curl);
//关闭URL请求
curl_close($curl);
//获得数据并返回
return $data;
}
$json = curl_post($api_url,$post_data);
//echo $json;
$return = json_decode($json, true);
echo "<img src='{$return['qr_img']}' />"
?>