支付主要分為幾個步驟:
前端攜帶支付需要的資料(商品id,購買數量等)發起支付請求 後端在接收到支付請求後,處理支付資料,然後攜帶處理後的資料請求 微信伺服器 的 支付統一下單接口 後端接收到上一步請求微信伺服器的傳回資料,再次處理,然後傳回前端讓前端可以開始支付。 前端進行支付動作 前端支付完成後,微信伺服器會向後端發送支付通知(也就是微信要告訴你客戶已經付過錢了),後端根據這個通知确定支付完成,然後就去做支付完成後的相應動作,比如修改訂單狀态,添加交易日志啊等等。
下面就詳細的說明一下各個步驟的具體實作。
微信規定的請求資料:
這需要較多代碼實作。因為需要的資料個數較多,而且還需要加密并以 XML 格式發送。
首先,有以下資料是使用小程式支付必須提供給微信伺服器的參數。
小程式 appid。寫小程式的大概沒有不知道這個的。。。 商戶号 mch_id 。申請開通微信支付商戶認證成功後微信發給你的郵件裡有 商戶訂單号 out_trade_no 。商戶為這次支付生成的訂單号 總金額 total_fee 。訂單總金額,很重要的一點是機關是分,要特别注意。 微信伺服器回調通知接口位址 notify_url。微信确認錢已經到賬後,會往這個位址多次發送消息,告訴你顧客已經付完錢了,你需要傳回消息給微信表示你已經收到了通知。。這個位址不能有端口号,同時要能直接接受POST方法請求。 交易類型 trade_type 。微信小程式支付此值統一為 JSAPI 商品資訊 Body。類似"騰訊-遊戲"這種格式 終端IP位址 spbill_create_ip 。終端位址IP,也就是請求支付的 IP 位址。 随機字元串 nonce_str 。需要後端随機生成的字元串用于保證資料安全。微信要求不長于32位。 簽名 sign 。使用上面的所有參數進行相應處理加密生成簽名。(具體處理方式可見下文代碼,可直接複用。)
微信伺服器在接收到支付資料之後,如果資料沒有問題,其會傳回用于支付的相應資料,其中非常重要的是 名稱為 prepay_id 的資料字段,需要将此資料傳回前端,前端才能繼續支付。
是以,在後端接收到微信伺服器的傳回資料後,需要進行相應的處理,最終傳回到前端如下資料:
appid 不需多說 timeStamp 目前時間戳 nonceStr 随機字元串 package 就是上面提到的 prepay_id,不過切記格式如 “prepay_id= prepay_id_item“。否則會導緻錯誤。 signType 加密方式,一般應該是 MD5 paySign 對以上資料進行相應處理并加密。
到這裡,後端的支付接口已經完成了接收前端支付請求,并傳回了前端支付所需資料的功能。
前端在接收到傳回資料後,使用 wx.requestPayment() 來請求發起支付。此 API 需要的對象參數各項值就是我們上一步傳回的各個資料。
前端完成支付後,微信伺服器确認支付已經完成。就會向第一步中設定的回調位址發送通知。後端的接收回調接口在接收到通知後,就可以判斷支付是否完成,進而決定後續動作。
需要注意的是,在接收到微信伺服器的回調通知後,根據通知的result_code字段判斷支付是否成功。在接受到成功的通知後,後端需要傳回success資料向微信伺服器告知已得到回調通知。否則微信伺服器會不停的向後端發送消息。另外微信的通知是以XML格式發送的,在接受處理時需要注意。
微信的大概支付流程就是這樣。以下是PHP文法的微信支付類,可以比照上面的步驟介紹,加深了解。在需要支付時,直接傳入參數執行個體化此類再調用類的 pay 方法即可。
以上就是微信支付的相關流程。在理清思路後,流程還是比較清晰和簡單的。重點在于需要注意一些細節問題,例如資料格式,加密方法等。
下面說一下微信小程式退款的具體實作
小程式退款的流程和付款相似,但有一些細節上的不同。
首先退款的步驟通常如下:
使用者前端點選退款按鈕後,後端接收到使用者的退款請求通過商城背景呈現給商戶,商戶确定允許退款後,後端再發起向微信退款接口的請求來請求退款。 後端向微信退款接口發送請求後,得到響應資訊,确定退款是否完成,根據退款是否完成再去進行改變訂單狀态等業務邏輯。
退款的步驟相對微信支付來說比較簡單。
值得注意的有以下兩點:
1.向微信退款接口請求退款後,根據得到的響應是可以直接确定退款是否完成的。不再需要設定專門的回調接口等待微信通知。當然如果需要也是可以在微信商戶平台設定回調接口接受進而接受微信回調的,但并不是必須的。
2.退款請求需要在請求伺服器安裝微信提供的安全證書,也就是說,發起退款請求相比較支付請求在請求時請求方法不能複用,因為微信退款需要攜帶證書的請求,此證書可在申請微信商戶号成功後從微信商戶平台自行下載下傳,Linux下的PHP開發環境的證書隻需要放在網站根目錄的cert檔案夾中即可。其他開發環境可能需要導入操作。
下面講解一下退款的具體步驟
退款請求需要的參數如下(多個參數在支付API請求時也有使用):
小程式 appid。 商戶訂單号 out_trade_no 。退款訂單在支付時生成的訂單号 退款訂單号 out_refund_no 。由後端生成的退款單号,需要保證唯一,因為多個同樣的退款單号隻會退款一次。 總金額 total_fee 。訂單總金額,機關為分。 退款金額 refund_fee 需要退款的金額,機關同樣為分 操作員 op_user_id .與商戶号相同即可 随機字元串 nonce_str 。同支付請求 簽名 sign 。使用上面的所有參數進行相應處理加密生成簽名。(具體處理方式與支付相同,可直接複用。)
退款因為流程與支付大同小異,是以退款的PHP類我選擇了直接繼承支付類,
代碼如下,注意區分退款請求方法postXmlSSLCurl和支付請求方法postXmlCurl的差別,這也就是上文提到的退款需要的雙向證書的使用。
````
我再也不會把自己,愚蠢的交給過去。我的生活和我的想法,從此相隔萬裡。