基于BufPay的php支付平台,用于discuz积分充值。(不用跳转到bufpay)

由于我是高中生,没法申请支付接口。于是在度娘上找到了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;">&nbsp; uid:&nbsp; &nbsp;</div>

<div class="box" style="text-align: center;">&nbsp;<input id="uid" name="uid" type="number" /></div>

<div class="box" style="text-align: center;">&nbsp; 支付方式(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;">&nbsp;<input id="price" min="0" palceholder="0.01" type="number" value="输入金额" /><button onclick="pay()">&nbsp;支付</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']}' />"
  ?>
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秦以南

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值