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.

551 lines
19 KiB
PHTML

2 years ago
<?php
namespace Mobile\Controller;
use Think\Controller;
use Common\Api\GameApi;
use Org\WeixinSDK\Weixin;
use Org\SwiftpassSDK\Swiftpass;
use Org\GoldPig\GoldPig;
use User\Api\SuserApi;
class PayController extends BaseController{
const ALI_PAY = 1; //支付宝支付
const WEIXIN_PAY =2; //微信支付
const GOLDPIG_PAY =8; //金猪支付
const PLATFORM_COIN = 1; //平台币
const BIND_PLATFORM_COIN = 2; //绑定平台币
private function pay($table,$prefix,$param){
$out_trade_no = $prefix.date('Ymd').date('His').sp_random_string(4);
$user = get_user_entity($param['user_id']);
switch ($param['apitype']) {
case 'swiftpass':
$pay = new \Think\Pay($param['apitype'],$param['config']);
break;
default:
$pay = new \Think\Pay($param['apitype'],C($param['config']));
break;
}
$vo = new \Think\Pay\PayVo();
$vo ->setFee($param['real_pay_amount'])//支付金额
->setMoney($param['pay_amount'])
->setTitle($param['title'])
->setBody($param['body'])
->setOrderNo($out_trade_no)
->setService($param['server'])
->setSignType($param['signtype'])
->setPayMethod("wap")
->setTable($table)
->setPayWay($param['payway'])
->setGameId($param['game_id'])
->setGameName($param['game_name'])
->setGameAppid($param['game_appid'])
->setServerId(0)
->setServerName("")
->setUserId($param['user_id'])
->setAccount($user['account'])
->setUserNickName($user['nickname'])
->setPromoteId($param['promote_id'])
->setPromoteName(get_promote_name($param['promote_id']))
->setExtend($param['extend'])
->setDiscount($param['discount'])
->setSdkVersion($param['sdk_version']);
return $pay->buildRequestForm($vo);
}
/**
* APP充值
* @param $token
* @param $pay_amount 金额
* @param $good_info 商品信息(json数组type 1平台币 2绑币 game_id 游戏ID)
* @param $pay_way 1 支付宝 2微信
* author: xmy 280564871@qq.com
*/
public function recharge($pay_amount,$good_info,$pay_way,$promote_id){
$good_info = json_decode($good_info,true);
$good['user_id'] = $good_info['user_id'];
if($pay_amount<0) {
$this->error("金额不正确");
}
$pay_amount = abs($pay_amount);
switch ($good_info['type']){
case self::PLATFORM_COIN:
$table = "deposit";
$prefix = "PF_";
$good['real_pay_amount'] = $pay_amount;
$good['title'] = "平台币";
$good['body'] = "平台币充值";
break;
case self::BIND_PLATFORM_COIN:
$table = "bind_recharge";
$prefix = "BR_";
$game_id = $good_info['game_id'];
$game = M("Game","tab_")->find($game_id);
if(empty($game)){
$this->error("游戏不存在");
}
$discount = empty($game['bind_recharge_discount']) ? 10 : $game['bind_recharge_discount'];
$real_pay_amount = round($pay_amount * $discount / 10,2);
//构建商品信息
$good['title'] = "绑定平台币";
$good['body'] = "绑定平台币充值";
$good['game_id'] = $game_id;
$good['game_name'] = $game['game_name'];
$good['game_appid'] = $game['game_appid'];
$good['real_pay_amount'] = $real_pay_amount;
$good['discount'] = $discount;
break;
default:
$this->error("商品信息错误");
}
$good['pay_amount'] = $pay_amount;
$good['promote_id'] = $promote_id;
switch ($pay_way){
case self::ALI_PAY :
$result = $this->alipay_pay($good,$table,$prefix);
break;
case self::WEIXIN_PAY:
$result = $this->weixin_pay($good,$table,$prefix);
break;
default:$this->error("暂无该支付选项");
}
return $result;
}
/**
* 购买商品并支付
* @param $token
* @param $pay_amount 金额
* @param $good_info 商品信息
* @param $pay_way 1 支付宝 2微信
* @author 鹿文学
*/
public function buy($pay_amount,$good_info,$pay_way,$promote_id) {
$good = json_decode($good_info,true);
if($pay_amount<0) {
$this->error("金额不正确");
}
$pay_amount = abs($pay_amount);
switch($good['type']) {
case 'small':{
$table = 'order';
$good['real_pay_amount'] = $pay_amount;
$good['title'] = "购买商品";
$good['body'] = "购买商品支付";
$prefix = 'SI_';
};break;
default:
$this->error("商品信息错误");
}
$good['pay_amount'] = $pay_amount;
switch ($pay_way){
case self::ALI_PAY :
$result = $this->alipay_pay($good,$table,$prefix,'buy_pay');
break;
case self::WEIXIN_PAY:
$result = $this->weixin_pay($good,$table,$prefix,'buy_pay');
break;
default:$this->error("暂无该支付选项");
}
return $result;
}
private function buy_pay($table,$prefix,$param){
$da = M('Order','tab_')->where(['merchandise_id'=>$param['id'],'buyer_id'=>$param['user_id']])->find();
if(is_array($da)) {
M('Order','tab_')->where(['merchandise_id'=>$param['id'],'buyer_id'=>$param['user_id']])->save(['order_time'=>time()]);
$out_trade_no = $da['order_number'];
} else {
$out_trade_no = $prefix.date('Ymd').date('His').sp_random_string(4);
}
$user = get_user_entity($param['user_id']);
switch ($param['apitype']) {
case 'swiftpass':
$pay = new \Think\Pay($param['apitype'],$param['config']);
break;
default:
$pay = new \Think\Pay($param['apitype'],C($param['config']));
break;
}
$vo = new \Think\Pay\PayVo();
$vo ->setFee($param['real_pay_amount'])//支付金额
->setMoney($param['real'])
->setTitle($param['title'])
->setBody($param['body'])
->setOrderNo($out_trade_no)
->setService($param['server'])
->setSignType($param['signtype'])
->setPayMethod("trade")
->setTable($table)
->setPayWay($param['payway'])
->setBuyerId($param['user_id'])
->setBuyerAccount($user['account'])
->setSellerId($param['seller_id'])
->setSellerAccount($param['seller_account'])
->setSmallId($param['small_id'])
->setSmallAccount($param['small_account'])
->setParam($param['id'])
->setGameId($param['game_id'])
->setPoundage($param['poundage']);
return $pay->buildRequestForm($vo);
}
/**
*支付宝移动支付
*/
private function alipay_pay($param,$table,$prefix,$pway=''){
$param['apitype'] = "alipay";
$param['config'] = "alipay";
$param['signtype']= "MD5";
$param['server'] = "alipay.wap.create.direct.pay.by.user";//mobile.securitypay.pay
$param['payway'] = 1;
$param['user_id'] = $param['user_id'];
if($pway=='buy_pay') {
$data = $this->buy_pay($table,$prefix,$param);
} else {
$data = $this->pay($table,$prefix,$param);
}
$resultData = array('pay_way'=>'alipay',"status"=>1,"url"=>$data);
return $resultData;
}
/**
*微信支付
*/
private function weixin_pay($param, $table, $prefix,$pway='')
{
$da = M('Order','tab_')->where(['merchandise_id'=>$param['id'],'buyer_id'=>$param['user_id']])->find();
if (get_wx_type() == 0) {//官方
if(is_array($da)) {
M('Order','tab_')->where(['merchandise_id'=>$param['id'],'buyer_id'=>$param['user_id']])->save(['order_time'=>time()]);
$param['pay_order_number'] = $da['order_number'];
} else {
$param['pay_order_number'] = $prefix . date('Ymd') . date('His') . sp_random_string(4);
}
$param['pay_way'] = 3;
$param['pay_status'] = 0;
$param['spend_ip'] = get_client_ip();
$weixn = new Weixin();
$is_pay = json_decode($weixn->weixin_pay($param['title'], $param['pay_order_number'], $param['real_pay_amount'], 'MWEB'), true);
if ($is_pay['status'] === 1) {
switch ($table){
case 'deposit':
$this->add_deposit($param);
break;
case "bind_recharge":
$this->add_bind_recharge($param);
break;
case 'order':
$this->add_order($param);
break;
}
if($table == 'order'){
$is_pay['mweb_url'] = $is_pay['mweb_url'].'&redirect_url='.(is_ssl()?'https%3A%2F%2F':'http%3A%2F%2F'). $_SERVER ['HTTP_HOST']."%2Fmobile.php%2FTrade%2Fsuccess%2Fout_trade_no%2F".$param['pay_order_number'];
if(session('order_scheme')){
$is_pay['mweb_url'] .= "/scheme%2F".session('order_scheme');
}
}
$json_data = array('pay_way'=>'weixin',"status"=>1,"url"=>$is_pay['mweb_url']);
}else{
$json_data = array('pay_way'=>'weixin',"status"=>0,"info"=>'失败');
}
return $json_data;
} else {
$Swiftpass=new Swiftpass(C('weixin_gf.partner'),C('weixin_gf.key'));
$param['service']="pay.weixin.wappay";
$param['ip']= get_client_ip();
$param['pay_amount']=$param['real_pay_amount'];//;
if(is_array($da)) {
$param['out_trade_no'] = $da['order_number'];
} else {
$param['out_trade_no']= $prefix . date('Ymd') . date('His') . sp_random_string(4);
}
//file_put_contents(dirname(__FILE__). '/wxswiftpass.txt',json_encode($param));
if('buy_pay'==$pway) {
$param['body']='购买商品支付';
$param['callback_url']='http://' . $_SERVER ['HTTP_HOST'] . "/mobile.php/Trade/success/out_trade_no/".$param['out_trade_no'];
$url=$Swiftpass->submitOrderInfo($param);
if($url['status']==0){
$request['pay_way'] = 4;
$this->add_order($param);
$json_data = array('pay_way'=>'weixin',"status"=>1,"url"=>$url['pay_info']);
}else{
$json_data = array('pay_way'=>'weixin',"status"=>0,"info"=>$url['msg']);
}
return $json_data;
} else {
$param['body']="游戏充值";
$param['callback_url']='http://' . $_SERVER ['HTTP_HOST'] . "/mobile.php/User/recharge";
$url=$Swiftpass->submitOrderInfo($param);
if($url['status']==0){
$request['pay_way'] = 4;
if($request['code']==1){
$this->add_spend($param);
}else{
$this->add_deposit($param);
}
$json_data = array('pay_way'=>'weixin',"status"=>1,"url"=>$url['pay_info']);
}else{
$json_data = array('pay_way'=>'weixin',"status"=>0,"info"=>$url['msg']);
}
return $json_data;
}
}
}
/**
* 金猪支付
* @return [type] [description]
* @author cb <[email address]>
*/
public function goldpig(){
if(!$this->islogin()){$this->redirect('Mobile/User/login');}$member = new SuserApi;
$user_id = get_user_id($_REQUEST['account']);
if($user_id!=$member->login_info('user_id')){
$this->error('只能给自己充值');
}
if($user_id == 0){$this->error('账号不存在');}
$pay_amount = $_POST['pay_amount'];
if($pay_amount<1) {
$this->error('金额不正确');
}
$pay_amount=abs($pay_amount);
if($_REQUEST['spendType'] == 2){
$userMap['user_id'] = $user_id;
$userMap['game_id'] = $_REQUEST['game_id'];
$empty = M('UserPlay','tab_')->where($userMap)->find();
if(empty($empty)){
$this->error('该用户未玩过此游戏哦~');
}
}
$data['user_id']=$user_id;
switch ($_POST['spendType']){
case '1':
$data['real_pay_amount'] = $pay_amount;
$data['prefix'] = "PF_";
break;
case '2':
$data['prefix'] = "BR_";
$game_id = $_POST['game_id'];
$game = M("Game","tab_")->find($game_id);
if(empty($game)){
$this->error("游戏不存在");
}
$discount = empty($game['bind_recharge_discount']) ? 10 : $game['bind_recharge_discount'];
$real_pay_amount = round($pay_amount * $discount / 10,2);
//构建商品信息
$data['game_id'] = $game_id;
$data['game_name'] = $game['game_name'];
$data['game_appid'] = $game['game_appid'];
$data['real_pay_amount'] = $real_pay_amount;
break;
default:
$this->error("信息错误");
}
$data['pay_amount'] = $pay_amount;
$this->assign('data',$data);
$this->display();
}
/**
* 金猪支付
* @return [type] [description]
* @author cb <[email address]>
*/
public function goldpig_pay(){
$member = new SuserApi;
$user = get_user_entity($member->login_info('user_id'));
$data['user_id'] = $user['id'];
$data['promote_id'] = $user['promote_id'];
$pay_amount = $_POST['amount'];
$amount = $_POST['amount'];
if($pay_amount<1 || $amount< 1) {
$this->error('支付金额错误!');
}
$pay_amount = abs($pay_amount);
switch ($_POST['prefix']){
case 'PF_':
$table = "deposit";
$prefix = "PF_";
$data['real_pay_amount'] = $pay_amount;
$data['title'] = "平台币";
$data['body'] = "平台币充值";
if($amount!==$pay_amount){//验证订单金额
$this->error('支付金额错误!');
}
break;
case 'BR_':
$game_id = $_POST['game_id'];
$game = M("Game","tab_")->find($game_id);
$discount = empty($game['bind_recharge_discount']) ? 10 : $game['bind_recharge_discount'];
$real_pay_amount = $amount;
//构建商品信息
$data['title'] = "绑定平台币";
$data['body'] = "绑定平台币充值";
$data['game_id'] = $game_id;
$data['game_name'] = $game['game_name'];
$data['game_appid'] = $game['game_appid'];
$data['real_pay_amount'] = $real_pay_amount;
$data['discount'] = $discount;
if(round($pay_amount*$discount,1)/10 != $_POST['amount']){//验证订单金额
$this->error('支付金额错误!');
}
break;
default:
$this->error("信息错误");
}
$data['pay_amount'] = $pay_amount;
$data['pay_order_number'] = $_POST['prefix'] . date('Ymd') . date('His') . sp_random_string(4);
$data['pay_way'] = 8;
$data['pay_status'] = 0;
$data['spend_ip'] = get_client_ip();
switch ($_POST['prefix']){
case 'PF_':
$this->add_deposit($data);
break;
case "BR_":
$this->add_bind_recharge($data);
break;
}
/* $goldpig=new GoldPig();
$url = $goldpig->GoldPig($user['account'],$data["real_pay_amount"],$_POST["PayID"],$data["pay_order_number"],$_POST["ka_type"],$_POST["mobile"],$_POST["password"]);
if($url['status']==1){
redirect($url['msg']);
}else{
$this->error('失败');
} */
$baseurl = 'http://api.357p.com/?';
$url = $baseurl . "UserName={$user['account']}&Price={$data['real_pay_amount']}&shouji={$_POST['shouji']}&PayID={$_POST['PayID']}&userid={$_POST['userid']}&wooolID={$_POST['wooolID']}&jinzhua={$data['pay_order_number']}&jinzhub={$_POST['jinzhub']}&jinzhuc={$_POST['jinzhuc']}&jinzhue={$data['pay_order_number']}";
redirect($url);exit;
}
/**
*支付验证
*/
public function pay_validation(){
#获取SDK上POST方式传过来的数据 然后base64解密 然后将json字符串转化成数组
$request = json_decode(base64_decode(file_get_contents("php://input")),true);
$out_trade_no = $request['out_trade_no'];
$pay_where = substr($out_trade_no,0,2);
$result = 0;
$map['pay_order_number'] = $out_trade_no;
switch ($pay_where) {
case 'SP':
$data = M('spend','tab_')->field('pay_status')->where($map)->find();
$result = $data['pay_status'];
break;
case 'PF':
$data = M('deposit','tab_')->field('pay_status')->where($map)->find();
$result = $data['pay_status'];
break;
case 'AG':
$data = M('agent','tab_')->field('pay_status')->where($map)->find();
$result = $data['pay_status'];
break;
default:
exit('accident order data');
break;
}
if($result){
echo base64_encode(json_encode(array("status"=>1,"return_code"=>"success","return_msg"=>"支付成功")));
exit();
}else{
echo base64_encode(json_encode(array("status"=>0,"return_code"=>"fail","return_msg"=>"支付失败")));
exit();
}
}
/**
*sdk客户端显示支付
*/
public function payShow(){
$map['type'] = 1;
$map['status'] = 1;
$data = M("tool","tab_")->where($map)->select();
if(empty($data)){
echo base64_encode(json_encode(array("status"=>0,"return_code"=>"fail","return_msg"=>"暂无数据")));
exit();
}
foreach ($data as $key => $value) {
$pay_show_data[$key]['mark'] = $value['name'];
$pay_show_data[$key]['title'] = $value['title'];
}
echo base64_encode(json_encode(array("status"=>0,"return_code"=>"fail","return_msg"=>"成功","pay_show_data"=>$pay_show_data)));
exit();
}
public function look() {
$user = D('User')->getLoginInfo();
$id = $_POST['id'];
if(is_array($user)) {
if(is_numeric($id) && $id>0) {
$order = M('Order','tab_')->field('order_number')->where(['merchandise_id'=>$id,'buyer_id'=>$user['user_id']])->find();
file_put_contents(dirname(__FILE__) .'/order.txt',json_encode($order));
$weixn = new Weixin();
$result = $weixn->weixin_orderquery($order['order_number']);
file_put_contents(dirname(__FILE__) .'/order2.txt',json_encode($result));
if($result == $order['order_number']) {
$this->ajaxReturn(['status'=>1,'info'=>'','url'=>U('Trade/success',array('out_trade_no'=>$order['order_number']))],'json');
} else {
$this->ajaxReturn(['status'=>0,'info'=>$result],'json');
}
} else {
$this->ajaxReturn(['status'=>0,'info'=>'参数错误'],'json');
}
} else {
$this->ajaxReturn(['status'=>0,'info'=>'未登录'],'json');
}
}
}