微信H5统一下单和查询接口;
//需要注意的是 notify_url 在laravel中是要以.php存在的不能是 pay.xiegaosheng.com/notify
namespace App\Http\Controllers; use Illuminate\Http\Request; class H5payController extends Controller { public function pay(Request $request) { $appid = $request->input('appid'); $mch_id = $request->input('mch_id'); $key = $request->input('key'); $callback = $request->input('callback'); $request->session()->put('callback',$callback); $ip = $request->input('ip'); $notify_url = 'http://pay.xiegaosheng.com/notify.php'; $total_fee = $request->input('total_fee'); $mac = $request->input('mac'); $place_id = $request->place_id; //$ip = $this->get_client_ip(); $attach = '支付测试'; $body = 'H5支付测试'; $nonce_str = $this->getStr(18); $out_trade_no = $request->input('order_no'); //$out_trade_no = date('YmdHis').$this->getStr(16); $trade_type = 'MWEB'; //$key = '1us2j491FJ3bg8HFs90KsejxT6Fq8Jk5'; $scene_info ='{"h5_info": {"type":"IOS","app_name": "H5测试","package_name": "com.tencent.tmgp.sgame"}}'; //场景信息 $signA = "appid=$appid&attach=$attach&body=$body&mch_id=$mch_id&nonce_str=$nonce_str¬ify_url=$notify_url&out_trade_no=$out_trade_no&scene_info=$scene_info&spbill_create_ip=$ip&total_fee=$total_fee&trade_type=MWEB"; $strSignTmp = $signA."&key=$key"; //拼接字符串 $sign = strtoupper(MD5($strSignTmp)); // MD5 后转换成大写 $xml = <<<xml <xml> <appid>$appid</appid> <attach>{$attach}</attach> <body>{$body}</body> <mch_id>$mch_id</mch_id> <nonce_str>$nonce_str</nonce_str> <notify_url>$notify_url</notify_url> <out_trade_no>$out_trade_no</out_trade_no> <spbill_create_ip>$ip</spbill_create_ip> <total_fee>$total_fee</total_fee> <trade_type>$trade_type</trade_type> <scene_info>$scene_info</scene_info> <sign>$sign</sign> </xml> xml; // echo $xml;exit; $url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; $data = $this->http_post($url,$xml); $objectxml = (array)simplexml_load_string($data,'SimpleXMLElement',LIBXML_NOCDATA); //将微信返回的XML 转换成数组 $urlencode = urlencode("http://pay.xiegaosheng.com/verify?mac=$mac&order_no=$out_trade_no&&place_id=$place_id&callback=$callback"); if ($objectxml['return_code']=='SUCCESS') { # code... $objectxml['mweb_url'] .= '&redirect_url='.$urlencode; }else{ $objectxml['mweb_url']=''; } //dd($objectxml); return $objectxml; //return view('pay',['url'=>$objectxml]); } public function http_post($url, $data) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_HEADER,0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $res = curl_exec($ch); curl_close($ch); return $res; } //验证订单号是否存在 public function verify(Request $request) { $token = md5('wifi'.date('Y-m-d H')); $place_id = $request->place_id; $url = "http://pay.xiegaosheng.com/getplace?id=$place_id&token=$token"; //echo $url;exit; $json = $this->http_get($url); if ($json !='fail') { # code... $param = json_decode($json,true); $appid = $param['appid']; $mch_id = $param['mch_id']; $key = $param['key']; }else{ die('参数错误'); } $nonce_str = $this->getStr(18); $out_trade_no = $request->order_no; $signA = "appid=$appid&mch_id=$mch_id&nonce_str=$nonce_str&out_trade_no=$out_trade_no"; $strSignTmp = $signA."&key=$key"; //拼接字符串 $sign = strtoupper(MD5($strSignTmp)); // MD5 后转换成大写 $xml = <<<xml <xml> <appid>$appid</appid> <mch_id>$mch_id</mch_id> <nonce_str>$nonce_str</nonce_str> <out_trade_no>$out_trade_no</out_trade_no> <sign>$sign</sign> </xml> xml; //查询订单 $url='https://api.mch.weixin.qq.com/pay/orderquery'; $data = $this->http_post($url,$xml); $objectxml = (array)simplexml_load_string($data,'SimpleXMLElement',LIBXML_NOCDATA); //将微信返回的XML 转换成数组 $callback = $request->input('callback'); //echo $callback;exit; if ($objectxml['return_code']=='SUCCESS' && $objectxml['result_code']=='SUCCESS' && $objectxml['trade_state']=='SUCCESS') { $callback .="?order_no=$out_trade_no&status=1&type=2"; header("Location: $callback");exit; }else{ $callback .="?order_no=$out_trade_no&status=2&type=2"; header("Location: $callback");exit; } } //随机字符串 public function getStr($length) { $key= ''; $pattern = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLOMNOPQRSTUVWXYZ'; for($i=0;$i<$length;$i++) { $key .= $pattern{mt_rand(0,35)}; //生成php随机数 } return $key; } //发送http请求 public function http_get($url, $data='') { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_HEADER,0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 3); $res = curl_exec($ch); curl_close($ch); return $res; } //获取ip地址 public function get_client_ip() { if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) { $ip = getenv('HTTP_CLIENT_IP'); } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) { $ip = getenv('HTTP_X_FORWARDED_FOR'); } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) { $ip = getenv('REMOTE_ADDR'); } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) { $ip = $_SERVER['REMOTE_ADDR']; } return preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : ''; } }