You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

515 lines
24 KiB
PHTML

5 years ago
<?php
namespace Home\Controller;
use Org\WeixinSDK\Weixin;
use function PHPSTORM_META\type;
use QRcode;
/**
* 平台币管理-平台币充值(代币下发到对应推广员账户下)
*/
class CoinOrderController extends BaseController
{
const LV = 2;//平台币充值手续费
5 years ago
public function page_show($model,$map,$p=1)
{
if (isset($_REQUEST['row'])) {
$row = $_REQUEST['row'];
} else {
$row = 10;
}
$this->meta_title = "平台币充值";
$page = $p ? $p : 1; //默认显示第一页数据
$data = M($model, 'tab_')
->where($map)
->order('id DESC')
->page($page, $row)
->select();
$count = M($model, "tab_")->where($map)->count();
$parameter = $map;
$parameter['p'] = I('get.p', 1);
$parameter['row'] = I('get.row');
$page = set_pagination($count, $row, $parameter);
if ($page) {
$this->assign('_page', $page);
}
$this->assign("data_list", $data);
$this->display();
}
//订单列表
public function order_list($p=0){
if(IS_DELETE){
$order_id = I("trade_no");
if(empty($order_id)){
$this->ajaxReturn(['status'=>0,'info'=>'订单号错误'.var_export($order_id,1),'time'=>1000],"JSON");
}
$order_info = M("coin_pay_order","tab_")->where("order_number='$order_id'")->find();
if(!$order_info){
$this->ajaxReturn(['status'=>0,'info'=>'订单不存在','time'=>1000],"JSON");
}
if($order_info['pay_type']==1 && $order_info['order_status']!=0){
$this->ajaxReturn(['status'=>0,'info'=>'线上充值订单为非待付款状态,无法删除!'.var_export($order_info,1),'time'=>1000],"JSON");
}
if($order_info['pay_type']==1 && $order_info['order_status']!=0){
$this->ajaxReturn(['status'=>0,'info'=>'线下充值订单为非待审核状态,无法删除!','time'=>1000],"JSON");
}
M("coin_pay_order","tab_")->where("id=".$order_info['id'])->save(array('is_del'=>1));
$this->ajaxReturn(['status'=>1,'info'=>'删除成功!','time'=>1000],"JSON");
}else{
$map = array();
$map['is_del']=0;
$map['promote_id'] = get_pid();
$start_time = strtotime(I('time_start'));
$end_time = strtotime(I('time_end'));
$order_number = I("order_number");
$order_status = I("order_status");
$pay_type = I("pay_type");
if (!empty($start_time) && !empty($end_time)) {
$map['create_time'] = ['BETWEEN', [$start_time, $end_time + 24 * 60 * 60 - 1]];
} else if (!empty($start_time)) {
$map['create_time'] = array('gt', $start_time);
} else if (!empty($end_time)) {
$map['create_time'] = array('lt', $end_time + 24 * 60 * 60 - 1);
}
if(!empty($order_number)){
$map['order_number'] = $order_number;
}
if(!empty($order_status) || $order_status=='0'){
$map['order_status'] = $order_status;
}
if(!empty($pay_type)){
$map['pay_type'] = $pay_type;
}
$this->assign("order_status_desc",array('0'=>'待付款','1'=>'付款成功','2'=>'待审核','3'=>'代发币','4'=>'已发币','-1'=>'审核不通过'));
$this->page_show('coin_pay_order',$map,$p);
}
}
//创建订单
public function order_add(){
$status = $this->promoteCan('recharge');
5 years ago
if (!$status) {
if (IS_POST) {
$this->ajaxReturn(array('status' => 0, 'msg'=>'无权限操作'));
} else {
$this->error('无权限操作');
}
}
$this->assign("LV",self::LV);
3 years ago
$config = $this->getOfflineConfig();
5 years ago
if(IS_POST){
SafeFilter($_POST);
$coin_num = I("coin_num");
$pay_type = I("pay_type");
if(!is_numeric($coin_num) || $coin_num <0){
$this->ajaxReturn(['status'=>0,'info'=>'请填写正确的数量','time'=>1000],"JSON");
}
$order_no = "AG_" . date('Ymd') . date('His') . sp_random_string(4);
$data['coin_num']=$coin_num;
$data['real_amount'] = $coin_num;
$data['pay_type'] = $pay_type;
$data['order_number'] = $order_no;
$data['promote_id'] = get_pid();
4 years ago
$data['promote_account'] = session('promote_auth.account');
5 years ago
$data['create_time'] = time();
$data['discount'] = "0";
if($pay_type==1){ // 在线转账
$free = sprintf("%.2f",$coin_num*(self::LV/100));
5 years ago
$free = $free<'0.1' ? '0.1':$free;
$data['pay_amount'] = bcadd($coin_num,$free,2);
$data['order_status'] = 0;
}else{
3 years ago
if($config['is_open'] != 1) {
$this->ajaxReturn(['status'=>0,'info'=>'配置错误','time'=>1000],"JSON");
}
$data['pay_amount'] = sprintf("%.2f",$coin_num*($config['coin_discount']*10)/100);
$collection_account = I("collection_account","");
5 years ago
$pay_order_number = I("pay_order_number");
3 years ago
$game_id = I("game_id", 0);
if($game_id < 1){
$this->ajaxReturn(['status'=>0,'info'=>'请选择游戏','time'=>1000],"JSON");
}
5 years ago
if($pay_order_number==''){
$this->ajaxReturn(['status'=>0,'info'=>'请输入支付凭证','time'=>1000],"JSON");
}
3 years ago
$is_order = M("coin_pay_order","tab_")
->where(
array('pay_order_number'=>$pay_order_number,
'is_del'=>0
))->find();
if($is_order){
$this->ajaxReturn(['status'=>0,'info'=>'系统已存在支付凭证,请核实~','time'=>1000],"JSON");
}
//$res = $this->upload();
$res = $this->uploadPicture();
if($res['status']==0){
$this->ajaxReturn(['status'=>0,'info'=>'请选择支付截图','time'=>1000],"JSON");
}
5 years ago
if($res['error']==1){
$this->ajaxReturn(['status'=>0,'info'=>$res['msg'],'time'=>1000],"JSON");
}
$data['collection_account'] = $collection_account;
$data['pay_order_number'] = $pay_order_number;
$data['remark'] = I("remark");
$data['voucher_img'] = $res['id'];
5 years ago
$data['order_status'] = 2;
3 years ago
$data['pay_way'] = 4;
$data['game_id'] = $game_id;
$data['discount'] = $config['coin_discount'] * 10;
5 years ago
}
M("coin_pay_order", 'tab_')->add($data);
5 years ago
recordPromoteLogs('平台币管理','提交充值订单');
5 years ago
$this->ajaxReturn(['status'=>1,'info'=>'充值提交成功','pay_type'=>$pay_type,'trade_no'=>$order_no,'time'=>1000],"JSON");
}else{
4 years ago
$account = session('promote_auth.account');
5 years ago
$bank_list = M("bank","tab_")->select();
$this->meta_title = "平台币充值";
$this->assign("account",$account);
$this->assign("bank_list",$bank_list);
$this->assign("discount","0");
3 years ago
$this->assign("config", $config);
5 years ago
$this->display();
}
}
3 years ago
private function getOfflineConfig()
{
$config = M("Kv")->where("`key` like 'offline_platform_coin_%'")->getField('key,value',true);
$pid = session('promote_auth.pid');
$sendArr = [
'is_open'=>0
];
if(isset($config['offline_platform_coin_promote_ids'])){
$promote_ids = explode(',', $config['offline_platform_coin_promote_ids']);
if(in_array($pid, $promote_ids)) {
$sendArr['is_open'] = 1;
}
}
if($sendArr['is_open'] == 1) {
$sendArr['game'] = M('Game', 'tab_')->where("id in ({$config['offline_platform_coin_game_ids']})")->getField('id,game_name');
$sendArr['coin_discount'] = ($config['offline_platform_coin_discount']?:100) / 10;
$sendArr['collection_img_path'] = $config['offline_platform_coin_collection_img_path'];
}
return $sendArr;
}
5 years ago
//订单明细
public function order_detail(){
$trade_no= I("trade_no");
$order_info = M("coin_pay_order","tab_")->where("order_number='$trade_no'")->find();
$this->meta_title = "平台币充值信息";
$this->assign("order_info",$order_info);
$this->assign("order_status_desc",array('0'=>'待付款','1'=>'付款成功','2'=>'待审核','3'=>'代发币','4'=>'已发币','-1'=>'审核不通过'));
$this->display();
}
//支付中心
public function pay_center(){
$trade_no = I("trade_no");
$order = M("coin_pay_order","tab_")->where("order_number='$trade_no'")->find();
if ($order['order_status'] == 1) {
return $this->error("该订单已经付款成功,请重新发起一笔订单!", U("CoinOrder/order_add"));
}
5 years ago
$this->assign("data",$order);
/*if($order && $order['pay_amount']>='5000'){
$this->do_sq_pay($trade_no,$order);
}else{
$this->display();
}*/
$this->display();
}
//支付业务(微信/支付宝)
public function do_pay(){
$pay_way = I("pay_way");
$order_id = I("trade_no");
if($order_id){
$order_info = M("coin_pay_order", "tab_")->where("order_number='$order_id'")->find();
if ($order_info['order_status'] == 1) {
return $this->error("该订单已经付款成功,请重新发起一笔订单!", U("CoinOrder/order_add"));
}
5 years ago
$pay_amount = $order_info['pay_amount'];
if(get_pid()==138 || get_pid()==165){
$pay_amount = 0.01;
}
//$pay_amount = 0.01;
if($pay_way=='alipay') {
M("coin_pay_order", "tab_")->where("order_number='$order_id'")->save(array("pay_time" => time()));
Vendor('Alipay.aop.AopClient');
Vendor('Alipay.aop.request.AlipayTradePagePayRequest');
//请求
$c = new \AopClient();
$c->gatewayUrl = "https://openapi.alipay.com/gateway.do";
$c->appId = '2019091067222198';
$c->rsaPrivateKey = file_get_contents("./Application/Home/SecretKey/alipay/rsa2_private_key.txt");
$c->alipayrsaPublicKey = file_get_contents("./Application/Home/SecretKey/alipay/alipay2_public_key.txt");
$c->format = "json";
$c->charset = "UTF-8";
$c->signType = "RSA2";
$request = new \AlipayTradePagePayRequest();
$request->setNotifyUrl("https://" . $_SERVER['HTTP_HOST'] . "/callback.php/Notify3/alipay_notify");
$request->setReturnUrl("https://" . $_SERVER['HTTP_HOST'] . "/index.php?s=/Home/CoinOrder/order_list.html");
//$request->setNotifyUrl("http://zm.free.idcfengye.com/callback.php/Notify3/alipay_notify");
//$request->setReturnUrl("http://zm.free.idcfengye.com/index.php?s=/Home/CoinOrder/order_list.html");
$request->setBizContent("{" .
" \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," .
" \"subject\":\"平台币线上充值\"," .
" \"out_trade_no\":\"$order_id\"," .
" \"total_amount\":\"$pay_amount\"," .
" \"body\":\"\"" .
" }");
$result = $c->pageExecute($request);
//输出
echo $result;
}elseif ($pay_way=='wechat'){
M("coin_pay_order", "tab_")->where("order_number='$order_id'")->save(array("pay_time" => time()));
$is_pay = json_decode($this->weixin_pay("余额充值", $order_id,$pay_amount), true);
if ($is_pay['status'] === 1) {
/*include ('phpqrcode.php');
$qr = new QRcode();
echo '<img src="' + $qr->png($is_pay['url'],false,0,6) + '">';*/
$dir = 'Uploads/Picture/'.date('Y-m-d',time());
if (!file_exists($dir)){
mkdir($dir);
}
Vendor('phpqrcode/phpqrcode');
$qr = new QRcode();
$qr_name = $dir.'/'.md5(uniqid(microtime(true),true)).'.png';
$qr->png($is_pay['url'],$qr_name,0,6);
echo $this->echo_pay_qrcode($order_info['order_number'],$order_info['real_amount'],$order_info['pay_amount'],$qr_name,2);
}else{
echo '充值失败,错误信息:'.$is_pay['return_msg'];
}
}else{
echo '充值失败,错误信息:充值渠道不存在';
}
}else{
echo '充值失败,错误信息:订单信息不存在';
}
}
//微信支付
public function weixin_pay($title, $order_no, $pay_amount, $trade_type = "NATIVE", $tt = 1)
{
//官方
header("Content-type:text/html;charset=utf-8");
Vendor("WxPayPubHelper.WxPayPubHelper");
//$unifiedOrder = new \UnifiedOrder_pub("wx0ba5be5c8bb9f1b7", "1555280551","wDst6e8d0nGUh4hcwBgv8caJmDE1Mxql");
$unifiedOrder = new \UnifiedOrder_pub(C("wei_xin.email"), C("wei_xin.partner"),C("wei_xin.key"));
5 years ago
// $des='平台币充值';
$unifiedOrder->setParameter("body", $title);//商品描述
//自定义订单号,此处仅作举例
$timeStamp = time();
$unifiedOrder->setParameter("out_trade_no", $order_no);//商户订单号
$unifiedOrder->setParameter("total_fee", $pay_amount * 100);//总金额
$unifiedOrder->setParameter("notify_url","https://" . $_SERVER['HTTP_HOST'] . "/callback.php/Notify3/wxpay_notify");
//$unifiedOrder->setParameter("notify_url","http://zm.free.idcfengye.com/callback.php/Notify3/wxpay_notify");
$unifiedOrder->setParameter("trade_type", $trade_type);//交易类型
$unifiedOrder->setParameter("product_id", $order_no);//商品ID
if($trade_type=="MWEB"){
$scene_info['h5_info']=['type'=>'Wap','wap_url'=>"http://" . $_SERVER['HTTP_HOST'],'wap_name'=>'充值'];
$unifiedOrder->setParameter("scene_info", json_encode($scene_info));//场景信息
}
//获取统一支付接口结果
$unifiedOrderResult = $unifiedOrder->getResult($tt);
//商户根据实际情况设置相应的处理流程
if ($unifiedOrderResult["return_code"] == "FAIL") {
//商户自行增加处理流程
// echo base64_encode(json_encode(array('status' => 0, 'return_msg' => $unifiedOrderResult['return_msg'])));
return json_encode(array('status' => 0, 'return_msg' => $unifiedOrderResult['return_msg']));
} elseif ($unifiedOrderResult["result_code"] == "FAIL") {
//商户自行增加处理流程
// echo "错误代码:".$unifiedOrderResult['err_code']."<br>";
// echo base64_encode(json_encode(array('status' => 0, 'return_msg' => $unifiedOrderResult['err_code_des'])));
return json_encode(array('status' => 0, 'return_msg' => $unifiedOrderResult['err_code_des']));
} elseif ($unifiedOrderResult["code_url"] != NULL) {
//从统一支付接口获取到code_url
$code_url = $unifiedOrderResult["code_url"];
//商户自行增加处理流程
if ($unifiedOrderResult['return_code'] !== "SUCCESS") {
\Think\Log::record($unifiedOrderResult['msg']);
$html = '<div class="d_body">
<div class="d_content">
<div class="text_center">' . $unifiedOrderResult["return_code"] . '</div>
</div>
</div>';
} else {
return json_encode(array("status" => 1, 'url' => $unifiedOrderResult['code_url']));
}
} else {
file_put_contents(dirname(__FILE__).'/$unifiedOrderResult.txt',json_encode($unifiedOrderResult));
if ($trade_type == "APP") {
$app_data['appid'] = $unifiedOrderResult['appid'];
$app_data['partnerid'] = $unifiedOrderResult['mch_id'];
$app_data['prepayid'] = $unifiedOrderResult['prepay_id'];
$app_data['noncestr'] = $unifiedOrder->createNoncestr();
$app_data['timestamp'] = time();
$app_data['package'] = "Sign=WXPay";
$sign = $unifiedOrder->getSign($app_data);
return json_encode(array("status" => 1, 'appid' => $unifiedOrderResult['appid'], 'mch_id' => $unifiedOrderResult['mch_id'], 'prepay_id' => $unifiedOrderResult['prepay_id'], 'time' => $app_data['timestamp'], 'noncestr' => $app_data['noncestr'], 'sign' => $sign));
} else if ($trade_type == "MWEB") {
return json_encode(array("status" => 1, 'mweb_url' => $unifiedOrderResult['mweb_url']));
}
}
}
//双乾支付业务
public function do_sq_pay($trade_no,$order){
$return_url = "https://" . $_SERVER['HTTP_HOST'] . "/index.php?s=/Home/CoinOrder/order_list.html";
$res = $this->sq_pay_request($trade_no,$order['pay_amount'],$merno="168885",$paymenttype="ZFBZF", $subject="平台币线上支付", $ip=0,$returnurl=$return_url);
$res = json_decode($res, true);
if ($res[0]['respMess']=='success' && (string)$res[0]['respCode']=="000000") {
$dir = 'Uploads/Picture/'.date('Y-m-d',time());
if (!file_exists($dir)){
mkdir($dir);
}
Vendor('phpqrcode/phpqrcode');
$qr = new QRcode();
$qr_name = $dir.'/'.md5(uniqid(microtime(true),true)).'.png';
$qr->png($res[0]['qrCode'],$qr_name,0,6);
echo $this->echo_pay_qrcode($order['order_number'],$order['real_amount'],$order['pay_amount'],$qr_name,1);
}else{
echo 'SQ_PAY:'.$res[0]['respMess'];
}
}
// 双乾 扫码支付请求
public function sq_pay_request($order_no,$amount=0.01,$merno="168885",$paymenttype="ZFBZF", $subject="测试产品1", $ip=0,$returnurl=""){
M("coin_pay_order", "tab_")->where("order_number='$order_no'")->save(array("pay_time" => time()));
//$returnurl = empty($returnurl)?"http://".$_SERVER['HTTP_HOST']:$returnurl;//成功跳转
$notifyurl = "https://".$_SERVER['HTTP_HOST']."/callback.php/Notify3/sq_alipay_scancode_notify";//通知
//$notifyurl = "http://zm.free.idcfengye.com/callback.php/Notify3/sq_alipay_scancode_notify";
//$ordertime =date("Ymdhms",time());
// 168885 12345678
$sign = md5("Amount={$amount}&BillNo={$order_no}&MerNo={$merno}&PayType=SMZF&".strtoupper(md5("12345678")));
$sign = strtoupper($sign);
$params=[
'MerNo' => $merno,
'isSubMerPay'=>'0',
'Amount'=>$amount,
'BillNo'=>$order_no,
'TranCode'=>"SMZF002",
'PayType'=> "SMZF",
'PaymentType'=> $paymenttype,//"UNION","ZFBZF",
'MerRemark' => 'MerRemark',
'subject' => $subject,
'NotifyURL' => $notifyurl,
'ReturnURL' => $returnurl,
'clientIp' => $ip,
// MD5("Amount=0.01&BillNo=1481093236896&MerNo=168885&PayType=SMZF &"+MD5("12345678").toUpperCase()).toUpperCase();
'MD5info' => $sign,
];
$ret = curl_post("https://scan.95epay.cn/ScanCodePayment.action", $params);
return $ret;
}
5 years ago
public function upload(){
header("content-type:text/html;charset=utf-8");
//设置时区
#date_default_timezone_set('PRC');
//获取文件名
$filename = $_FILES['file']['name'];
if(!$filename){
return array("error"=>1,"msg"=>"请选择支付截图");
}
5 years ago
//获取文件临时路径
$temp_name = $_FILES['file']['tmp_name'];
//获取大小
$size = $_FILES['file']['size'];
//获取文件上传码0代表文件上传成功
$error = $_FILES['file']['error'];
//判断文件大小是否超过设置的最大上传限制
/*if ($size > 2*1024*1024){
return array("error"=>1,"msg"=>"文件大小超过2M大小");
}*/
//phpinfo函数会以数组的形式返回关于文件路径的信息
//[dirname]:目录路径[basename]:文件名[extension]:文件后缀名[filename]:不包含后缀的文件名
$arr = pathinfo($filename);
//获取文件的后缀名
$ext_suffix = $arr['extension'];
//设置允许上传文件的后缀
$allow_suffix = array('jpg','gif','jpeg','png');
//判断上传的文件是否在允许的范围内(后缀)==>白名单判断
if(!in_array($ext_suffix, $allow_suffix)){
return array("error"=>1,"msg"=>"上传的文件类型只能是jpg,gif,jpeg,png");
}
//检测存放上传文件的路径是否存在,如果不存在则新建目录
$dir = 'Uploads/Picture/'.date('Y-m-d',time());
if (!file_exists($dir)){
mkdir($dir);
}
//为上传的文件新起一个名字,保证更加安全
$new_filename = date('YmdHis',time()).rand(100,1000).'.'.$ext_suffix;
//将文件从临时路径移动到磁盘
if (move_uploaded_file($temp_name, $dir."/".$new_filename)){
return array("error"=>0,"msg"=>"图片上传成功","path"=>$dir."/".$new_filename);
}else{
return array("error"=>1,"msg"=>"文件上传失败,错误码:$error");
}
}
/**
* 上传图片
* @author huajie <banhuajie@163.com>
*/
public function uploadPicture(){
/* 返回标准数据 */
$result = array('status' => 1, 'info' => '上传成功', 'data' => '');
/* 调用文件上传组件上传文件 */
$Picture = D('Picture');
$pic_driver = C('PICTURE_UPLOAD_DRIVER');
$info = $Picture->upload(
$_FILES,
C('PICTURE_UPLOAD'),
C('PICTURE_UPLOAD_DRIVER'),
C("UPLOAD_{$pic_driver}_CONFIG")
); //TODO:上传到远程服务器
/* 记录图片信息 */
if($info){
$result['status'] = 1;
$result = array_merge($info['voucher_img'], $result);
} else {
$result['status'] = 0;
$result['info'] = $Picture->getError();
}
ob_clean();
return $result;
}
5 years ago
public function echo_pay_qrcode($trade_no,$real_amont,$pay_amount,$qrcode_url,$type='1'){
if($type==1){
$tips = '请使用支付宝扫描二维码以完成支付';
}else{
$tips = '请使用微信扫描二维码以完成支付';
}
$html_style = ' <style>'.
'.payment-body{width: 400px;height: 500px;margin: auto;color: #333}'.
'.pay-info{margin-top: 100px;font-size:17px }'.
'.pay-info div{margin: 5px}'.
'.red{color: red}'.
'span.label{width: 100px;text-align: right;display: inline-block}'.
'</style>';
$html_element = $html_style.'<div class="payment-body">'.
'<div class="pay-info">'.
'<div><span class="label">订单号:</span>'.$trade_no.'</div>'.
'<div><span class="label">充值金额:</span>本次充值金额<span class="red">'.$real_amont.'</span>元,实际付款<span class="red">'.$pay_amount.'</span></div>'.
'</div>'.
'<div style="text-align: center;">'.
'<img src="'.$qrcode_url.'">'.
'</div>'.
'<div style="text-align: center">'.$tips.'</div>'.
'</div>';
return $html_element;
}
}