微信已經官方支持微信外部瀏覽器的H5微信支付。可是若是是從webview中調用H5微信支付的話。 ios平臺上支付完成後會跳到外部的瀏覽器,而不是停留在app裏面。php
關於這個問題。 就須要咱們在服務端模擬請求H5微信支付的中間環節,直接拿到支付地址。這樣能避免ios webivew內微信支付成功後跳外部瀏覽器。ios
下面是服務端核心代碼:web
$input = new \WxPayUnifiedOrder(); $input->SetBody($i['product_name']); //商品描述 $input->SetAttach('abc'); //附加數據,在查詢API和支付通知中原樣返回 $input->SetOut_trade_no($i['qqes_order']); //要求32個字符內,只能是數字、大小寫字母_-|*@ $input->SetTotal_fee($i['fee'] * 100); //訂單總金額,單位爲分 $input->SetNotify_url($this->notifyUrl); $input->SetTrade_type("MWEB"); //網頁版 $order = \WxPayApi::unifiedOrder($input); if( ! isset($order['mweb_url']) ){ throw new SdkException('微信統一下單失敗'); } $payUrl = $order['mweb_url']; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $payUrl); if (strpos($payUrl, 'https') === 0) { curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); } $headers['CLIENT-IP'] = $_SERVER['REMOTE_ADDR']; $headers['X-FORWARDED-FOR'] = $_SERVER['REMOTE_ADDR']; $headerArr = array(); foreach( $headers as $n => $v ) { $headerArr[] = $n . ':' . $v; } curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch, CURLOPT_HTTPHEADER , $headerArr ); //構造IP curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); // 鏈接超時(秒) //微信那邊填的微信受權域 curl_setopt ($ch, CURLOPT_REFERER, 'http://www.example.com' ); curl_setopt($ch, CURLOPT_TIMEOUT, 5); // 執行超時(秒) $outPut = curl_exec($ch); if($outPut === false){ echo curl_error($ch);die; } curl_close($ch); //匹配出支付連接 preg_match('/weixin(.*)"/', $outPut, $match); if( ! isset($match[1]) ){ throw new SdkException('沒法獲取支付連接:' . $outPut); } $clientPayUrl = 'weixin' . $match[1]; header('Location:' . $clientPayUrl);
服務端處理完成後,直接跳轉從定向到支付最終url。 而後app端攔截這個url吊起微信支付便可。瀏覽器