微信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] : '';
}
}