APP端webview內微信H5支付解決方案

NO IMAGE
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

微信已經官方支援微信外部瀏覽器的H5微信支付。但是如果是從webview中呼叫H5微信支付的話。 ios平臺上支付完成後會跳到外部的瀏覽器,而不是停留在app裡面。

關於這個問題。 就需要我們在服務端模擬請求H5微信支付的中間環節,直接拿到支付地址。這樣能避免ios webivew內微信支付成功後跳外部瀏覽器。

下面是服務端核心程式碼:

$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吊起微信支付即可。

相關文章

程式語言 最新文章