先要有微信公衆號,從公衆號左側菜單進入微信支付,要先申請微信支付,申請經過以後,便可使用,涉及到2個後臺:公衆號後臺和支付平臺後臺php
首先要獲得AppID(應用ID)和AppSecret(應用密鑰),獲取方法:公衆號後臺左側菜單:開發-基本配置,顯示密鑰須要管理者的微信號掃描驗證,另外要獲取MCHID商戶號(經過支付平臺左側菜單-帳戶信息能夠看到)和KEY支付密鑰https://pay.weixin.qq.com/index.php/account/api_cert,須要綁定手機號的短信驗證html
配置好支付受權目錄、測試受權目錄、測試白名單(就是測試者的我的微信號),設置方式:公衆號後臺左側菜單-微信支付-開發配置,注意:通常在網頁上使用掃描支付的模式二(模式二先生成訂單再生成二維碼且只有2小時的時效性,模式一是先生成二維碼,當用戶掃描的時候才生成訂單,適用戶外廣告投放等一次性顯示沒法改變的支付二維碼,由於只須要一個產品id便可生成二維碼,需在後臺設置回調URL,以供當用戶掃描二維碼時用來生成訂單,參考https://www.v2ex.com/t/239674),因此下方的掃碼支付回調url能夠忽略;受權目錄必須到最底層目錄ajax
到支付商戶平臺登陸,能夠查看到對應交易記錄,並設置退款等操做,集成掃碼付的時候無需用到數據庫
獲取官方的sdk示例:公衆號後臺左側菜單-微信支付-使用教程,選擇對應的支付方式獲取便可,對應掃碼支付,後面選擇模式二來集成開發api
下載sdk後,裏面有好幾種模式,index.php中已經有連接,選擇對應的支付方式便可看到效果,示例中的綁定的帳戶是微信官方測試帳戶,生成二維碼的地址使用了在線地址,而非在本地服務器
先修改對應的appid、secret、回調地址(就是支付成功後,微信服務器來訪問該地址,並帶着是否支付成功的參數,這個地址須要判斷支付狀態,而後修改訂單),MCHID商戶號(經過支付平臺左側菜單-帳戶信息能夠看到)和KEY支付密鑰,在lib/WxPay.Config.php中,裏面有對應註釋微信
在訂單支付界面加入微信支付的二維碼供用戶手機微信掃描支付,sdk中的二維碼代碼能夠直接使用的,顯示二維碼代碼以後,該頁面需設定一個ajax去查詢訂單狀態(好比5秒/次,另外直接查詢數據庫訂單狀態也可,由於支付成功後,微信支付服務器會訪問回調地址,而回調地址會改變訂單狀態的),查詢到支付成功後,彈出對應提示或者作其餘操做便可,若是不寫ajax查詢,用戶沒法得知支付是否成功app
回調地址作對應判斷寫業務邏輯便可curl
到微信支付後臺查看交易是否成功,到此微信支付開發完成函數
注意服務器端須要curl支持,以供程序向微信支付服務器post數據
吐槽一下:官方php的sdk示例裏面各類class封裝,明顯過於封裝,繞的太厲害了
開發文檔地址:https://pay.weixin.qq.com/wiki/doc/api/index.html
其餘的坑:
調試的時候,大部分問題是出在php的curl訪問微信支付服務器這個環節,常常出現500錯誤,因此要設置錯誤信息調試,開啓log日誌,查看開啓方式,一些出錯解決方案:http://my.oschina.net/kaykay012/blog/501602,着重講一下WxPay.Api.php:修改文件WxPay.Api.php,具體以下:第537行左右:
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//嚴格校驗 修改爲: curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);//嚴格校驗2
php的sdk中使用了一些函數,須要對應php版本,好比libxml_disable_entity_loader函數須要5.2.11及以上版本支持,若是要保持在php5.2系列,請使用最新的php5.2.17
sdk中的native提示「time_expire時間太短,刷卡至少1分鐘,其餘5分鐘」,將sdk中的SetTime_expire註釋,由於這個不是必需參數,模式二默認是2小時
能夠直接使用sdk中提供的微信二維碼地址來展現二維碼,無需本身在服務器上生成二維碼,方便了很多
我的遇到最大的一個坑,sdk中將libxml_disable_entity_loader設置成了true,禁止引用外部xml實體,而我恰好在回調url地址用了外部的soap,致使soap老是失敗,解決方案是在soap前設置libxml_disable_entity_loader(false);這個問題浪費了我5個小時
總結:千萬別用官方sdk,用來參考,最好本身寫,否則命都填進去了