在支付前,如果使用第三方MVC框架,則使用重寫模式,服務器也需要配置該項
if (!-e $request_filename){ rewrite ^/(.*)$ /index.php/$1 last; }
微信公眾號支付
1. 登錄 微信公眾平台 ;
2. 點擊左邊菜單里面的微信支付
查看相關商戶號,確定該公眾號支付針對由哪個商戶號進行收款;
3. 登錄步驟2中的商戶平台,點擊產品中心,開啟支付產品-公眾號支付(如果已開通可以忽略該步驟);
4. 繼續點擊商戶平台->產品中心->開發配置,確定商戶號是否和即將開發的公眾號支付一致。查看支付配置->公眾號支付
添加相應的JSAPI授權目錄,添加規則具體參見:微信公眾號支付開發當前URL未注冊解決辦法
5. 回到公眾平台,設置->公眾號設置->功能設置,添加JS接口安全域名和網頁授權域名;
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <h1>openId : {$openId}</h1> <button style="width:210px; height:50px; border-radius: 15px;background-color:#FE6714; border:0px #FE6714 solid; cursor: pointer; color:white; font-size:16px;" type="button" onclick="callpay()" >立即支付</button> <script type="text/javascript"> function callpay(){ if (typeof WeixinJSBridge == "undefined"){ if( document.addEventListener ){ document.addEventListener('WeixinJSBridgeReady', jsApiCall, false); }else if (document.attachEvent){ document.attachEvent('WeixinJSBridgeReady', jsApiCall); document.attachEvent('onWeixinJSBridgeReady', jsApiCall); } }else{ jsApiCall(); } } //調用微信JS api 支付 function jsApiCall(){ WeixinJSBridge.invoke( 'getBrandWCPayRequest', <?php echo $jsApiParameters; ?>, function(res){ WeixinJSBridge.log(res.err_msg); alert(res.err_code+res.err_desc+res.err_msg); } ); } </script> <script type="text/javascript"> //獲取共享地址 function editAddress() { WeixinJSBridge.invoke( 'editAddress', <?php echo $editAddress; ?>, function(res){ var value1 = res.proviceFirstStageName; var value2 = res.addressCitySecondStageName; var value3 = res.addressCountiesThirdStageName; var value4 = res.addressDetailInfo; var tel = res.telNumber; alert(value1 + value2 + value3 + value4 + ":" + tel); } ); } window.onload = function(){ if (typeof WeixinJSBridge == "undefined"){ if( document.addEventListener ){ document.addEventListener('WeixinJSBridgeReady', editAddress, false); }else if (document.attachEvent){ document.attachEvent('WeixinJSBridgeReady', editAddress); document.attachEvent('onWeixinJSBridgeReady', editAddress); } }else{ editAddress(); } }; </script> </body> </html>
微信H5支付
H5支付是指商戶在微信客戶端外的移動端網頁展示商品或服務,用戶在前述頁面確認使用微信支付時,商戶發起本服務呼起微信客戶端進行支付。
主要用於觸屏版的手機瀏覽器請求微信支付的場景。可以方便的從外部瀏覽器喚起微信支付。
提醒:H5支付不建議在APP端使用,如需要在APP中使用微信支付,請接APP支付,文檔詳見微信支付開發文檔。
申請入口:登錄商戶平台-->產品中心-->我的產品-->支付產品-->H5支付
https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_5
1. 登錄商戶平台,查看開發配置->查看商戶號和H5支付域名。
2. 登錄開發平台,確定APPID,APPID必須是移動應用中所使用的APPID
更正:APPID 可以是公眾號ID,注意是
3. 查看相關的商戶號、和支付KEY(用於簽名)。查看key步驟:商戶平台->賬戶中心->賬戶設置->API安全->然后在該頁的“API密鑰”部分,點擊“設置密鑰”,可以看到密鑰內容,該密鑰就是我們需要的“支付Key”。本步操作只能在開發階段、產品沒有上線前操作,產品上線后切忌點擊“設置密鑰”,否則會影響線上的支付功能。
4. 調用統一下單即可得到 mweb_url ,打開支付窗口,進行支付。統一下單接口請參考https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_20&index=1
5. 可以對 mweb_url 進行設置重定向頁面
// 判斷是否統一下單成功 if($result['return_code'] != 'SUCCESS'){ throw new PayException("統一下單失敗:".$result['return_msg'], 320); } // 判斷是否存在重定向界面 if(WxH5Config::REDIRECT_URL !== ""){ $result['mweb_url'] = $result['mweb_url']."&redirect_url=".urlencode(WxH5Config::REDIRECT_URL."?out_trade_no=".$inputObj['out_trade_no']); }
補充:redirect_url 必須是當前域名下指定的地址,比如發起支付H5域名是domain,重定向頁面地址最好是domain,否則未配置的情況下會報商家存在未配置的參數,請聯系商家解決
6. 支付成功或者取消或者失敗都會重定向 redirect_url 地址,支付成功會異步執行通知notify_url。
微信APP支付
1. 登錄開發平台,查看APPID;
2. 登錄商戶平台,查看對應的商戶號;
3. 密匙KEY同微信H5支付步驟3;
4. 然后調用APP統一下單;
注意:
1. 解決微信App支付服務端,App上提示“商戶支付下單id非法”
統一下單接口,返回的字段名是“prepay_id”
調起支付接口,傳入的字段名是“prepayid”
坑爹的微信支付!!
同時呼吁大家一定要養成命名規范。。。
2.關於微信APP支付,提示支付驗證簽名失敗
最近做微信APP支付,在“統一下單”里加簽沒有問題,調用成功,但是在 “調起支付”后卻提示 支付驗證簽名失敗。
先說一下請求的參數,參數一共有七個:
prepayid(統一下單里返回的標識符),
partnerid(商戶號),
appid,
package(微信要求必須有,內容是“Sign=WXPay”),
noncestr(隨機數,不適用微信返回的,是重新生成一個,注意統一下單里的參數是nonce_str),
timestamp(時間戳,十位,注意統一下單里的時間是完整的時間,這里是時間戳),
sign(簽名,將上述字段重新簽名,而不是用統一下單返回的sign)。
這個問題折磨了我一上午,以為統一下單里簽名沒問題,那么調起支付就不會在加簽上出錯,最后用微信的簽名生成工具對比了一下簽名結果發現 程序生成的簽名與官網生成的不一樣,然后把簽名過程輸出了下,發現 package 這里出現了問題。
Sign=WXPay,我在加簽里對內容進行了utf-8編碼,而恰巧,一不小心 “=” 也參與了編碼,於是 就變成了 Sign%3DWXPay,然后 錯誤的package進行了錯誤的加簽,導致簽名出錯。
解決方案:在加簽過程里修改,如果map匹配到 package,那么map的值不參與編碼。官方簽名校驗工具地址:https://pay.weixin.qq.com/wiki/tools/signverify/。
(吐槽一句,微信支付的文檔真是一團糟,要啥啥沒有,找啥找不到,而且還出現了 多個標准。當然,也可能是我水平太差。。)
5. 支付完成,等待通知回調。
總結:其實微信支付三種形式 JSAPI 、 MWEB 、 APP 大同小異,基本的步驟都是根據統一下單,然后進行調取微信支付(在微信支付時,JSAPI會直接回調到當前頁面(支付成功失敗取消),MWEB需要指定重定向地址(支付成功失敗取消),APP就需要SDK回調了(支付成功失敗取消),這三種形式都會有通知回調來處理(支付成功)邏輯)。將坑都寫出來,希望能告誡初做微信支付者不要踩啊。。。
補充:微信掃碼支付
公眾號支付是手機端的微信公眾號H5頁面支付,這種支付方式必須是在微信內置瀏覽器發起。
掃碼支付分為模式一和模式二,模式一主要為線下服務,該模式是先掃碼,再生成訂單,商戶先為自己的商品生成二維碼連接,然后用戶掃碼之后決定是否購買,二維碼無過期時間,比如自動售賣機大多采用這種模式;模式二主要為線上電商服務,用戶選擇商品后生成訂單,根據訂單生成二維碼,然后支付,該二維碼為臨時二維碼。
申請入口:登錄商戶平台-->產品中心-->我的產品-->支付產品-->掃碼支付
設置掃碼支付回調鏈接:登錄商戶平台-->產品中心-->開發配置
采用模式二:
$param->appid = $this->wxConfig[$business_code]['APP_ID']; $param->mch_id = $this->wxConfig[$business_code]['MCH_ID']; $param->nonce_str = $this->getNonceStr(); $param->body = "xxx"; $param->notify_url = $this->wxConfig[$business_code]['notify_url']; $param->trade_type = 'NATIVE'; $param->sign = $this->MakeSign($param->getParam()); $xml = $this->ToXml($param->getParam()); $response = $this->postXmlCurl($xml,WxConf::UNIFIEDOR_ORDER_URL,false,6); return $this->FromXml($response);
統一下單后會生成一個 code_url : weixin://wxpay/bizpayurl?pr=DBJQsA6
利用第三方二維碼工具生成二維碼
最好掃碼進行支付回調OK
