1. 程式人生 > >微信H5支付,看完這個你一定就懂了【前端】

微信H5支付,看完這個你一定就懂了【前端】

一、說在前面的話

1.微信H5支付一定要開通,沒開通就別扯淡了,它和APP支付不是一個

2.微信支付後臺一定要配置js安全域,否則支付時可能會因為地址不在該域下導致支付失敗(提示商戶引數配置錯誤,其實跟引數沒半毛關係)

3.微信的價格1是1分,所以價格total_fee引數沒有零點几几的情況。(支付寶0.01是一分)

4.微信請和返回都是XML格式,注意轉化,可以寫個公共方法

5.你可以設定支付成功後的回撥頁面,但是:要對整個回撥redirect_url進行urlencode處理

別特麼只知道處理域名,不管引數

二、直接上程式碼(按照步驟加解讀,自己抽離相關方法)

1.整理所有H5支付的引數,陣列格式

$scene = ['h5_info' => ['type' => 'h5_info', 'app_name' => 'H5支付', 'package_name' => 'baoming']];//這個引數一定要加
$scene = json_encode($scene);
$param = [ 
    'appid'=>$config['appid'],//產品ID
    'mch_id'=>$config['mch_id'],//商戶ID
    'nonce_str'=> $nonce_str,//16位隨機數
    'body'=>'點購買',
    'out_trade_no' => $oid,//訂單ID
    'total_fee'=> $price,//價格
    'spbill_create_ip'=>\S\Util\Ip::getClientIp(),//真實ID
    'notify_url'=>$notify_url,//微信通知你支付結果的介面
    'trade_type'=> 'MWEB',//一定是這個值
    'scene_info'=> $scene,//資訊,其實這個引數是必須的
];  
ksort($param);
$str = ''; 
foreach ($param as $key=>$value){
     $str .= $key.'='.$value.'&';
}   
$sign_str = $str.'key='.$config['key'];
$sign = strtoupper(md5($sign_str));
$param['sign'] = $sign;//生成規定的sign校驗值
$post_data = $this->arrayToXml($param);//生成微信要求的XML格式
return $this->doPay($post_data);//返回結果

2.將所有的引數格式整理為XML格式(對應上文中的函式)

    public function arrayToXml($arr){
        $xml = "<xml>";
        foreach ($arr as $key=>$val){
            if(is_numeric($val)){
                $xml.="<".$key.">".$val."</".$key.">";
            }else{
                $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
            }
        }
        $xml.="</xml>";
        return $xml;
    }

3.請求支付,並返回結果(XML結果,需要處理下格式,我的函式中已經處理)

    public function doPay($data) {      
        $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
        $ch = curl_init();     
        curl_setopt($ch, CURLOPT_TIMEOUT, 30000);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,FALSE);
        curl_setopt($ch, CURLOPT_HEADER, FALSE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch, CURLOPT_POST, TRUE);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        $res = curl_exec($ch); 
        curl_close($ch);  
        //處理XML
        libxml_disable_entity_loader(true);
        $data = json_decode(json_encode(simplexml_load_string($res, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
        \S\Log\Logger::getInstance()->info(array(json_encode($data),'微信生成prepayid'));
        return $data['return_code'] == 'SUCCESS' ? $data['mweb_url'] : '';//返回的時,H5中調起微信支付的連結地址
    }