| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013 |
- <?php
- /**
- * api登录控制器
- */
- namespace app\api\controller\v1;
- use app\common\logic\Pay as PayLogic;
- use app\common\logic\PayCallback;
- use app\common\model\Members;
- use app\common\model\Pay;
- use app\common\model\PayCpinfo;
- use think\Config;
- use think\Controller;
- use think\Db;
- use tree\SignaTure;
- class Demo extends Controller
- {
- public function a()
- {
- // dump($_SERVER['HTTP_X_FORWARDED_FOR'])."----";
- //dump($_SERVER["REMOTE_ADDR"]);die;
- dump(request()->ip());die;
- if(!empty($_SERVER['HTTP_CLIENT_IP'])){
- $cip = $_SERVER['HTTP_CLIENT_IP'];
- }
- else if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
- $cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
- }
- else if(!empty($_SERVER["REMOTE_ADDR"])){
- $cip = $_SERVER["REMOTE_ADDR"];
- }else{
- $cip = '';
- }
- preg_match("/[\d\.]{7,15}/", $cip, $cips);
- $cip = isset($cips[0]) ? $cips[0] : 'unknown';
- // unset($cips);
- dump( $cips);die;
- $b = $this->zfb();
- $result1['mweb_url'] = $b;
- $result['xzzfbzf_param'] = $result1;
- $result['orderid'] = 1;
- $result['referer'] = "com.yiyou.zfb";
- $this->jsonResult($result, 1, '订单生成成功',false);
- }
- public function zfb()
- {
- // $orderid = makeOrderid();
- // $productname = "产品名称";
- // $real_amount = 0.01;
- // $payData['orderid'] = $orderid;
- // $payData['real_amount'] =$real_amount;
- // $payData['productname'] = $productname;
- // $payData['productdesc'] = "";
- // $payData['status'] = 0;
- // $payData['create_time'] = NOW_TIMESTAMP;
- // Db::name("cy_demo")->insert($payData);
- $consumerCreateIp = $this->getUserIp(); //需上传用户真实ip
- $key = 'F6LKdnnlwPYxpHbINQMVij9RVkVlnW3I';
- $req=array();
- $req["appId"] = '159463067783992';
- $req["deviceType"] = '0601';
- $req["frontNotifyUrl"] = 'http://sdkapi.46yx.com/v1.pay_notify/zfbxjzfipaynow.html';//前台通知,三方支付宝0模式有效,官方支付宝0、1模式有效,微信0模式有效
- $req["funcode"] = 'WP001';
- $req["mhtCharset"] = 'UTF-8';
- $req["mhtCurrencyType"] = '156';
- $req["mhtOrderAmt"] = 0.1*100;
- $req["mhtOrderDetail"] = '订单支付';
- $req["mhtOrderName"] = '产品名称';
- $req["mhtOrderNo"] = makeOrderid();
- $req["mhtOrderStartTime"] = date("YmdHis");
- $req["mhtOrderTimeOut"] = '3600';
- $req["mhtOrderType"] = '01';
- $req["mhtReserved"] = "test";
- $req["mhtSignType"] = 'MD5';
- $req["notifyUrl"] = 'http://sdkapi.46yx.com/v1.pay_notify/zfbxjzfipaynow.html';
- $req["outputType"] = 1;// 0 默认值
- $req["payChannelType"] = 12; //12 支付宝 //13 微信 //20 银联 //25 手Q
- $req["version"] = "1.0.0";
- $req["consumerCreateIp"] = $consumerCreateIp; //微信必填// outputType=2时 无须上送该值
- $req_str = $this -> getToStr($req, $key);
- $service = 'https://pay.ipaynow.cn';
- $res = $this -> post($service, $req_str);
- $code = (bool)stripos($res, '&tn=');
- if($code) {
- $arr = explode('&', $res);
- $gettn = '';
- foreach($arr as $v) {
- $tn = explode('=', $v);
- if($tn[0] == 'tn'){
- $gettn = $tn[1];
- }
- }
- //注意
- //支付宝ISV返回的tn urldecode函数会自动转义,导致tn解码不正确
- // 1、¬被转义,显示成﹁。2、×会被转义成 X
- // if(strpos($gettn,'notify_url')!== false){
- // $gettn=str_replace("notify_url","ampnotify_url",$gettn);
- // $gettn=str_replace("timestamp","amptimestamp",$gettn);
- // }
- echo urldecode($gettn);
- $tn=urldecode($gettn);
- echo "请点击链接进行支付:<a href='". urldecode($gettn) ."'>点我支付</a>";
- // echo "请点击链接进行支付:<a href='$tn'>点我支付</a>";
- // echo "<iframe frameborder='no' src='$tn'></iframe>";
- } else {
- echo $res;
- }
- // print_r($req);die;
- // $req_str = $this -> getToStr($req, $key);
- // $service = 'https://pay.ipaynow.cn';
- // header("location:".$service."?".$req_str);
- // die();
- // $urlPay = $service."?".$req_str;
- // return $urlPay;
- // $result1['mweb_url'] = htmlspecialchars($urlPay);
- // $result['xzzfbzf_param'] = $result1;
- // $result['orderid'] = makeOrderid();
- // $result['referer'] = "com.yiyou.zfb";
- // $this->jsonResult($result, 1, '订单生成成功',false);
- // return $result1;
- }
- public function post($url, $data)
- {
- $curl = curl_init(); // 启动一个CURL会话
- curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
- curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
- //curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
- curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器
- //curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
- curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
- curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
- curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包
- curl_setopt($curl, CURLOPT_TIMEOUT, 40); // 设置超时限制防止死循环
- curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
- $tmpInfo = curl_exec($curl); // 执行操作
- if (curl_errno($curl)) {
- echo 'Errno'.curl_error($curl);
- echo curl_errno($curl);//捕抓异常
- }
- curl_close($curl); // 关闭CURL会话
- return $tmpInfo; // 返回数据
- }
- //获取参数
- function getDate($arr) {
- $result = array();
- $funcode = $arr['funcode'];
- foreach($arr as $key => $value) {
- if (($funcode=='WP001')&&!($key=='mhtSignature'||$key=='signature')){
- $result[$key]=$value;
- continue;
- }
- if(($funcode== 'N001'||$funcode=='N002')&&!($key== 'signature')){
- $result[$key]=$value;
- continue;
- }
- if (($funcode=='MQ002')&&!($key=='mhtSignature'||$key=='signature')) {
- $result[$key]=$value;
- continue;
- }
- }
- return $result;
- }
- //获取签名
- function createSignaTure($arr, $key) {
- $date = $this -> getDate($arr);
- ksort($date);
- $str = '';
- foreach($date as $k => $v) {
- if($v != '') {
- $str .= $k.'='.$v.'&';
- }
- }
- $str .= strtolower(md5($key));
- return(strtolower(md5($str)));
- }
- //获取请求参数串
- function getToStr($arr, $key) {
- $date = $this -> getDate($arr);
- $info = $this -> createSignaTure($arr, $key);
- $str = '';
- foreach($date as $k => $v) {
- if($v != '') {
- $str .= $k.'='.urlencode($v).'&';
- }
- }
- $str .= 'mhtSignature'.'='.$info;
- log_message($str."\r\n",'log',LOG_PATH . '../paylog/');
- //file_put_contents('../baowen.log', $str."\r\n");
- return $str;
- }
- //获取真实IP,可以根据实际情况自行获取
- function getUserIp() {
- $info = file_get_contents('http://myip.ipip.net');
- $ipstr = explode(':',$info);
- $ip = explode(' ', $ipstr[1]);
- return $ip[0];
- }
- public function zfbalipays() {
- //返回的参数
- $res = file_get_contents('php://input');
- //写入日志
- log_message('现在支付回调参数:'.$res,'log',LOG_PATH . '../paylog/');
- $Arr = array();
- $res = explode('&', $res);
- //写入日志
- log_message('现在支付explode处理后的回调参数:'.print_r($res,true),'log',LOG_PATH . '../paylog/');
- foreach($res as $v) {
- $value = explode('=', $v);
- $Arr[$value[0]] = urldecode($value[1]);
- }
- $signatrue = $this->getIpaynowSignTrue($Arr,'F6LKdnnlwPYxpHbINQMVij9RVkVlnW3I');
- if($signatrue == $Arr['signature']) {
- $orderid = $Arr['mhtOrderNo'];
- $mhtOrderAmt= $Arr['mhtOrderAmt']/100; //商户订单交易金额,以分为单位
- //订单编号不为空时
- if(!empty($orderid)){
- log_message('现在支付回调参数:'.print_r($orderid,true),'log',LOG_PATH . '../paylog/');
- //更新订单状态处理
- // $this->updateOrder($orderid,$mhtOrderAmt);
- }
- //异步通知验签通过,在此处写业务逻辑
- echo 'success=Y';
- } else {
- //写入日志
- log_message('现在支付签名验证失败','error',LOG_PATH . '../paylog/');
- //异步通知验签失败,在此处写业务逻辑
- echo 'success=N';
- }
- }
- /**
- * 对现在支付回调的请求报文做签名验证,
- * copy现在支付demo代码中controller.php的getSignTrue方法
- *
- * @param $Arr array 报文参数
- * @param $key string
- *
- * @return mix
- */
- private function getIpaynowSignTrue( $Arr, $key )
- {
- if( !empty($Arr) ) {
- ksort($Arr);
- $str = '';
- foreach( $Arr as $k => $v) {
- if( $v == '' || $k == 'signature') {
- continue;
- }
- $str .= $k.'='.$v.'&';
- }
- if( $key == 'post' ) {
- return substr($str, 0, -1);
- } else {
- return strtolower(md5($str.md5($key)));
- }
- }
- return false;
- }
- public function zf()
- {
- vendor('alipayAop.AopSdk');
- $aop = new \AopClient ();
- $aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
- $aop->appId = '2021002156644399';
- $aop->rsaPrivateKey = file_get_contents(Config::get('alipayAop')['private_key']);
- $aop->alipayrsaPublicKey = file_get_contents(Config::get('alipayAop')['alipay_public_key']);
- $aop->apiVersion = '1.0';
- $aop->signType = 'RSA2';
- $aop->postCharset='UTF-8';
- $aop->format='json';
- $object = new \stdClass();
- $object->out_trade_no = makeOrderid();
- $object->total_amount = 1;
- $object->subject = '测试商品';
- $json = json_encode($object);
- $request = new \AlipayTradePrecreateRequest();
- $request->setNotifyUrl('');
- $request->setBizContent($json);
- $result = $aop->execute ( $request);
- $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
- $resultCode = $result->$responseNode->code;
- if(!empty($resultCode)&&$resultCode == 10000){
- echo "成功";
- } else {
- echo "失败";
- }
- // vendor('alipayAop.AopSdk');
- // $aop = new \AopClient();
- // $aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
- // $aop->appId = '2021002156644399';
- // $aop->rsaPrivateKey = file_get_contents(Config::get('alipayAop')['private_key']);
- // $aop->alipayrsaPublicKey = file_get_contents(Config::get('alipayAop')['alipay_public_key']);
- // $aop->apiVersion = '1.0';
- // $aop->signType = 'RSA2';
- // $aop->postCharset='UTF-8';
- // $aop->format='json';
- //
- // $object = new \stdClass();
- // $object->out_trade_no = makeOrderid();
- // $object->total_amount = 0.01;
- // $object->subject = '测试商品';
- // $object->scene ='bar_code';
- // $object->auth_code = '2088141882030979';
- // $json = json_encode($object);
- // $request = new \AlipayTradePayRequest();
- // $request->setBizContent($json);
- // $result = $aop->execute($request);
- // print_r($result);die;
- // $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
- //
- // $resultCode = $result->$responseNode->code;
- //
- // if(!empty($resultCode)&&$resultCode == 10000){
- // echo "成功";
- // } else {
- // echo "失败";
- // }
- }
- public function index()
- {
- $orderid = makeOrderid();
- $productname = "产品名称";
- $real_amount = 0.01;
- $payData['orderid'] = $orderid;
- $payData['real_amount'] =$real_amount;
- $payData['productname'] = $productname;
- $payData['productdesc'] = "";
- $payData['status'] = 0;
- $payData['create_time'] = NOW_TIMESTAMP;
- Db::name("cy_demo")->insert($payData);
- //第三方支付用的商品简单描述 (去除&+等特殊字符)
- $payBody = preg_replace("/[\&\+]+/", '', $productname);
- //支付宝支付参数
- $qrcodePay = $this->chargeByZfbWap($orderid, 0.01, $payBody) ;
- // $qrcodePay = htmlspecialchars($qrcodePay);
- $result1['mweb_url'] = $qrcodePay;
- $result['zfbsmzf_param'] = $result1;
- $result['orderid'] = $orderid;
- $result['referer'] = "com.yiyou.smzfb";
- $this->jsonResult($result, 1, '订单生成成功',false);
- }
- public function jsonResult($data, $code = 0, $msg = '',$isExit=true)
- {
- $result = [
- 'code' => $code,
- 'msg' => $msg,
- 'time' => request()->server('REQUEST_TIME'),
- 'data' => $data,
- ];
- print_r($result);die;
- }
- private function chargeByZfbWap($orderid, $real_amount, $productname, $productdesc = '')
- {
- vendor('alipayAop.AopSdk');
- $aop = new \AopClient();
- $aop->gatewayUrl = "https://openapi.alipay.com/gateway.do"; //网关地址要使用沙箱网关alipaydev
- $aop->appId = "2021002156644399";
- $aop->rsaPrivateKey = file_get_contents(Config::get('alipayAop')['private_key']);
- $aop->alipayrsaPublicKey = file_get_contents(Config::get('alipayAop')['alipay_public_key']);
- $aop->format = "json";
- $aop->apiVersion = '1.0';
- $aop->postCharset = 'UTF-8';
- $aop->signType = "RSA2";
- //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
- $request = new \AlipayTradePagePayRequest();
- $productname = preg_replace("/[\&\+]+/", '', $productname); // 主题(过滤特殊字符)
- $subject = preg_replace("/[\&\+]+/", '', $productdesc); // 商品描述信息(过滤特殊字符)
- //SDK已经封装掉了公共参数,这里只需要传入业务参数
- $info = json_encode(['body' => $subject, 'subject' => $productname, 'out_trade_no' => $orderid,
- 'timeout_express' => '30m', 'total_amount' => $real_amount, 'product_code' => 'FAST_INSTANT_TRADE_PAY'], JSON_UNESCAPED_UNICODE);
- $request->setBizContent($info);
- // $request->setReturnUrl("http://" . $_SERVER['HTTP_HOST'] . "/v1.user_center/returnUrl.html");
- // $request->setNotifyUrl("http://" . $_SERVER['HTTP_HOST'] . "/v1.platform_pay/notify.html");
- $request->setNotifyUrl(Config::get('alipayAop')['notify_url']);
- $result = $aop->pageExecute($request);
- // $result = htmlspecialchars($result);
- return $result;
- }
- private function getAlipayWapPostAopParam($orderid,$real_amount,$productname,$productdesc='')
- {
- vendor('alipayAop.AopSdk');
- $aop = new \AopClient();
- $aop->gatewayUrl = "https://openapi.alipay.com/gateway.do"; //网关地址要使用沙箱网关alipaydev
- $aop->appId = "2021002156644399";
- $aop->rsaPrivateKey = file_get_contents(Config::get('alipayAop')['private_key']);
- $aop->alipayrsaPublicKey = file_get_contents(Config::get('alipayAop')['alipay_public_key']);
- $aop->format = "json";
- $aop->apiVersion = '1.0';
- $aop->postCharset='UTF-8';
- $aop->signType = "RSA2";
- //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
- $request = new \AlipayTradePagePayRequest();
- //SDK已经封装掉了公共参数,这里只需要传入业务参数
- $info = json_encode(['body'=>$productdesc,'subject'=>$productname,'out_trade_no'=>$orderid,
- 'timeout_express'=>'30m','total_amount'=>$real_amount,'product_code'=>'FAST_INSTANT_TRADE_PAY'],JSON_UNESCAPED_UNICODE);
- $request->setBizContent($info);
- $request->setReturnUrl("http://" . $_SERVER['HTTP_HOST'] . "/v1.demo/returnback.html");
- $request->setNotifyUrl("http://" . $_SERVER['HTTP_HOST'] . "/v1.demo/alipayAop.html");
- $result = $aop->pageExecute($request);
- $result = htmlspecialchars($result);
- return $result;
- //Alipay Aop Sdk支付发起
- // vendor('alipayAop.AopSdk');
- // $aop = new \AopClient();
- //
- // $aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
- // $aop->appId = Config::get('alipayAop')['appId'];
- // $aop->rsaPrivateKey = file_get_contents(Config::get('alipayAop')['private_key']);
- // $aop->alipayrsaPublicKey = file_get_contents(Config::get('alipayAop')['alipay_public_key']);
- // $aop->apiVersion = '1.0';
- // $aop->signType = Config::get('alipayAop')['sign_type'];
- // $aop->postCharset = 'utf-8';
- // $aop->format = 'json';
- //
- // $request = new \AlipayTradeWapPayRequest();
- // $bizcontent = array();
- // $bizcontent['subject'] = preg_replace("/[\&\+]+/", '', $productname); // 主题(过滤特殊字符)
- // $bizcontent['body'] = preg_replace("/[\&\+]+/", '', $productdesc); // 商品描述信息(过滤特殊字符)
- // $bizcontent['out_trade_no'] = $orderid; // 订单号
- // $bizcontent['timeout_express'] = '30m'; // 超时时间
- // $bizcontent['total_amount'] = $real_amount; // 支付金额
- // $bizcontent['product_code'] = 'QUICK_MSECURITY_PAY'; // 支付方式
- //
- // $request->setBizContent(json_encode($bizcontent));
- // $request->setNotifyUrl("http://" . $_SERVER['HTTP_HOST'] . "/v1.demo/alipayAop.html");
- // $result = $aop->pageExecute($request);
- // return $result;
- }
- /**
- * 生成订单号,每秒可产生9999个不重复的订单号
- * @return string
- */
- function makeOrderid(){
- $redis = think\Cache::store('default');
- $orderid = (microtime(true)*10000).substr(str_pad(mt_rand(), 6, "0", STR_PAD_BOTH), 0, 6);
- // 判断是否有同个订单号的请求还没处理完,防止因为网络问题,导致同个订单并发
- $cache_key = 'orderid:'.$orderid;
- if($redis->has($cache_key)) {
- return makeOrderid();
- }else{
- $redis->set($cache_key, $orderid, 86400);
- return 'ZFB'.$orderid;
- }
- }
- public function alipays() {
- vendor('alipay.lib.AlipayNotify');
- $alipayNotify = new \AlipayNotify(Config::get('alipay'));
- if ($result = $alipayNotify->verifyNotify()) {
- // 处理支付成功后的逻辑业务
- if (input('post.trade_status') == 'TRADE_SUCCESS') {
- //写入日志
- log_message($result,'log',LOG_PATH . '../paylog/');
- $out_trade_no = input('out_trade_no'); //订单号
- if(!empty($out_trade_no)){
- //更新订单状态处理
- $this->updateOrder($out_trade_no,input('total_fee'));
- }
- echo 'success';exit; //请不要修改或删除
- }
- echo 'fail';exit; //验证失败
- }
- echo 'fail';exit;
- }
- private function updateOrders($orderid,$real_amount='')
- {
- $payModel = new Pay;
- $payCpinfoModel = new PayCpinfo;
- $membersModel = new Members;
- $result = false;
- //消费订单信息
- $payInfo = $payModel->field('id,status,amount,real_amount,userid,gameid,channel_id')->where(['orderid'=>$orderid])->find();
- if($real_amount!='' && $payInfo['real_amount']!=$real_amount)
- {
- $result = false;
- //写入日志
- log_message('订单编号:'.$orderid.'支付金额不一致,订单状态更新失败','error',LOG_PATH . '../paylog/');
- }
- //待支付状态时
- elseif($payInfo['status']==0){
- // 启动事务
- Db::startTrans();
- try{
- $payModel->where(['id'=>$payInfo['id']])->update(['status'=>1,'pay_time'=>NOW_TIMESTAMP]);
- //cy_paycpinfo表记录状态更新
- $payCpinfoModel->where(['orderid'=>$orderid])->update(['payflag'=>1]);
- $result = true;
- // 提交事务
- Db::commit();
- } catch (\Exception $e) {
- // 回滚事务
- Db::rollback();
- $result = false;
- //写入日志
- log_message('订单编号:'.$orderid.'订单状态更新失败'.$e->getMessage(),'error',LOG_PATH . '../paylog/');
- }
- }
- //订单状态更新成功
- if($result){
- //更新member表的total_pay_amount
- $membersModel->where(['id'=>$payInfo['userid']])->update(['total_pay_amount'=>Db::raw('total_pay_amount+'.$payInfo['amount'])]);
- // 通知CP,支付成功
- (new PayCallback())->callBackToCp($orderid);
- //预警邮件
- (new PayLogic())->payWarning($payInfo['userid'], $payInfo['channel_id'], $payInfo['gameid'], $payInfo['amount']);
- }
- }
- /**
- * 支付宝Aop支付服务器异步通知页面方法
- */
- public function alipayAop() {
- //Alipay Aop Sdk支付回调
- vendor('alipayAop.AopSdk');
- $aop = new \AopClient();
- $aop->alipayrsaPublicKey = file_get_contents(Config::get('alipayAop')['alipay_public_key']);
- if ($result = $aop->rsaCheckV1($_POST, NULL, "RSA2")) {
- // 处理支付成功后的逻辑业务
- if (input('post.trade_status') == 'TRADE_SUCCESS') {
- $out_trade_no = input('out_trade_no'); //订单号
- $payData1['productname'] = "订单";
- $payData1['productdesc'] = $out_trade_no;
- Db::name("cy_demo")->insert($payData1);
- if(!empty($out_trade_no)){
- //更新订单状态处理
- $this->updateOrder($out_trade_no,input('total_fee'));
- }
- echo 'success';exit; //请不要修改或删除
- }
- echo 'fail';exit; //验证失败
- }
- echo 'fail';exit;
- }
- private function updateOrder($orderid)
- {
- Db::name("cy_demo")->where(['orderid'=>$orderid])->update(['status'=>1]);
- }
- // public function notify()
- // {
- // try{
- // $info = $_POST;
- // vendor('alipayAop.AopSdk');
- // $aop = new \AopClient();
- // $aop->alipayrsaPublicKey = file_get_contents(Config::get('alipayAop')['alipay_public_key']);
- // $flag = $aop->rsaCheckV1($info,NULL,"RSA2"); //验签
- // if(!$flag)
- // {
- // echo 'fail';exit;
- // }
- // else if($info['trade_status']=='TRADE_SUCCESS') //支付状态
- // {
- // $this->updateOrder($info['out_trade_no'],$info['total_fee']);
- // }
- // }catch (Exception $e)
- // {
- //
- // }
- //
- // }
- public function returnback()
- {
- echo "<h1>支付成功<h1>";
- halt($_GET);
- }
- public function wxpay()
- {
- $user_ip = "";
- if(isset($_SERVER['HTTP_CLIENT_IP']))
- {
- $user_ip = $_SERVER['HTTP_CLIENT_IP'];
- }
- else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
- {
- $user_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
- }else
- {
- $user_ip = $_SERVER['REMOTE_ADDR'];
- }
- $orderid = makeOrderid();
- $real_amount = 0.01;
- $productname = "产品";
- $productdesc = "产品";
- $wxsmParam = $this->getWxWapsmPostAopParam($orderid,$real_amount,$productname,$productdesc,$user_ip);
- $result = ['wxpaysm_param'=>$wxsmParam];
- $this->jsonResult($result, 1, '订单生成成功',false);
- //print_r($result);die;
- }
- private function getWxWapsmPostAopParam($orderid,$real_amount,$productname,$productdesc='',$user_ip='127.0.0.1')
- {
- //获取用户IP
- $user_ip = $user_ip;
- $version = "1";
- $agent_id = Config::get('wxwappay-h5')['mch_id'];//商户编号,(汇付宝商户内码:七位整数数字)
- $sign_key = Config::get('wxwappay-h5')['key'];
- $notify_url = Config::get('wxwappay-h5')['notify_url'];//支付后返回的商户处理页面,URL参数是以http://或https://开头的完整URL地址(后台处理),提交的url地址必须外网能访问到,否则无法通知商户。值可以为空,但不可以为null。
- $scene = "qr";//支付方式,h5表示h5,qr表示扫码(如支付类型为扫码,payment_mode传UnifiedOrder返回二维码url),jsapi表示公众号(微信内拉起),app表示app拉起支付(值均为小写)
- $pay_type = "30";//支付类型30
- $agent_bill_id = $orderid;//商户系统内部的订单号(要保证唯一)
- $agent_bill_time = date('YmdHis', time());//提交单据的时间yyyyMMddHHmmss,该参数共计14位,当时不满14位时,在后面加0补足14位
- $pay_amt = 0.01;//订单总金额 不可为空。小数点后保留两位
- $return_url = Config::get('wxwappay-h5')['return_url']."?URLscheme=yiyouweixin";//支付后返回的商户显示页面,URL参数是以http://或https://开头的完整URL地址(前台显示),原则上该参数与notify_url提交的参数不一致。值可以为空,但不可以为null。
- $user_ip = str_replace(".","_",$user_ip);//用户所在客户端的真实ip其中的“.”替换为“_” 。因为近期我方发现用户在提交数据时,user_ip在网络层被篡改,导致签名错误,所以我们规定使用这种格式。
- $goods_name = "产品";//商品名称,不能为空(不参加签名)
- $goods_name=iconv("UTF-8", "gbk", $goods_name);
- $remark = "";//商户自定义,原样返回,可以为空。
- $goods_note = "";
- $payment_mode = "cashier";//收银台=cashier,接口=UnifiedOrder(目前支持扫码,app)
- $n = "南京麻花网络";
- $fileName=iconv("UTF-8", "gbk", $n);
- $strs='{"s":"WAP","n":"'.$fileName.'","id":"http://46yx.com"}';
- $str = base64_encode($strs);
- $meta_option =urlencode($str);//加密后的结果
- $bank_card_type = "-1";//银行类型:未知=-1,储蓄卡=0,信用卡=1。
- $timestamp = "";//时间戳,传了订单有效时间上下1min,从1970年1月1日0时到现在的毫秒数,传了参与签名,签名位置在key前面。
- $sign_type = "MD5";//签名类型,MD5\RSA\RSA2
- $data['version']=$version;
- $data['scene']=$scene;
- $data['payment_mode']=$payment_mode;
- $data['agent_id']=$agent_id;
- $data['agent_bill_id']=$agent_bill_id;
- $data['agent_bill_time']=$agent_bill_time;
- $data['pay_type']=$pay_type;
- $data['pay_amt']=$pay_amt;
- $data['notify_url']=$notify_url;
- $data['return_url']=$return_url;
- $data['user_ip']=$user_ip;
- $data['goods_name']=$goods_name;
- $data['goods_note']=$goods_note;
- $data['remark']=$remark;
- $data['meta_option']=$meta_option;
- $data['bank_card_type']=$bank_card_type;
- $sign_str = '';
- $sign_str = $sign_str.'version='.$version;
- $sign_str = $sign_str.'&agent_id='.$agent_id;
- $sign_str = $sign_str.'&agent_bill_id='.$agent_bill_id;
- $sign_str = $sign_str.'&agent_bill_time='.$agent_bill_time;
- $sign_str = $sign_str.'&pay_type='.$pay_type;
- $sign_str = $sign_str.'&pay_amt='.$pay_amt;
- $sign_str = $sign_str.'¬ify_url='.$notify_url;
- $sign_str = $sign_str.'&return_url='.$return_url;
- $sign_str = $sign_str.'&user_ip='.$user_ip;
- $sign_str = $sign_str.'&bank_card_type='.$bank_card_type;
- $sign_str = $sign_str.'&remark='.urlencode($remark);
- $sign_str = $sign_str.'&key='.$sign_key;
- $sign = md5($sign_str); ////MD5\RSA\RSA2签名结果
- $data['sign']=$sign;
- $urls = Config::get('wxwappay-h5')['pay_url'];
- $response = $this->postXmlCurl($data,$urls);
- $redirectUrl = "";
- if(!empty($response))
- {
- if($response['ret_code'] == '0000')
- {
- $redirectUrl = $response['redirectUrl'];
- $ret_code = $response['ret_code'];
- $ret_msg = $response['ret_msg'];
- $hf_sign = md5('redirectUrl='.$redirectUrl.'&ret_code='.$ret_code.'&ret_msg='.$ret_msg.'&key='.$sign_key);
- if($hf_sign != $response['sign'])
- {
- $this->jsonResult('', 0, '订单生成失败',false);
- }
- }else{
- $this->jsonResult('', 0, '订单生成失败',false);
- }
- }else{
- $this->jsonResult('', 0, '订单生成失败',false);
- }
- $pay_return['mweb_url'] = $redirectUrl;
- $pay_return['referer'] = Config::get('wxpay-h5')['referer'];
- return $pay_return;
- }
- // public function wx()
- // {
- //
- // //获取用户IP
- // $user_ip = "";
- // if(isset($_SERVER['HTTP_CLIENT_IP']))
- // {
- // $user_ip = $_SERVER['HTTP_CLIENT_IP'];
- // }
- // else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
- // {
- // $user_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
- // }else
- // {
- // $user_ip = $_SERVER['REMOTE_ADDR'];
- // }
- //
- // $version = "1";
- // $agent_id = Config::get('wxwappay-h5')['mch_id'];//商户编号,(汇付宝商户内码:七位整数数字)
- // $sign_key = Config::get('wxwappay-h5')['key'];
- //// $agent_id = "2083328";//商户编号,(汇付宝商户内码:七位整数数字)
- //// $sign_key = "852B4A10455E49F280EEFCB1";
- // $notify_url = "http://" . $_SERVER['HTTP_HOST'] . "/v1.demo/wxnotify.html";//支付后返回的商户处理页面,URL参数是以http://或https://开头的完整URL地址(后台处理),提交的url地址必须外网能访问到,否则无法通知商户。值可以为空,但不可以为null。
- // $scene = "qr";//支付方式,h5表示h5,qr表示扫码(如支付类型为扫码,payment_mode传UnifiedOrder返回二维码url),jsapi表示公众号(微信内拉起),app表示app拉起支付(值均为小写)
- // $pay_type = "30";//支付类型30
- // $agent_bill_id = makeOrderid();//商户系统内部的订单号(要保证唯一)
- // $agent_bill_time = date('YmdHis', time());//提交单据的时间yyyyMMddHHmmss,该参数共计14位,当时不满14位时,在后面加0补足14位
- // $pay_amt = 0.01;//订单总金额 不可为空。小数点后保留两位
- // $return_url = "http://" . $_SERVER['HTTP_HOST'] . "/v1.demo/wxreturn.html";//支付后返回的商户显示页面,URL参数是以http://或https://开头的完整URL地址(前台显示),原则上该参数与notify_url提交的参数不一致。值可以为空,但不可以为null。
- // $user_ip = str_replace(".","_",$user_ip);//用户所在客户端的真实ip其中的“.”替换为“_” 。因为近期我方发现用户在提交数据时,user_ip在网络层被篡改,导致签名错误,所以我们规定使用这种格式。
- // $goods_name = "产品名称";//商品名称,不能为空(不参加签名)
- // $goods_name=iconv("UTF-8", "gbk", $goods_name);
- // $remark = "";//商户自定义,原样返回,可以为空。
- // $goods_note = "";
- // $payment_mode = "cashier";//收银台=cashier,接口=UnifiedOrder(目前支持扫码,app)
- //
- // $n = "南京麻花网络";
- // $fileName=iconv("UTF-8", "gbk", $n);
- // $strs='{"s":"WAP","n":"'.$fileName.'","id":"http://46yx.com"}';
- // $str = base64_encode($strs);
- // $meta_option =urlencode($str);//加密后的结果
- //
- // $bank_card_type = "-1";//银行类型:未知=-1,储蓄卡=0,信用卡=1。
- // $timestamp = "";//时间戳,传了订单有效时间上下1min,从1970年1月1日0时到现在的毫秒数,传了参与签名,签名位置在key前面。
- // $sign_type = "MD5";//签名类型,MD5\RSA\RSA2
- //
- // $sign_str = '';
- // $sign_str = $sign_str.'version='.$version;
- // $sign_str = $sign_str.'&agent_id='.$agent_id;
- // $sign_str = $sign_str.'&agent_bill_id='.$agent_bill_id;
- // $sign_str = $sign_str.'&agent_bill_time='.$agent_bill_time;
- // $sign_str = $sign_str.'&pay_type='.$pay_type;
- // $sign_str = $sign_str.'&pay_amt='.$pay_amt;
- // $sign_str = $sign_str.'¬ify_url='.$notify_url;
- // $sign_str = $sign_str.'&return_url='.$return_url;
- // $sign_str = $sign_str.'&user_ip='.$user_ip;
- // $sign_str = $sign_str.'&bank_card_type='.$bank_card_type;
- // $sign_str = $sign_str.'&remark='.urlencode($remark);
- // $sign_str = $sign_str.'&key='.$sign_key;
- // $sign = md5($sign_str); ////MD5\RSA\RSA2签名结果
- //
- //// $sign = md5('version='.$version.'&agent_id='.$agent_id.'&agent_bill_id='.$agent_bill_id.'&agent_bill_time='.$agent_bill_time.'&pay_type='.$pay_type.'&pay_amt='.$pay_amt.'¬ify_url='.$notify_url.'&return_url='.$return_url.'&user_ip='.$user_ip.'&bank_card_type='.$bank_card_type.'&remark='.$remark.'&key='.$sign_key);
- //
- // $url = "https://Pay.Heepay.com/DirectPay/applypay.aspx?version=$version&scene=$scene&payment_mode=$payment_mode&agent_id=$agent_id&agent_bill_id=$agent_bill_id&agent_bill_time=$agent_bill_time&pay_type=$pay_type&pay_amt=$pay_amt¬ify_url=$notify_url&return_url=$return_url&user_ip=$user_ip&goods_name=$goods_name&goods_note=$goods_note&remark=$remark&meta_option=$meta_option&bank_card_type=$bank_card_type&sign=$sign";
- //
- // $data['version']=$version;
- // $data['scene']=$scene;
- // $data['payment_mode']=$payment_mode;
- // $data['agent_id']=$agent_id;
- // $data['agent_bill_id']=$agent_bill_id;
- // $data['agent_bill_time']=$agent_bill_time;
- // $data['pay_type']=$pay_type;
- // $data['pay_amt']=$pay_amt;
- // $data['notify_url']=$notify_url;
- // $data['return_url']=$return_url;
- // $data['user_ip']=$user_ip;
- // $data['goods_name']=$goods_name;
- // $data['goods_note']=$goods_note;
- // $data['remark']=$remark;
- // $data['meta_option']=$meta_option;
- // $data['bank_card_type']=$bank_card_type;
- // $data['sign']=$sign;
- // $urls = Config::get('wxwappay-h5')['pay_url'];;
- //
- // $response = $this->postXmlCurl($data,$urls);
- //
- //
- // $redirectUrl = "";
- // if(!empty($response))
- // {
- // if($response['ret_code'] == '0000')
- // {
- // $redirectUrl = $response['redirectUrl'];
- // $ret_code = $response['ret_code'];
- // $ret_msg = $response['ret_msg'];
- // $hf_sign = md5('redirectUrl='.$redirectUrl.'&ret_code='.$ret_code.'&ret_msg='.$ret_msg.'&key='.$sign_key);
- // if($hf_sign != $response['sign'])
- // {
- // $this->jsonResult('', 0, '订单生成失败',false);
- // }
- // }else{
- // $this->jsonResult('', 0, '订单生成失败',false);
- // }
- // }else{
- // $this->jsonResult('', 0, '订单生成失败',false);
- // }
- // $pay_return['mweb_url'] = $redirectUrl;
- // $pay_return['referer'] = Config::get('wxpay-h5')['referer'];
- // return $pay_return;
- //
- // }
- /**
- * 将xml转为array
- * @param string $xml
- *
- * @return array
- */
- public function xmlToArray($xml)
- {
- if (!$xml) {
- return false;
- }
- $data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
- return $data;
- }
- /**
- * 作用:以post方式提交xml到对应的接口url
- *
- * @param $xml string xml的报文内容
- * @param $second int 请求的超时时间
- *
- */
- public function postXmlCurl($post_data,$url='',$second=30){
- if($url==''){
- $url = $this->url;
- }
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL, $url);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
- curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- // post数据
- curl_setopt($ch, CURLOPT_POST, 1);
- // post的变量
- curl_setopt($ch, CURLOPT_POSTFIELDS,$post_data);
- //执行请求
- $output = curl_exec($ch);
- //打印获得的数据
- $xml = $this->xmlToArray($output);
- return $xml;
- curl_close($ch);
- }
- public function wxnotify()
- {
- echo "请求成功";
- }
- public function wxreturn()
- {
- echo "请求成功";
- }
- public function wxwebpay()
- {
- //获取用户IP
- $user_ip = "";
- if(isset($_SERVER['HTTP_CLIENT_IP']))
- {
- $user_ip = $_SERVER['HTTP_CLIENT_IP'];
- }
- else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
- {
- $user_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
- }else
- {
- $user_ip = $_SERVER['REMOTE_ADDR'];
- }
- $version = "1";
- $agent_id = Config::get('wxwappay-h5')['mch_id'];//商户编号,(汇付宝商户内码:七位整数数字)
- $sign_key = Config::get('wxwappay-h5')['key'];
- // $agent_id = "2083328";//商户编号,(汇付宝商户内码:七位整数数字)
- // $sign_key = "852B4A10455E49F280EEFCB1";
- $notify_url = "http://" . $_SERVER['HTTP_HOST'] . "/v1.demo/wxnotify.html";//支付后返回的商户处理页面,URL参数是以http://或https://开头的完整URL地址(后台处理),提交的url地址必须外网能访问到,否则无法通知商户。值可以为空,但不可以为null。
- $scene = "qr";//支付方式,h5表示h5,qr表示扫码(如支付类型为扫码,payment_mode传UnifiedOrder返回二维码url),jsapi表示公众号(微信内拉起),app表示app拉起支付(值均为小写)
- $pay_type = "30";//支付类型30
- $agent_bill_id = makeOrderid();//商户系统内部的订单号(要保证唯一)
- $agent_bill_time = date('YmdHis', time());//提交单据的时间yyyyMMddHHmmss,该参数共计14位,当时不满14位时,在后面加0补足14位
- $pay_amt = 0.01;//订单总金额 不可为空。小数点后保留两位
- $return_url = "http://" . $_SERVER['HTTP_HOST'] . "/v1.demo/wxreturn.html";//支付后返回的商户显示页面,URL参数是以http://或https://开头的完整URL地址(前台显示),原则上该参数与notify_url提交的参数不一致。值可以为空,但不可以为null。
- $user_ip = str_replace(".","_",$user_ip);//用户所在客户端的真实ip其中的“.”替换为“_” 。因为近期我方发现用户在提交数据时,user_ip在网络层被篡改,导致签名错误,所以我们规定使用这种格式。
- $goods_name = "产品名称";//商品名称,不能为空(不参加签名)
- $remark = "";//商户自定义,原样返回,可以为空。
- $goods_note = "";
- $payment_mode = "cashier";//收银台=cashier,接口=UnifiedOrder(目前支持扫码,app)
- $n = "南京麻花网络";
- $fileName=iconv("UTF-8", "gbk", $n);
- $strs='{"s":"WAP","n":"'.$fileName.'","id":"http://46yx.com"}';
- $str = base64_encode($strs);
- $meta_option =urlencode($str);//加密后的结果
- $bank_card_type = "-1";//银行类型:未知=-1,储蓄卡=0,信用卡=1。
- $timestamp = "";//时间戳,传了订单有效时间上下1min,从1970年1月1日0时到现在的毫秒数,传了参与签名,签名位置在key前面。
- $sign_type = "MD5";//签名类型,MD5\RSA\RSA2
- $sign_str = '';
- $sign_str = $sign_str.'version='.$version;
- $sign_str = $sign_str.'&agent_id='.$agent_id;
- $sign_str = $sign_str.'&agent_bill_id='.$agent_bill_id;
- $sign_str = $sign_str.'&agent_bill_time='.$agent_bill_time;
- $sign_str = $sign_str.'&pay_type='.$pay_type;
- $sign_str = $sign_str.'&pay_amt='.$pay_amt;
- $sign_str = $sign_str.'¬ify_url='.$notify_url;
- $sign_str = $sign_str.'&return_url='.$return_url;
- $sign_str = $sign_str.'&user_ip='.$user_ip;
- $sign_str = $sign_str.'&key='.$sign_key;
- $sign = md5($sign_str); ////MD5\RSA\RSA2签名结果
- // $sign = md5('version='.$version.'&agent_id='.$agent_id.'&agent_bill_id='.$agent_bill_id.'&agent_bill_time='.$agent_bill_time.'&pay_type='.$pay_type.'&pay_amt='.$pay_amt.'¬ify_url='.$notify_url.'&return_url='.$return_url.'&user_ip='.$user_ip.'&bank_card_type='.$bank_card_type.'&remark='.$remark.'&key='.$sign_key);
- $url = "https://Pay.Heepay.com/DirectPay/applypay.aspx?version=$version&agent_id=$agent_id&agent_bill_id=$agent_bill_id&agent_bill_time=$agent_bill_time&pay_type=$pay_type&pay_amt=$pay_amt¬ify_url=$notify_url&return_url=$return_url&user_ip=$user_ip&goods_name=$goods_name&goods_num=1&goods_note=$goods_note&remark=$remark&sign=$sign";
- $data['version']=$version;
- $data['agent_id']=$agent_id;
- $data['agent_bill_id']=$agent_bill_id;
- $data['agent_bill_time']=$agent_bill_time;
- $data['pay_type']=$pay_type;
- $data['pay_amt']=$pay_amt;
- $data['notify_url']=$notify_url;
- $data['return_url']=$return_url;
- $data['user_ip']=$user_ip;
- $data['goods_name']=$goods_name;
- $data['goods_num']=1;
- $data['goods_note']=$goods_note;
- $data['remark']=$remark;
- $data['sign']=$sign;
- $urls = "https://pay.heepay.com/Payment/Index.aspx?";
- $response = $this->postXmlCurl($data,$urls);
- print_r($response);die;
- }
- }
|