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 "请点击链接进行支付:点我支付"; // echo "请点击链接进行支付:点我支付"; // echo ""; } 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 "

支付成功

"; 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; } }