* @version : HUOSDK 8.0 */ namespace web\pc\logic; use huo\model\common\CommonModel; use think\Session; use think\Request; use think\Db; use think\Loader; class PayLogic extends CommonModel { private function setorderid($mem_id) { list($usec, $sec) = explode(" ", microtime()); // 取微秒前3位+再两位随机数+渠道ID后四位 $orderid = $sec.substr($usec, 2, 3).rand(10, 99).sprintf("%04d", $mem_id % 10000); return $orderid; } /** *支付宝支付 */ function _alipayweb() { if (Request::instance()->isPost()) { $data = $this->_insertpay(); if (empty($data['order_id'])) { return $data; } $_conf_file = ROOT_PATH."data/conf/pay/alipay/config.php"; if (file_exists($_conf_file)) { $alipay_config = include $_conf_file; } else { $alipay_config = array(); } //支付类型 $payment_type = "1"; //必填,不能修改 //服务器异步通知页面路径 $notify_url = WEBSITE."/v8/pay/ptb_alipay_notify"; //需http://格式的完整路径,不能加?id=123这类自定义参数 //页面跳转同步通知页面路径 $return_url = WEBSITE."/v8/member/index"; //需http://格式的完整路径,不能加?id=123这类自定义参数,不能写成http://localhost/ //商户订单号 $out_trade_no = $data['order_id']; //商户网站订单系统中唯一订单号,必填 //订单名称 $subject = "平台币充值"; //必填 //付款金额 $total_fee = $data['money']; //必填 //商品展示地址 $show_url = WEBSITE; //必填,需以http://开头的完整路径,例如:http://www.商户网址.com/myorder.html //订单描述 $body = "平台币充值"; //选填 //超时时间 $it_b_pay = '15d'; //选填 //钱包token $extern_token = ""; //选填 $alipay_config['input_charset'] = 'utf-8'; $alipay_config['sign_type'] = 'RSA'; $alipay_config['private_key_path'] = ROOT_PATH.'data/conf/pay/alipay/key/rsa_private_key.pem'; $alipay_config['public_key_path'] = ROOT_PATH.'data/conf/pay/alipay/key/alipay_public_key.pem'; $parameter = array( "service" => 'create_direct_pay_by_user', "partner" => trim($alipay_config['partner']), "payment_type" => $payment_type, "notify_url" => $notify_url, "return_url" => $return_url, "seller_email" => trim($alipay_config['seller_email']), "out_trade_no" => $out_trade_no, "subject" => $subject, "total_fee" => $total_fee, "body" => $body, "show_url" => $return_url, "anti_phishing_key" => "", "exter_invoke_ip" => "", "_input_charset" => trim(strtolower($alipay_config['input_charset'])) ); //建立请求,请求成功之后,会通知服务器的alipay_notify方法,客户端会通知$return_url配置的方法 Loader::import('pay.alipay.AlipaySubmit', '', '.class.php'); $alipaySubmit = new \AlipaySubmit($alipay_config); $html_text = ''; $html_text = $alipaySubmit->buildRequestForm($parameter, "get", "跳转中"); $html_text = $html_text.""; echo $html_text; } } /** *支付宝回调 */ function alipay_notify() { Loader::import('pay.alipay.AlipayNotify', '', '.class.php'); //计算得出通知验证结果 $alipay_config = $this->alipayConfig(); $alipayNotify = new \AlipayNotify($alipay_config); $verify_result = $alipayNotify->verifyNotify(); if ($verify_result) {//验证成功 //商户订单号 $out_trade_no = $_POST['out_trade_no']; //支付宝交易号 $trade_no = $_POST['trade_no']; $amount = $_POST['total_fee']; //交易状态 $trade_status = $_POST['trade_status']; if ($trade_status == 'TRADE_FINISHED') { // 自由网络申请的是普通及时到账接口 //支付成功后,修改支付表中支付状态,并将交易信息写入用户平台充值记录表ptb_charge。 //$this->paypost($out_trade_no,$trade_no,$amount); } else if ($trade_status == 'TRADE_SUCCESS') { //支付成功后,修改支付表中支付状态,并将交易信息写入用户平台充值记录表ptb_charge。 $this->paypost($out_trade_no, $amount); } } else { echo '验证失败'; } } public function alipayConfig() { $_conf_file = ROOT_PATH."data/conf/pay/alipay/config.php"; if (file_exists($_conf_file)) { $alipay_config = include $_conf_file; } else { $alipay_config = array(); } $alipay_config = array( 'partner' => $alipay_config['partner'], 'key' => $alipay_config['key'], 'input_charset' => strtolower('utf-8'), 'cacert' => $alipay_config['partner'], 'transport' => 'http', 'sign_type' => 'RSA', 'private_key_path' => ROOT_PATH.'data/conf/pay/alipay/key/rsa_private_key.pem', 'public_key_path' => ROOT_PATH.'data/conf/pay/alipay/key/alipay_public_key.pem' ); return $alipay_config; } /** *支付记录保存 */ function _insertpay() { $ptb_cnt = request()->param('amount'); // 获取平台币数量 $username = request()->param('username'); // 获取折扣 $_walle_class = new WalletLogic(); $discount = $_walle_class->getPtbRate(); $amount = $discount['discount'] * $ptb_cnt; // 平台币与充值金额比例暂定为1:1 $paytypeid = request()->param('type'); // 判断充值金额的有效性 if ($amount <= 0) { return array('error' => 3, 'msg' => '充值金额不能小于或等于0'); } //验证参数有效性 if (empty($amount) || empty($username) || empty($ptb_cnt) || empty($paytypeid) ) { $str = "缺少参数,请重新提交"; return array('error' => 4, 'msg' => $str); } //检查用户名是否存在 $mem_id = Db::name('member') ->where(array('username' => $username)) ->value('id'); if (empty($mem_id)) { $str = "用户不存在"; return array('error' => 5, 'msg' => $str); } if (!empty(Session::get('paytime')) && Session::get('paytime') + 5 > time()) { $str = "订单己存在,请确认是您的付款单号再付款!"; return array('error' => 6, 'msg' => $str); } //订单流水号 $order_id = $this->setorderid($mem_id); Session::set('weborderid', $order_id); Session::set('paytime', time()); //查询是否为同一订单,插入到平台币充值订单中 $orderdata = Db::name('ptb_charge')->where(array('order_id' => $order_id))->value('id'); //判断订单是否存在 if ($orderdata) { $str = "订单己存在,请确认是您的付款单号再付款!"; return array('error' => 7, 'msg' => $str); } $BuyerIp = request()->ip(); //用户支付时使用的网络终端IP $transtime = time(); //交易时间 $mem_id = Db::name("member")->where(array("username" => $username))->value("id"); $data['order_id'] = $order_id; $data['mem_id'] = $mem_id; $data['money'] = $amount; $data['ptb_cnt'] = $ptb_cnt; $data['status'] = 1; $data['create_time'] = $transtime; $data['payway'] = $paytypeid; $data['flag'] = 1; // 官网充值 $data['remark'] = "官网充值"; $data['ip'] = $BuyerIp; $data["discount"] = "1"; $data["real_amount"] = $amount; $data['id'] = Db::name('ptb_charge')->insert($data); if (!$data['id']) { return array('error' => 8, 'msg' => '数据处理出错,请重新提交!'); } return $data; } function paypost($out_trade_no, $total_fee) { $time = time(); $data = Db::name("ptb_charge")->where(array("order_id" => $out_trade_no))->find(); $myamount = number_format($data['money']); $transAmount = number_format($total_fee); if ($myamount == $transAmount) { if ($data['status'] == 1) { $status['status'] = 2; $rs = Db::name("ptb_charge")->where(array("order_id" => $out_trade_no))->update($status); if ($rs) { $check = $this->checkPtb($data['mem_id'], $data['ptb_cnt'], $data['money']); if ($check) { echo "OK"; exit; } } } } } //检查是否已经存在过平台币并更新 public function checkPtb($mem_id, $ptb_cnt, $amount) { //获取玩家平台币余额表中的ID $data = Db::name('ptb_mem')->where(array('mem_id' => $mem_id))->find(); $where['remain'] = $data['remain'] + $ptb_cnt; $where['update_time'] = time(); $where['total'] = $data['total'] + $ptb_cnt; $where['sum_money'] = $data['sum_money'] + $amount; $map['mem_id'] = $mem_id; //判断玩家平台币余额表中是否存在数据,没有则添加,有则修改! if (!empty($data)) { $result = Db::name('ptb_mem')->where($map)->update($where); } else { $where['create_time'] = time(); $where['mem_id'] = $mem_id; $where['total'] = $ptb_cnt; $where['remain'] = $ptb_cnt; $where['sum_money'] = $amount; $result = Db::name('ptb_mem')->data($where)->insert(); } //判断充值结果 if ($result) { return true; } else { return false; } } /** * 扫码支付 * * @return mixed */ function _spayweb() { if (Request::instance()->isPost()) { $data = $this->_insertpay(); if (empty($data['order_id'])) { return [ 'status' => 500, 'msg' => '支付失败' ]; } $_conf_file = ROOT_PATH."data/conf/pay/spay/config.php"; if (file_exists($_conf_file)) { $_config = include $_conf_file; } else { $_config = array(); } header("Content-type:text/html;charset=utf-8"); Loader::import('pay.spay.Utils', '', '.class.php'); Loader::import('pay.spay.RequestHandler', '', '.class.php'); Loader::import('pay.spay.ClientResponseHandler', '', '.class.php'); Loader::import('pay.spay.PayHttpClient', '', '.class.php'); $resHandler = new \ClientResponseHandler(); $reqHandler = new \RequestHandler(); $pay = new \PayHttpClient(); $notify_url = WEBSITE."/v8/pay/ptb_spay_notify"; //导入回调地址 $reqHandler->setGateUrl($_config['url']); $reqHandler->setKey($_config['key']); $reqHandler->setParameter('out_trade_no', $data['order_id']); $reqHandler->setParameter('body', "平台币充值"); $reqHandler->setParameter('attach', "平台币充值"); $reqHandler->setParameter('total_fee', $data['money'] * 100); $reqHandler->setParameter('mch_create_ip', $data['ip']); $reqHandler->setParameter('time_start', date('YmdHis', time())); $reqHandler->setParameter('time_expire', date('YmdHis', time() + 7200)); $reqHandler->setParameter('service', 'pay.weixin.native');//接口类型:pay.weixin.native $reqHandler->setParameter('mch_id', $_config['mchId']);//必填项,商户号,由威富通分配 $reqHandler->setParameter('version', $_config['version']); //通知地址,必填项,接收威富通通知的URL,需给绝对路径,255字符内格式如:http://wap.tenpay.com/tenpay.asp //$notify_url = 'http://'.$_SERVER['HTTP_HOST']; //$reqHandler->setParameter('notify_url',$notify_url.'/payInterface/request.php?method=callback'); $reqHandler->setParameter('notify_url', $notify_url); $reqHandler->setParameter('nonce_str', mt_rand(time(), time() + rand()));//随机字符串,必填项,不长于 32 位 $reqHandler->createSign();//创建签名 $rdata = \Utils::toXml($reqHandler->getAllParameters());//var_dump($rdata); $pay->setReqContent($reqHandler->getGateURL(), $rdata); if ($pay->call()) { $resHandler->setContent($pay->getResContent()); $resHandler->setKey($reqHandler->getKey()); if ($resHandler->isTenpaySign()) { //当返回状态与业务结果都为0时才返回支付二维码,其它结果请查看接口文档 if ($resHandler->getParameter('status') == 0 && $resHandler->getParameter('result_code') == 0) { $code_img_url = $resHandler->getParameter('code_img_url'); $_rdata = [ 'status' => 1, 'data' => [ 'code_img_url' => $code_img_url, 'order_id' => $data['order_id'], 'checkurl' => WEBSITE."/v8/pay/spay_status", 'returnurl' => WEBSITE."/v8/member/index" ] ]; return $_rdata; // $this->assign('code_img_url', $code_img_url); // $this->assign('order_id', $data['order_id']); // $this->assign('checkurl', WEBSITE."/index.php/index/pay/spaystatus"); // $this->assign('returnurl', WEBSITE); // \think\Config::set('default_return_type', 'html'); // // return $this->fetch("spay"); } else { echo json_encode( array('status' => 500, 'msg' => 'Error Code:'.$resHandler->getParameter('err_code').' Error Message:' .$resHandler->getParameter('err_msg')) ); exit(); } } echo json_encode( array('status' => 500, 'msg' => 'Error Code:'.$resHandler->getParameter('status').' Error Message:' .$resHandler->getParameter('message')) ); } else { echo json_encode( array('status' => 500, 'msg' => 'Response Code:'.$pay->getResponseCode().' Error Info:'.$pay->getErrInfo()) ); } } } /** *威富通通知 */ function spay_notify() { if (Request::instance()->isPost()) { $_conf_file = ROOT_PATH."data/conf/pay/spay/config.php"; if (file_exists($_conf_file)) { $_config = include $_conf_file; } else { $_config = array(); } header("Content-type:text/html;charset=utf-8"); Loader::import('pay.spay.Utils', '', '.class.php'); Loader::import('pay.spay.RequestHandler', '', '.class.php'); Loader::import('pay.spay.ClientResponseHandler', '', '.class.php'); Loader::import('pay.spay.PayHttpClient', '', '.class.php'); $resHandler = new \ClientResponseHandler(); $xml = file_get_contents('php://input'); $resHandler->setContent($xml); $resHandler->setKey($_config['key']); //判断签名结果 $signResult = $resHandler->isTenpaySign(); if ($signResult) { if ($resHandler->getParameter('status') == 0 && $resHandler->getParameter('result_code') == 0) { //更改订单状态 $out_trade_no = $resHandler->getParameter('out_trade_no'); //自己生成的订单状态 $total_fee = $resHandler->getParameter('total_fee') / 100; //将订单状态写入数据表中 $this->paypost($out_trade_no, $total_fee); echo 'success'; exit; } else { echo 'failure1'; exit(); } } else { echo 'failure2'; } } echo 'failure2'; } function spayStatus($order_id) { $_order_id = $order_id; if (empty($_order_id)) { $_data = array( "success" => 0 ); return $_data; } $_status = Db::name("ptb_charge")->where(array("order_id" => $_order_id))->value("status"); if (2 == $_status) { $_data = array( "success" => 1 ); } else { $_data = array( "success" => 0 ); } return $_data; } }